Demonstration.The live app runs on a synthetic seeded community. Sign-ups and client inquiries are switched off — no real data is collected.
Found Teams Open the demo

Own your team.

Tell us once what you can do. When a team needs you, we call.

A nonprofit platform for finding the people you would start a worker cooperative with — and the clients who would hire it.

The premise

A team can sell what an individual can't.

Services work — consulting, development, design, operations, bookkeeping — needs almost no capital. It is gated by credibility and sales capacity, and those are exactly what an individual lacks and a team can manufacture. One developer doing good work alone is a freelancer. Three people with a name, a portfolio and a shared client pipeline are a firm, charging firm rates for the same skills.

What is missing is not the work or the talent. It is the introduction — and a structure that survives the first disagreement.

The mission

Join, start, patronize — in that order.

1Join

Say what you bring and what kind of company you want. Browse and filter real people and real teams, ranked for you with the reasons shown in plain language. Nobody is assigned to anybody: a team exists only once everyone in it has said yes to everyone else.

2Start

Teams begin as a conversation, not a company. Each runs on a cooperative charter — probation, consent decisions, membership shares paid out of earnings rather than cash up front — and can fork, blamelessly and with its lineage recorded, when members want different things.

3Patronize

Formed teams publish fixed-scope, fixed-price offers in a public directory. The platform sets the terms, and rates rise with a team's track record rather than falling in a race to the bottom. Clients hire a team, and the team signs the contract.

What makes it work

The mechanics

Mutual opt-in

The matching engine proposes; people accept or pass. A proposal only becomes a team when everyone invited has answered and enough said yes. The first commitment is a conversation, which costs nothing to say yes to.

A membership ladder

Watch → join a proposal → probationary member → member. Borrowed from a century of cooperative practice: you prove yourself in work, not cash, and the membership share is payable out of your first earnings and refunded at par when you leave.

Blameless forking

Most platforms treat a team splitting as failure. Here it is how a group discovers what it actually is. State the disagreement, name who's moving, keep your rung — and watchers follow both branches until they have a preference.

Watchers are candidates

Following a team without being in it is a first-class role, not lurking. The team sees who is watching, and when it needs a skill a watcher has, the introduction is one click.

Governance you don't have to invent

Most new teams have nobody who has run a cooperative. Three charters ship as defaults — adapted from US worker-cooperative practice — covering decisions by consent, patronage splits, probation, shares and exit.

Explainable matching

Ranking is built from stated preferences about the company you want, skill complementarity and the gaps a team has declared. It can always say why — "wants the same kind of company · fills react · same city" — which a similarity score cannot.

Architecture

What is actually built.

Three independently replaceable layers, joined by contracts rather than by a framework. Only the data layer is treated as permanent.

Web
React + Vite SPA
Typed entirely from the API's published OpenAPI document. Shares no code with the backend, so it can be replaced — or joined by a native client — without touching a line of server logic.
API
Fastify + Drizzle, TypeScript
Owns every rule and knows nothing about a frontend. A pure domain layer — ladder transitions, fork and merge planning, match scoring — is unit-tested in isolation from both HTTP and the database.
Data — the permanent layer
Postgres + pgvector
One explicit, boring schema. Everything that happens is an append-only event, which is what drives activity feeds and notifications.
ConcernDecision
DeploymentOne container serves the API under /api and the built SPA on every other path — same origin, so no CORS, no second service, and nothing to wire together. Runs on Cloud Run and scales to zero when idle.
DatabaseManaged serverless Postgres with the vector extension. Migrations are versioned and applied on boot; the schema is the one thing designed never to be thrown away.
ContractThe API publishes OpenAPI; the web client's types are generated from it. A route that changes shape breaks the build rather than production.
Demo dataA deterministic seeded community — 150 people and twenty teams across six US cities, at every stage of the ladder, including a fork, a merge, shipped portfolios and priced offers. Same seed, same community, every run.
Judgment callsEvery arguable number — probation length, share size, the minimum team size for a public page, the match-score floor — sits in a single config file rather than scattered through the code.
Seams left openPayments and escrow, outbound email, and embeddings are each behind an interface with a local implementation, so a provider can be dropped in without redesign.
Status. This is a demonstration, not a service. The community is synthetic, sign-ups and client inquiries are switched off, and there is no legal entity behind it yet. It exists to show the shape of the product and to test one question: shown a proposed team of complementary strangers, will someone say yes to a conversation?