Inspiration

allin is a knowledge app centered around debates, feeds, and curated content. The original web was built on Nuxt 3 + Firebase — functional, but limited: two locales (EN/VI), a static
6-slide landing page, and no real connection to the app's content ecosystem.

As the product grew, we needed the web to do more than just exist. Every shared link from the app should bring someone back — to read, to watch, to download. The website needed to
become a conversion layer, not a brochure. allin Web Legacy: https://allin-application.com/ allin Web New: https://allin-website-v2-admin-65512288s-projects.vercel.app/


What it does

The new allin web is rebuilt from the ground up to:

  • Serve as a landing and growth platform — showcasing the product and driving app installs
  • Render live app content — debates and feeds are accessible directly on the web
  • Support deep-link sharing — every debate or post has a shareable web URL that bridges discovery into app conversion
  • Expand reach with three locales (Vietnamese, English)
  • Optimize SEO and metadata per page for organic acquisition

How we built it

Old stack: Nuxt 3 (Vue), Firebase, Cloudflare Edge, EN + VI

New stack:

  • Framework: Next.js (App Router) with React Server Components for SSR/SSG
  • Backend: Supabase — replacing Firebase — with real-time data, auth, and storage
  • State: Zustand + TanStack React Query for client-side sync
  • i18n: next-intl with prefix-based routing (/vi, /en) — default now Vietnamese, with EN added
  • Animations: Motion + @use-gesture/react for interactive phone mockups and carousels
  • Tooling: ESLint, Prettier, Husky — enforced code quality from commit

Architecture follows a clean separation:

$$
\text{Supabase (content)} \rightarrow \text{Next.js RSC (render)} \rightarrow \text{User} \rightarrow \text{App install}
$$


Challenges we ran into

  • Framework migration: Full rewrite from Vue (Nuxt) to React (Next.js) — different mental models, different routing, different state patterns
  • Locale routing change: Moved from no_prefix (Nuxt default) to explicit prefix paths (/vi, /en) without breaking existing links
  • Deep link flow: Making web debate pages redirect correctly into the native app across iOS and Android
  • Backend swap: Migrating from Firebase to Supabase while maintaining data shape and auth behavior
  • Performance balance: Rich animations and interactive mockups on landing vs. fast initial load

Accomplishments we're proud of

  • Full stack rebuilt in a hackathon sprint — framework, backend, and design all replaced
  • Debate and feed pages now render live app content on the web
  • Smooth, animated landing with interactive phone mockup showcasing real features
  • Enforced code quality with Husky hooks so the codebase stays clean under fast iteration

What we learned

  • Migrating frameworks mid-product is painful but worth it if the old stack is a ceiling
  • Vietnamese as the default locale matters — it reflects where our users actually are
  • RSC (React Server Components) genuinely simplifies SEO and first-load performance
  • A web page that renders real content converts better than any static landing slide

What's next

  • Personalized share pages — OG metadata per debate/post for rich previews on social
  • Analytics funnel: View → Engage → Install → Retain — tracked end-to-end (PostHog)
  • Expand locales further as allin grows into new markets

Built With

  • nextjs
Share this project:

Updates