Independent product
Korsara, a platform for people who sell what they know
Course platforms usually make you assemble the business from four subscriptions that do not talk to each other. Korsara is my attempt at the version where content, courses, sales funnels, email marketing and payments are one product. I design it, build both halves of it, and run the infrastructure it sits on.
Visit korsara.com- Role
- Everything: design, build, infrastructure
- Status
- Live, in active development
- Front end
- Next.js 16, React 19, Tailwind v4
- Back end
- Django 5.2, DRF, Celery, LangGraph
The product
One workspace, not four tabs
A creator signs in to one dashboard. From there they write and repurpose content, build courses, run sales funnels and email marketing, and take payments — all scoped to a workspace, so running a second brand means switching context rather than starting a new account.

Content
One newsletter becomes a week of content
Writing is the bottleneck for every solo creator, so the content workspace is built around a single source: the newsletter. An outline becomes a draft, the draft becomes a blog post with one click, and from there a pair of LangGraph agents take over — a writer drafts an X thread and a scheduled week of tweets sourced entirely from the newsletter, and a reviewer scores that output against the source before a human approves anything.
- Outline → draft → newsletter → blog post, in one editor, with no separate CMS.
- A writer agent turns the newsletter into an X thread and seven days of tweets (three a day), each drafted in its own voice rather than copy-pasted from the source.
- A reviewer agent scores every batch for faithfulness to the newsletter, flags overstated claims and redundant posts, and surfaces its notes before anything ships.
- Connected X accounts publish through OAuth + PKCE, with tokens encrypted at rest.
Authoring
Building a course is the hard part
Most of the effort went into authoring, because that is where creators actually spend their time. Courses are made of modules and lessons, and lessons are made of blocks, so a lesson can be text, video, or both without the editor needing a special case for every combination.
Video
Upload once, stream anywhere
Video is the part of a course platform that quietly costs the most. A creator uploads one file and expects it to play smoothly for a student on hotel wifi. That means transcoding to adaptive bitrate streams, and it means never making the browser wait for it.
The whole path is event driven. Nothing polls for a transcode to finish; MediaConvert announces it, and the API reacts.
Upload
Creator drops a lesson video in the editor
S3
Original lands in the workspace bucket
MediaConvert
Transcoded into adaptive HLS renditions
EventBridge → SNS
Completion is published, not polled
Webhook
Django marks the lesson ready
CloudFront
Student streams at their bandwidth
Sales
What to sell, and whether it will sell
An offer bundles one or more courses (or a standalone lead magnet) behind a single price and creates the Stripe product for it. Before committing to one, an AI research agent can scan a niche's existing market — gravity, price point, recurring versus one-time — and rank the results against the audience you describe, so “what should I sell” gets an answer from data instead of a guess.
- Offers wrap courses (and, separately, lead magnets) with pricing and Stripe product creation handled automatically.
- Offer research pre-filters by keyword relevance, then re-ranks with an LLM pass blended with each offer's gravity score.
- Every researched offer gets a shortlist, a dismiss list, and a detail view with rebill economics and a gravity trend — not just a name and a number.
Funnels
The funnel a launch actually needs
A sales funnel is a tree of steps — landing pages, split tests, checkouts — with routing that can branch and reconverge. Each landing page is built from sections and elements in a drag-first editor, so a headline or an order form is a block, not a template choice baked in ahead of time.
- Split-test steps route traffic by weight, with pageview, opt-in, sale and order analytics tracked per branch.
- Landing pages are section/element trees; the order form element attaches directly to an offer created upstream in Sales.
- Every step tracks its own stats live in the funnel editor, from first pageview to paid order.
Email marketing
A trigger, a wait, and an email that sends itself
Contacts are organized with lists and tags rather than one flat table, and automations react to both: subscribe someone to the purchasers list, and an automation can wait ten minutes, then send a welcome email — no cron job or manual send required. The same lists and tags are the plumbing a sales funnel taps into: a landing page's checkout can subscribe a buyer and apply a tag in the same step that charges their card.
- Lists group contacts by source or intent; tags mark finer-grained state, like ‘bought the web dev course.’
- Automations are graphs of triggers, waits and actions, editable as a canvas rather than a linear script.
- A funnel step's own settings can subscribe a buyer to a list and apply a tag — email marketing is wired into checkout, not bolted on after.
Students
The half of the product creators never see
Students get their own surface at /learn: their catalogue, their enrolments, and a lesson player with nothing in it but the lesson. The path to get there starts on someone else's landing page — a two-step checkout, then straight into the course, with no separate account-creation step to lose someone at.
Payments
Two directions of money
Money moves two ways here. Creators subscribe to Korsara, and students buy from creators. Those are different Stripe problems: the first is billing, the second is Stripe Connect with connected accounts, and both have to survive webhooks arriving late, twice, or out of order.
- Plans, prices and features are modelled in the database rather than hard-coded against Stripe IDs.
- Every inbound webhook is recorded before it is acted on, so replays are idempotent instead of expensive.
- Connected-account onboarding is part of the product flow, not a support ticket.


Results
One sale, everywhere it should show up
A single test purchase is the best integration test a platform like this has. It has to show up as a pageview and an order on the funnel, a paid enrollment on the course, a triggered automation in email, and a line in the sales overview — the same event, reflected honestly in five different places, because a creator will notice immediately if the numbers disagree.
What I took from it
Owning the whole thing
Building the content, sales and money side of the same product changes what “done” means. A feature isn't finished when the API responds; it's finished when I can walk a newsletter through becoming a blog post, a course, an offer, a funnel and a paying customer without hitting a wall I put there myself.
It is also where I get to use things properly rather than cautiously, and increasingly where I get to treat AI agents as production infrastructure rather than a demo: a reviewer that scores its own writer's output against the source, instead of trusting either one blindly.
Next case study
Real-time precipitation alerts, from forecast to phone
Read itGet in touch
If any of this is the kind of problem you are hiring for, I would like to hear about it.
brkicb1@gmail.com












































