TikTok Shop Video Generator
Turn any viral TikTok video into an ad for your own product in one click. For TikTok Shop sellers and affiliates — no filming, no editing. Free to try.
The AI-powered social lead engine disguised as a link-in-bio. Zero-setup conversational capture pages that turn social traffic into a real pipeline.
MarketingTypeScript · AstroGitHub @robsonperassoliOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Conversational lead capture for social creators and businesses.
Taken from the repository README
Loading the full README.
Read the full README ↗Monorepo for the inbound.click platform: marketing site, Hono API, SPA dashboard, SSR bio renderer, and shared UI.
| App | Path | Port | Role |
|---|---|---|---|
| Website | apps/website | 4321 | Astro marketing site (inbound.click, Fly.io) |
| API | apps/api | 8787 | Hono + Drizzle + SQLite |
| Dashboard | apps/dashboard | 3000 | Vite SPA |
| Bio | apps/bio | 3001 | TanStack Start SSR (s.uper.bio/<username>) |
@inbound/shared — Zod schemas, themes, UUIDv7 helper@inbound/ui — shared UserPage and bio primitives@inbound/config — shared TypeScript configsInstall mise and enable its shell hook. Then:
mise trust
mise install
cp .env.example .env.local
pnpm install
pnpm db:generate
pnpm db:migrate
pnpm db:seed
pnpm dev
Fill secrets in .env.local (gitignored). Mise loads that file into the shell. If you already have a root .env, mv .env .env.local.
Config lives in apps/api (tinybird.config.json). Local Tinybird runs in Docker via the Tinybird CLI (tb). Install it if needed, then:
pnpm tb:start
tb token copy "admin [email protected]"
Put the copied token in both:
.env.local — used by the API at runtimeapps/api/.env.local — used by the Tinybird CLI (next to tinybird.config.json)TINYBIRD_URL=http://localhost:7181
TINYBIRD_TOKEN=<token from above>
Sync datasources and pipes (watch mode):
pnpm tinybird:dev
Then run the apps as usual with pnpm dev.
Production: set TINYBIRD_URL / TINYBIRD_TOKEN on the Railway api service. Pipes deploy during that service's build (pnpm --filter @inbound/api release = tinybird deploy && tsup). SQLite migrations run in a one-shot process at start (node dist/migrate.js && node dist/index.js) because the volume is only mounted at runtime. Do not use a Railway pre-deploy command.
Railway api commands:
pnpm install --frozen-lockfile && pnpm --filter @inbound/api releasepnpm --filter @inbound/api start:prodUsed for avatar/background uploads via S3-compatible presigned URLs. Fill the B2_* vars from .env.example — create a public bucket, an application key scoped to it, and keep B2_ENDPOINT / B2_REGION / B2_PUBLIC_URL on the same region.
The dashboard uploads from the browser, so apply CORS on the bucket (CLI required — upload rules aren’t fully available in the web UI):
# brew install b2-tools
b2 account authorize
b2 bucket update --cors-rules '[
{
"corsRuleName": "dashboardUpload",
"allowedOrigins": ["http://localhost:3000"],
"allowedHeaders": ["*"],
"allowedOperations": ["s3_put", "s3_get", "s3_head"],
"exposeHeaders": ["ETag"],
"maxAgeSeconds": 3600
}
]' <bucket-name> allPublic
For staging/production, add the dashboard origin(s) to allowedOrigins.
For Stripe webhooks (ngrok required — localhost can’t be a Stripe endpoint):
pnpm dev:webhooks
Webhook URL: https://factual-worm-mostly.ngrok-free.app/webhooks/stripe
In the Stripe Dashboard → Developers → Webhooks endpoint, select these events (the API mirrors customers and subscriptions from them):
customer.createdcustomer.updatedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedOr tunnel alone while pnpm dev is already up:
pnpm stripe:tunnel
/public/* — profiles, links, form sessions/auth/* — WorkOS login/callback/logout/webhooks/stripe, /webhooks/workos (provider callbacks)/me, /profiles, /links, /forms, /threads, /uploads, /billing, /analytics, /support, /team, /invitations, /system, etc. (no version prefix)/internal/cron/* — bearer CRON_SECRET (see Production notes)Railway layout (project Inbound Platform): api (Hono + SQLite volume at /data, 1 replica), dashboard (Vite SPA), bio (TanStack Start SSR), cron (curl → API every 5m). Object uploads stay on Backblaze B2 (B2_*); do not use a Railway bucket for media. The marketing site is not on Railway — it stays on Fly.io (inbound-website, https://inbound.click). Deploy from the repo root with pnpm deploy:website (fly deploy . --config apps/website/fly.toml --dockerfile apps/website/Dockerfile).
RAILPACK_NODE_VERSION=24.SQLITE_PATH=/data/inbound.sqlite on the API service. Relative SQLITE_PATH / MIGRATIONS_PATH resolve against process.cwd() (apps/api under pnpm --filter).pnpm --filter @inbound/api build emits ESM to apps/api/dist/ via tsup (local/turbo). Railway build is pnpm --filter @inbound/api release (tinybird deploy && tsup). Start is pnpm --filter @inbound/api start:prod (node dist/migrate.js && node dist/index.js). Local dev still uses tsx. Leave Railway pre-deploy empty — volumes are not mounted there.pnpm --filter @inbound/dashboard build → static apps/dashboard/dist; production start is serve -s dist (SPA fallback).https://s.uper.bio/<username>pnpm --filter @inbound/website build → static apps/website/dist, served by nginx on Fly.io. Always deploy from the repo root (pnpm deploy:website); do not cd apps/website && fly deploy.NODE_ENV=development): the API process runs an in-process interval (every 60s) that calls the same close logic — no manual curl needed.POST /internal/cron/auto-close-threads). The API does not schedule itself; until a scheduler calls it, idle sessions stay open.CRON_SECRET on the API service (required in every environment — local .env.local included; see .env.example).*/5 * * * * (UTC; Railway minimum is 5 minutes).curl -fsS -X POST -H "Authorization: Bearer $CRON_SECRET" "$API_URL/internal/cron/auto-close-threads"CRON_SECRETAPI_URL