Bold Banana Agency Platform
- Type label
- internal project
- Status
- in build
- Languages
- PL (default) and EN
- Routes in the router
- 13 — each in both languages
- Off-palette colours
- 0 — the gate blocks them

Goal
The website has to do what we sell: run two languages without duplicating content, hold a single brand system, and refuse anything we could not defend. It is the studio's shop window and its first portfolio project at the same time.
Process
Canon before code: decisions about brand, offer and portfolio rules live in one file, not in two people's heads.
Skeleton: pnpm monorepo, Next.js 15 with the App Router, TypeScript, Tailwind v4 with brand tokens in @theme — no Tailwind config file.
Bilingual from day one: next-intl, Polish as the default, translated URLs (/pl/oferta ↔ /en/services), hreflang and canonical on every page.
Gates before merge: a brand script blocks any off-palette colour, a second one guards the canon version, and typecheck plus a production build have to pass.
Stack
- Next.js 15 (App Router)
- TypeScript
- Tailwind CSS v4
- next-intl 4
- pnpm workspaces
- Vercel
- GitHub
Demonstrated result
- Two languages, one set of content: every page has a translated URL, hreflang and canonical — no duplicates in search.
- The Vercel deployment serves /pl and /en; we verify that by reading the page, not by trusting a status code.
- An off-palette colour cannot enter the repository — a script stops it, not good intentions.
- Accessibility: a skip-to-content link and a focus indicator picked separately for light and dark backgrounds.
Demo
The demo of this project is the page you are standing on. Click anything — it is not a mockup or a recording.
Open the home pageWhere it stands today
Some pages are still drafts. The contact form and enquiry storage arrive in the next session, and boldbanana.agency is bought but deliberately not pointed here yet. The «in build» status comes off when the project meets the definition of done from our canon — not before.
Back to portfolio