Skip to content
Bryan Brkic
All work

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.

Creator dashboard
The Korsara creator dashboard showing plan options with pricing tiers and a sidebar of workspace sections.
The dashboard a creator lands on: workspaces, plans, and every module below sits behind one navigation rail.

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.
Newsletter · Outline
The Korsara newsletter outline tab with fields for topic, hook, desired outcome and timeframe.
Outline tab: a topic, a hook, a desired outcome and a timeframe planned before a word of the newsletter gets written.
Newsletter · Editor
The Korsara newsletter editor showing a block-based writing surface.
The newsletter editor, written block by block from that outline.
Blog · Editor
The Korsara blog editor showing the newsletter content carried over into a blog post.
One click turns the newsletter into a blog post in the same block editor — no rewriting, no second CMS.
Public blog
The public-facing Korsara blog overview page listing published posts.
The public blog that post lands on, at the creator's own domain.
Social · X threads
The Korsara X threads list for a workspace's content.
Every AI-drafted X thread lives here, each tied back to the newsletter it came from.
Social · Generating
A Korsara X thread generation in progress, with a status message reading 'Writing and reviewing.'
A writer agent drafting the thread from the newsletter — writing and reviewing usually finishes in under a minute.
Social · Finalized
A finished and approved Korsara X thread broken into individually editable posts.
The finished thread, approved and broken into individually editable posts.
Social · X tweets
The Korsara standalone X tweets list.
The same newsletter also seeds a week of standalone tweets — three a day, in a distinct voice from the thread.
Social · Generated
A completed batch of AI-generated tweets sourced from a newsletter, shown as individually editable posts.
A finished batch: seven days of tweets, still editable before anything is scheduled.
Social · AI review
AI review notes scoring a batch of tweets 6.2 out of 10 and flagging an overstated claim and redundant posts.
The reviewer agent's own notes on a batch it scored 6.2/10 — an overstated claim, two tweets making the same point twice, a paragraph landing as a downer out of sequence. Nothing goes out without clearing this pass.
01 / 10

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.

Course creation
The Korsara course creation screen with fields for title, description and pricing tier.
Course setup, before any content exists.
Modules & lessons
A Korsara course with modules and a lesson added inside one of them.
Modules hold lessons; a course can be one module or a dozen.
Lesson editor
An empty Korsara lesson editor prompting to add a text or video block.
An empty lesson: content is added as blocks, not chosen from a template.
Lesson editor
The Korsara lesson editor with a video block added directly below a text block.
A video block added below a text block — a lesson mixes both freely.
Upload complete
The Korsara lesson editor after a video upload has finished processing.
The editor once the upload has finished processing and the lesson is ready to publish.
Lesson preview
A preview of a Korsara lesson with both text and video blocks, as a student would see it.
Previewing the lesson as a student will see it: text and video blocks, in order.
01 / 06

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.

  1. Upload

    Creator drops a lesson video in the editor

  2. S3

    Original lands in the workspace bucket

  3. MediaConvert

    Transcoded into adaptive HLS renditions

  4. EventBridge → SNS

    Completion is published, not polled

  5. Webhook

    Django marks the lesson ready

  6. CloudFront

    Student streams at their bandwidth

Lesson video pipeline — upload to playable HLS

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.
Offers
The Korsara offers list for a workspace.
Every offer in the workspace, in one table.
Creating an offer
Creating a $97 offer for a web development course in Korsara.
Creating the first offer: a $97 web development course, bundled and priced.
Offer research
Creating an AI offer research request for the fitness niche.
Describing a niche and an audience — busy professionals who want to get fit but don't have a lot of time for the gym.
Offer research
A Korsara offer research run in progress for the fitness niche.
The research agent pulling and ranking live market data for that niche.
Offer research
Twenty fitness offers ranked by gravity, price and recurring status.
Twenty ranked fitness offers, sorted by gravity, with price and one-time-vs-recurring called out.
Offer detail
The detail view of a researched offer showing rebill economics and a gravity trend.
One offer's detail view: rebill economics and a gravity trend, not just a name and a number.
01 / 06

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.
Sales funnels
The Korsara sales funnels list with a newly created web development course launch funnel.
The web development course launch funnel, freshly created.
Funnel editor
A 50/50 split test step as the first step of a Korsara sales funnel, with two branches converging on a thank-you page.
A 50/50 split test as the first step, with a landing page on each branch converging on one thank-you page.
Funnel editor
The web development course offer attached to the left branch's landing page step.
The $97 offer from Sales, attached to the left branch's landing page.
Landing page editor
Editing a headline element inside a single-column section of a Korsara landing page.
Building the landing page one element at a time — here, a headline in a single-column section.
Landing page preview
A preview of the finished landing page, with a headline, sub-headline and order form on a white background.
The landing page rendered for a visitor: light and product-focused, nothing like the dark creator dashboard behind it.
Thank-you page
The thank-you page step inside the Korsara landing page editor.
The thank-you page, still inside the same tree, still its own step with its own route.
Thank-you page
A preview of the finished thank-you page a buyer sees after paying.
What a buyer sees immediately after paying.
01 / 07

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.
Email · Lists
Two email lists in Korsara: a master list and a purchasers list.
Two lists for this launch: a master list and a purchasers list.
Email · Tags
A tag created in Korsara for web development course purchasers.
A tag scoped to this course's buyers, for automations and segmentation that lists alone can't express.
Automations
A newly created course purchase automation in Korsara.
A new automation, named for exactly what it does: react to a course purchase.
Automation · Trigger
An automation trigger set to fire when a contact subscribes to the purchasers list.
The trigger: subscribing to the purchasers list, set to run once per contact.
Automation · Wait
A wait step in a Korsara automation set to hold for 10 minutes.
A ten-minute wait between the trigger and the send, so the welcome email doesn't land mid-checkout.
Automation · Email
Editing the content of an automated email in Korsara.
Writing the email that goes out once the wait clears.
Funnel × Email
A funnel landing page step configured to subscribe buyers to two email lists and apply a tag on purchase.
The same automation wired to checkout: this landing page step subscribes a buyer to both lists and applies the tag the moment they pay.
01 / 07

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.

Checkout · Step 1
Step one of a two-step checkout on a Korsara landing page, collecting name and email against an order summary.
Step one of checkout on the funnel's landing page: contact info, against an order summary showing exactly what's included.
Checkout · Step 2
Step two of a two-step checkout on a Korsara landing page, collecting payment information.
Step two: payment, still on the same page, still the buyer's only account action.
Enrolled
A second Korsara account showing the web development course newly enrolled after purchase.
The moment it clears: the course shows up enrolled, on a second account used to buy it end to end.
Lesson player
The first lesson of a newly purchased course, showing both text and video blocks.
The first lesson, text and video blocks together, exactly as the creator built it.
01 / 04

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.
Billing
The Korsara billing screen showing invoices and subscription details.
Billing and invoices for the creator's own subscription.
Payouts
The Korsara payments setup screen confirming a connected Stripe account.
Stripe Connect onboarding, finished.

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.

Funnel stats
The sales funnels overview updated with visitor, opt-in, sale and order counts after a purchase.
The funnel overview, updated: two unique visitors, one opt-in, one sale, one order.
Funnel orders
The orders tab of a Korsara sales funnel showing the individual order just placed.
The same funnel's orders tab, down to the individual order.
Funnel analytics
A sales funnel's stats tab showing earnings per click, upfront and recurring sales, average cart value, and a per-step breakdown of views, opt-ins, sales and earnings per view.
The funnel's own Stats tab, one level deeper: earnings per click, average cart value, and views, opt-ins and earnings broken down step by step — Sales Page #1 converted, Sales Page #2 never got the traffic.
Course stats
The course overview showing an updated enrollment count and revenue after a purchase.
The course itself now shows one paid enrollment and the revenue it produced.
Email stats
The email marketing overview reflecting stats updated by the automation that fired.
Email marketing's overview, reflecting the automation that fired on purchase.
Sales overview
The sales overview dashboard showing total revenue, net revenue, leads and orders.
And the sales overview, tying it together: revenue, leads and orders in one snapshot.
01 / 06

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 it

Get 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