Skip to content
← All work

Case study · 2026 · Co-builder

Signal

Most good jobs are never posted where you’d look. Signal finds them and keeps the feed quiet.

Signal turns 50–70 unstructured hiring signals a day (screenshots, pasted text, links) into schema-validated jobs, then ranks them against your résumé. It serves 100+ concurrent users and is live at getsig.in.

Daily intake
50–70 signals → validated jobs
Concurrency
100+ users
Feed latency
≈60% lower
Live
getsig.in

The problem

Real openings are scattered across screenshots, group chats and posts that expire in days. Job boards are noisy and stale. The interesting part is that the input is messy and the output has to be trustworthy.

So the system has two jobs that pull against each other: be generous in what it ingests, and strict in what it publishes.

How it’s built

A pipeline with a gate in the middle: probabilistic on the left, deterministic on the right.

validembedSignalsscreenshots · linksExtractionOCR · LLMSchema gatevalidate or bouncePostgresjobs · pgvectorWorkersCelery · RabbitMQBYOK gateway5 model providersRankingsmaterialised per userFeed APIGo · FastAPI · RedisWeb appReact · TypeScriptExtensionautofill · Easy Apply

Scroll the diagram sideways →

Ingestion is asynchronous
Distributed workers do the slow, flaky work off the request path, so a bad screenshot never blocks the feed.
Recommendations are precomputed
Résumé and job embeddings feed materialised rankings, with real-time action signals layered on top. The feed is a read, not a computation.
A bring-your-own-key gateway
One interface over Gemini, Groq, OpenAI, OpenRouter and Anthropic, so users spend their own tokens and the product’s costs stay flat.
The abuse surface is guarded
Encrypted résumé storage, and Cloudflare Turnstile in front of anything a bot would want.

Decisions that cost something

01

Schema, or it doesn’t ship.

LLM extraction is probabilistic; the feed can’t be. Every signal has to validate against a schema before it becomes a job.

The costSome real jobs get bounced for review. The feed stays trustworthy.

02

Move work off the request path.

Distributed workers and Redis caching take the expensive work out of the read path. That’s where the ≈60% drop in feed latency came from.

The costMore moving parts to run and observe.

03

Let users bring their own key.

A BYOK gateway keeps unit economics flat as usage grows and gives users the choice of model.

The costFive providers’ quirks to keep abstracted.

What went wrong, and what it taught me

From a quiet internal tool to a product.

Signal started as an admin-only ingestion tool. Turning it into something that 100+ people can use at once meant rebuilding the hot path around precomputation and caching, then adding the parts that make a job feed useful rather than merely long: embeddings-based best-match, bookmarks, application tracking, and a browser extension that fills the forms for you.

Stack & links

GoFastAPIReactTypeScriptPostgreSQL + pgvectorRedisRabbitMQCelery