See every TikTok repost on any public profile.
No login. No API key. No notification to the account you're checking.
Paste any public TikTok handle → Repostify opens the profile as an anonymous visitor, walks the reposts tab, and lays every repost out as a playable grid with stats, top-amplified creators, and one-click in-browser video playback.
The reposts tab is where someone's taste actually lives. Likes are noise. Posts are performance. Reposts are what they wanted their followers to see. This tool flattens that feed into a single page you can scan in seconds.
Per-profile view: header, full stats row, top-creators leaderboard, repost grid.
Counts how many times each original creator appears in the feed, ranked.
Click any cover → full-screen overlay with TikTok's embed player + caption, stats, position counter, and prev/next nav.
- Profile overview — Avatar, bio, follower / following / hearts pulled from the public page rehydration script.
- Repost grid — 9:16 cover thumbnails with duration badge, original creator handle, play overlay, and per-video engagement stats.
- Inline player — TikTok embed iframe + detail panel. Scroll wheel, arrow keys, j/k, or the buttons to navigate.
- Aggregate stats — Total plays, likes, comments, shares, and unique creators across the captured batch.
- Top creators leaderboard — Frequency-ranked list of every original creator with horizontal bar chart.
- Caption filter — Type a word (
fyp,lol,edit) to filter the grid live. Toggle between fuzzy substring and exact-word match. Top extracted hashtags suggested. - Fetch-limit selector — Hidden in a popover behind the search bar gear: 30 / 60 / 120 / 250 / All.
- Bot-detection bypass — Uses cloakbrowser (stealth Chromium with source-level C++ fingerprint patches) instead of stock Playwright, so TikTok serves the full repost feed instead of cutting off at the captcha gate.
- Direct-cursor pagination — After the first XHR fires, subsequent pages are fetched via the captured URL template, not by scrolling. Roughly 35% faster on big feeds.
- In-memory result cache — 10 min TTL per
(handle, limit). Repeat lookups instant. - Image proxy — TikTok blocks hotlinks; all thumbnails route through
/api/imgwith the Referer header set. - SEO — Dynamic per-handle metadata, JSON-LD (
WebApplication,FAQPage,BreadcrumbList,Article), sitemap with curated popular handles,robots.txt.
- Cloakbrowser launches a stealth Chromium (binary-level fingerprint patches, undetectable as automation).
- Navigates to
https://www.tiktok.com/@<handle>. - Dismisses the cookie banner via shadow-DOM traversal.
- Parses
__UNIVERSAL_DATA_FOR_REHYDRATION__for profile + initial repost list. - Finds the Reposts tab by
role="tab"text match, clicks it. - Captures the first
/api/repost/item_list/XHR as a URL template. - Paginates: each subsequent call hits the same URL with an updated cursor via
page.evaluate(fetch)(TikTok's own fetch interceptor signs the request). - Detects captcha / private-tab / server-block signals, bails fast.
- Normalizes, dedupes, sorts by recency.
No login. No undocumented API. The data is everything TikTok would show any anonymous visitor.
| Layer | Choice |
|---|---|
| Framework | Next.js 16.2.6 (App Router, Turbopack, React Compiler) |
| Runtime | React 19 |
| Styling | Tailwind CSS v4 with @theme inline |
| Components | shadcn/ui |
| Animation | motion (Framer Motion v12) |
| Scraping | cloakbrowser (stealth Chromium, Playwright API) |
| Icons | lucide-react |
| Fonts | Inter + Instrument Serif (via next/font) |
| Language | TypeScript 5 |
| Package manager | pnpm |
pnpm install
pnpm devFirst boot downloads the cloakbrowser binary (~200 MB, cached in ~/.cloakbrowser/).
Open http://localhost:3000. Paste a handle, pick a fetch limit, hit Analyze.
pnpm build
pnpm startDEBUG_TIKTOK=1 pnpm devDumps the raw first XHR response, full page HTML, and a viewport screenshot into .debug/ for each scrape.
GET /api/reposts?username=<handle>&limit=<n>
| Param | Notes |
|---|---|
username |
Required. TikTok handle without @. |
limit |
Optional integer. Omit or 0 = no cap. Max 2000. |
Returns:
{
username: string;
profile: { nickname, avatar, verified, bio, followers, following, likes } | null;
reposts: Repost[];
hasMore: boolean;
captchaSuspected: boolean;
fetchedAt: number;
}src/
├── app/
│ ├── page.tsx # Home: hero + search + FAQ + CTA
│ ├── u/[username]/ # Per-handle result page (auto-scrapes on load)
│ ├── about/, guide/, privacy/
│ ├── api/
│ │ ├── reposts/ # GET /api/reposts (the scraper endpoint)
│ │ ├── img/ # Image proxy (24 h cache, domain-whitelisted)
│ │ └── video/ # Video proxy fallback (mostly unused)
│ ├── sitemap.ts # Static routes + popular handles
│ └── robots.ts # Disallows /api/
├── components/
│ ├── repost-search.tsx # Main client component: state machine + UI
│ ├── repost-card.tsx # Thumbnail card
│ ├── repost-player.tsx # Full-screen overlay player
│ ├── brand.tsx # LogoMark, PrimaryButton, GuideLines, BackgroundVideo
│ └── ui/ # shadcn primitives
├── lib/
│ ├── tiktok.ts # Scraper core (~700 lines)
│ ├── seo.ts # Site constants + popular-handle list
│ ├── format.ts # Number / time formatters
│ └── utils.ts # cn()
└── instrumentation.ts # Next.js boot hook: pre-warms cloakbrowser
- Private reposts tabs — Many accounts hide it. That's a TikTok setting; can't bypass without auth.
- Repost timestamps — TikTok's anonymous endpoint exposes only the original video's createTime, not when the user reposted it. Order in the feed (most-recent-first) is the only repost-recency signal.
- Big feeds are slow — 500+ items can take 2-3 min. TikTok server is the bottleneck. Pick a smaller fetch limit if you only need the recent.
- Read-only — No write ops, no logged-in sessions, no DM-anyone weirdness.
- Vercel won't run this — Needs persistent server (cloakbrowser binary launch). Render, Fly, Railway, VPS all work.
MIT. Not affiliated with or endorsed by TikTok or ByteDance.




