Project 01 · Eskwelabs Innovation Fellowship

Thought Leader Drafter

Generates long-form articles in a specific author's voice using their own writing as style references.

Role
AI Solution Dev
Year
2026 · Phase 2
Status
Stakeholder gated
Type
Case study
Next.js 16TypeScriptTailwind CSS v4shadcn/uiSupabaseLangChainOpenAIAnthropicGoogle GenAIZustandReact Query
esk-tl-drafter-web.vercel.app
Thought Leader Drafter home dashboard
01Problem

Executives and thought leaders need to publish long-form content regularly. Each article eats 4 to 8 hours. Off-the-shelf AI tools and ghostwriters both fail at the same thing: voice. The output sounds smart but generic. It doesn't sound like the person.

The specific stakeholder for this project was the Eskwelabs CEO. The tool needed to produce drafts that actually sounded like him, using his past writing as the anchor.

02What it does

Users go through a 4-stage writing pipeline:

  1. 01
    Brainstorm
    Generates 3 structured article angles to pick from.
  2. 02
    Outline
    Builds a structure based on the chosen angle.
  3. 03
    Draft
    Writes the full article.
  4. 04
    Final Output
    Polishes for delivery.

Each stage has editable text blocks and pulls in the user's writing samples as a few-shot style reference. There's a writing samples library where users upload PDFs of their past articles, the system extracts and cleans the text, and selected samples get associated with the active session.

The tool also has an A/B comparison mode that generates two variants side-by-side: one using the writing samples, one without. This is the fastest way to verify the style transfer is actually doing something. Plus model switching across OpenAI, Anthropic, and Google, and per-session token and cost tracking.

esk-tl-drafter-web.vercel.app/session
The 4-stage writing pipeline UI
Fig. 1 — Writing pipeline
esk-tl-drafter-web.vercel.app/session/output
Final draft output with A/B variants
Fig. 2 — Draft output
03My contributions

I inherited a Phase 1 MVP and owned Phase 2. Three main pieces:

01

Writing samples library and pipeline integration

I built the upload and extraction flow, the SampleGrid and SampleList UI, and the system that ties selected samples to a writing session. The samples get injected directly into the LangChain system prompt as voice references. No semantic search, no embeddings. Just full text.

02

A/B voice comparison

I conceptualized and built this from scratch. The trick was avoiding two parallel LLM calls, which would have doubled the cost and the wait time. Instead, the prompt asks the model to return both variants in one response, separated by strict delimiters (===VARIANT:WITH_SAMPLES===). The backend slices on the delimiter and ships both to the UI. I also overhauled StepContent.tsx to handle side-by-side editing.

03

AI pipeline refactoring

I extracted the prompt management logic into its own module and tuned the pipeline to handle large style injections (3 to 5 full articles in a system prompt) without breaking output. I also used Zod schemas via LangChain's .withStructuredOutput() to force the brainstorming step to return exactly 3 properly-formatted angles. This way downstream stages got predictable input instead of having to parse a text blob.

I also did a UI/UX overhaul on session cards, dashboards, dialogs, step indicators, and markdown rendering. AI was the headline, but the frontend needed work too.

04The architectural call worth talking about

RAG vs full text injection. The default move for “use these documents as references” is to chunk them, embed them, and retrieve the most relevant chunks at runtime. We didn't do that. We injected the full raw text of 3 to 5 sample articles directly into the system prompt.

The reasoning: voice replication isn't really a retrieval problem. It's about giving the model enough connected, in-context style data that it can pattern-match the rhythm, sentence structure, and word choice. Chunked semantic retrieval scatters that. Full text preserves it. Modern context windows are big enough that this is no longer a memory problem, it's a strategy choice.

It worked. The A/B comparison made the difference visible. Variants with samples sounded recognizably like the author. Variants without sounded like generic AI prose.

05Skills shown

Full-stack React architecture with multi-step state management, prompt engineering for few-shot style transfer, LangChain pipelines with structured outputs, Supabase schema design and live data migration, UI/UX implementation with Tailwind and shadcn.