Case study
From idea to published LinkedIn postThe AI pipeline behind Nadya
Nadya reads the AI newsletters you don't have time for, then turns any story into a finished LinkedIn post in your own voice. We built both halves: the ingestion pipeline that runs every hour without a human in it, and the studio that writes, illustrates, schedules and publishes.
- Client
- Nadya
- Industry
- AI content marketing
- Scope
- Full product, feed and studio
- Stack
- React, Supabase, Deno, n8n
- Guardrails
- Consent gates, auto-pause, refunds
The challenge
Keeping up with AI is a full-time job, and so is posting about it
Anyone building in AI has the same two problems. The first is input: the field moves faster than anyone can read, so the inbox fills with newsletters that all cover the same ten stories, and the same announcement arrives five times with five different headlines. The second is output: knowing what to say is only the start, and writing it, illustrating it, scheduling it and answering the comments quietly eats the week. Most people solve both by giving up on one of them.
The automated answer is easy to describe and hard to build well. An AI that summarises a newsletter also happily summarises the sponsorship block. An AI that writes a post in your voice also invents a statistic to make the hook land. And an AI that publishes under a real person's name, on the network where that person's professional reputation lives, cannot be allowed to fail quietly or run away with itself. Nadya needed both halves to be genuinely reliable before either was worth shipping.
What we did
One model per job, and a hard line at every point it could invent something
The feed reads the newsletters. Every hour a workflow picks up the labelled inbox, and an extraction agent splits each issue into individual articles: a title rewritten in its own words, a summary of no more than three sentences, categories, and the real article link rather than a tracking pixel, a CDN path or a sponsor's homepage. Each article is then embedded and checked against the last seven days: anything within a cosine similarity of 0.85 of an existing story is folded into it rather than added, and the count of how many newsletters covered it becomes a signal of how big the story is. Around 85 articles land a day, roughly one in eight is caught as a repeat, and every one is translated into Croatian, Bosnian and Serbian-Latin by prompts written for those languages specifically, with a protected glossary of terms that must stay in English.
The studio writes the posts. A user's brand brief, their role, audience, themes, tone of voice and the list of things they never want mentioned, is assembled with a writing style and a goal into the system prompt, so the draft comes back sounding like them rather than like a model. They choose a source, a feed article, any URL, a single sentence or a blank page, and a depth: quick, or deep research that reads the page and searches the live web before writing. The rules against invention are in the prompt and they are absolute: every fact, number, name and quote has to come from the source material or the search results, and nothing may be copied more than ten words at a stretch. The post comes back as structured data with a title and an image brief, the image is generated from that brief in one of nine styles, and from there it is edited inline, scheduled, and published to LinkedIn by a scheduler that claims each due post exactly once.
Deliverables
What we built
Two products on one backend: a marketing site, a single-page app, 20 serverless functions, around 30 database routines and an automation workspace that has run continuously since March.
- 01
The hourly ingestion pipeline
Inbox to feed with nobody in the loop: 92 newsletter sources, 2,956 emails processed and 15,603 articles extracted so far. An unknown sender creates an unverified source rather than dropping the email, and every failure routes to one shared error handler.
- 02
Semantic de-duplication
Each article carries an embedding of its title and summary. A pgvector similarity check against the previous seven days folds the same story told by five newsletters into one entry with a coverage count, instead of five entries that read alike.
- 03
The feed itself
Thirteen categories, per-user personalisation over categories and sources, favourites, full-text search, four card layouts, adjustable reading size, light and dark, four languages and an installable progressive web app.
- 04
The post studio
A create-post wizard, a block editor with slash commands and a live LinkedIn preview, nine image styles, inline AI editing, a media library, a schedule calendar and a brand profile the AI can draft from the user's own website.
- 05
Autopilot and its guardrails
Rules that pick articles by category and source and generate posts on a schedule, fully automatic or held for approval, under explicit consent, at most three posts a day, four hours apart, never twice from the same article, and pausing itself after two failures, on empty credits or on a disconnected account.
- 06
The credit ledger and billing
Prices live in the database, so the interface can show the real cost of an action before it is spent. Plan credits and top-ups are tracked separately, Stripe handles subscriptions and one-off packs, and only four privileged database functions can move a balance.
The engine
What makes the AI trustworthy
Six models across two providers, each chosen for one job and its cost: a small model to extract articles, embeddings to spot repeats, a cheap model to translate, a strong model to write and research, a fast one for inline edits, and an image model for the picture.
The extraction is specified, not hopeful
The agent is told exactly what an article link is and what it is not: reject image URLs, CDN paths, bare homepages, sponsorship blocks and subscription-confirmation links; prefer the longest, most specific URL; rewrite the title in your own words; never open with "This article examines". The output is validated against a schema before it reaches the database.
The same story five times is one story
De-duplication is semantic rather than textual, so two different headlines about the same launch collapse into one item even though they share no wording. The number of newsletters that covered it is kept and shown, which turns the duplicate problem into a relevance signal.
Nothing is invented, in any language
Post generation is bounded by explicit anti-invention rules, and deep research grounds every claim in the source page or a live search result. Translation is held to the same standard from the other direction: prompts written for Croatian and for Serbian separately, a glossary of around 60 terms that must stay in English, and worked examples of the right and wrong rendering.
Autonomy with a seatbelt
An AI publishing under someone's own name gets consent gates, a daily cap, a minimum gap, no reuse of a source, and automatic pausing the moment anything goes wrong. LinkedIn tokens are encrypted and kept in a table the browser physically cannot reach, every user-supplied URL is checked against a guard that refuses private addresses, and a generation that fails or stalls refunds its credits by itself.
Results
Where it stands
Nadya is in early access and hasn't published commercial figures, so there are none here. What there is, is six months of a pipeline running on its own and a studio built around never being caught making something up.
What changed
- The feed has run continuously since March 2026: 92 newsletter sources, around 85 articles a day, 15,603 articles ingested and 27,047 translations stored, with no human step anywhere in the loop.
- Roughly one article in eight is caught as a repeat and folded into the story it duplicates, so the same announcement is read once rather than five times.
- Every article is available in English, Croatian, Bosnian and Serbian-Latin, translated by prompts written for those languages rather than a generic one.
- A post goes from a feed article, a link or a single sentence to a finished draft with an image, in the user's own voice, with a scheduled publishing time.
- Every AI action shows what it will cost before it is spent, and anything that fails or stalls returns the credits automatically.
- With no LinkedIn account connected the product still works end to end: the user copies the finished post and marks it published, rather than being blocked at onboarding.
- The reply inbox is built and deliberately shipped switched off, because the LinkedIn permission it needs is closed to new applications. When it opens, it is a flag away.
- Written to a specification before it was written in code, with row-level security on every table, no API key ever reachable from the browser, and a round-trip test that proves the editor and the publisher agree on the text character for character.
Reach us
How about a free audit?
Tell us a little about your business and where time gets lost. We'll come back with what's worth automating first.
What to expect
Confirmation email
01You'll receive an immediate confirmation with next steps.
Response within 24 hours
02A team member will reach out within one business day.
Discovery call
0330-minute conversation about your goals and challenges.
No obligation
04Exploratory conversations carry no commitment.