Molochou
← All work

Kollaba

Where designers and developers find each other for side projects. Designed, built and shipped solo.

PlatformDesign & engineering2026kollaba.appCase study

You post a project, name the role you are missing and the experience it needs. People apply, you accept, and an accepted application opens a chat. Not a job board and not a freelance marketplace: no rates, no invoices, no client-and-contractor framing.

Year
2026
Role
Everything: design, front-end, data model, moderation
Scope
UI/UX · web app · mobile · logo · branding
Stack
Next.js 16 · Supabase · Cloudflare R2 · Resend

Theproblem

Everyone who wants to build something on the side stalls in the same place. A designer has an idea and no engineer; an engineer has free evenings and nothing worth designing. Job boards are useless, because nobody is hiring. Freelance marketplaces are worse: they assume one side pays the other, which is exactly the relationship a side project does not have.

WhatIdid

Say what it is not, first
01

Say what it is not, first

The landing spends its first line ruling things out: no job boards, no freelancing, just collaboration. The product only works if people arrive with the right expectation, and the wrong expectation is the default one: everybody assumes money changes hands.

Search in both directions
02

Search in both directions

Post a project and wait for applications, or open the people catalogue and go looking. Filters are the three things that actually decide a match on a side project: role, experience level, and whether the person is open right now.

03

A feed built for skimming on a phone

Every card carries the cover, the missing role, the stack and who posted it, which is enough to decide in a second whether to open it. An accepted application opens a chat, so the path from “interesting” to “talking” is two taps.

04

The whole product is one button

A project page fits on one screen: cover, stack, the exact role it needs, the team so far, and a single sticky button that says “I want in”. No form, no cover letter, no message to compose. The author gets a notification the same second, and accepting does three things at once: it opens a conversation, adds the person to the team, and closes the loop. Everything else on the platform exists to get somebody to that button.

05

You cannot reach the feed unfinished

Onboarding is three steps: role and skills, then bio and links, then preferences and username. A new account cannot open the feed until all three are done, and that is enforced in the proxy rather than by hiding a link. A matching platform where half the profiles are empty does not match anybody, so the rule belongs where it cannot be walked around.

A blog anyone can write in
06

A blog anyone can write in

Tags, search, cover images, markdown. A platform for finding collaborators needs a reason to come back before you need one, and other people’s build logs are that reason.

07

Buy the platform, build the product

Auth, database, realtime and row-level security come from Supabase; images from R2, bot defence from Turnstile, mail from Resend. None of this product’s value comes from operating a session store or a WebSocket fleet, so none of it was written. Every hour left went into the part that makes the product different rather than the part that makes it exist.

Moderation shipped in the launch commit
08

Moderation shipped in the launch commit

Turnstile on signup, a spam filter on user content, reports and account deletion were all there on day one. A platform with public profiles and open messaging is a spam target immediately; retrofitting moderation means moderating in public while you build the tools.

Underthehood

Authorization in the database, not in the pages

Eleven tables, every one with row-level security. A page that forgets a filter returns nothing instead of returning someone else’s data. On a platform whose content is private messages between strangers, that difference is the whole product.

Five languages wired before the first was needed

Every string in the interface lives in a JSON dictionary, around four hundred keys across English, Russian, Spanish, Portuguese and German. Unused locales are imported dynamically, so carrying five costs the same as carrying one. The product ships in English only. Turning on the rest is a routing change rather than a rewrite, which is the difference between a decision made now and a project scheduled for later.

Five commits of being wrong in public

OAuth broke on redirect: users returned with a valid session and landed on the login page. Behind a proxy the callback derived the wrong origin, so the cookie was written for one host and read from another. Framework defaults describe the machine the framework was tested on, not the one you deploy to.

A cookie that could have been served to everyone

The language switcher writes a cookie, so every page reading it opts out of static rendering. Miss that and the first visitor’s language is baked into a cached page for everyone after. It is a bug that never appears in development, where there is only ever one visitor.

Graphite, one accent, no second theme

Dark only, because the audience already lives there: designers and developers spend the day in dark editors, and a dark canvas reads as native rather than as a setting. Graphite rather than pure black, because black flattens the three stacked greys that carry depth and haloes around light text on OLED. Emerald is the only chromatic colour in the shell and it means one thing, yes: available, accepted, primary. Rare enough to be impossible to miss, and it leaves project covers and avatars as the only other colour on the page. A second theme would have doubled every visual decision and every review, which a product with no users yet cannot afford.

Outcome

ElevenTables under RLS
Five, shipped in EnglishLocales wired
ThreeWays to sign in
Next projectCercanoMessaging