AI product

Posting was never the hard part.

indyrect turns work you've already done into posts worth reviewing. Most of the decisions that mattered were about what it refuses to do.

Role
Product, design, build
Built with
Cloudflare Workers · Postgres · Fly.io
Status
Live, mid-pivot
indyrect
The problem
People who build things rarely post about it, because turning rough notes into something a stranger understands takes effort.
What I built
An AI workspace that turns rough notes, screenshots and voice notes into finished posts.
The result
It's live at indyrect.pages.dev, and it works without any Meta API access.

How I built it

The problem

Builders ship every week and say almost nothing.

Founders and makers ship, decide and learn things every week, and almost none of it becomes something anyone else sees. The usual diagnosis is that posting is hard.

It isn't. Pressing publish takes a second. The effort goes into turning a commit message or a half-written note into something a stranger would understand. That is the part indyrect is for.

What I got wrong first

It started as an Instagram manager.

The first version was an autonomous Instagram content manager. That tied the whole product to Meta approving a public app, and that is a queue an early product cannot control.

Before going further, I read a funded competitor's shipped JavaScript instead of their marketing. Roughly 2.7MB of production code, and zero hits for carousels, scheduling or publishing. They analyse reels you have already shot. They never post anything for you.

So the gap was in making the finished asset. Posting it was the easy end. In September 2026 I repositioned indyrect as a creative workspace: rough notes, screenshots and voice notes in, finished assets out. Instagram is now one output, and the product no longer depends on it.

$ grep -c carousel      bundles/*.js   0
$ grep -c autoPublish   bundles/*.js   0
$ grep -c scheduler     bundles/*.js   0
$ grep -c generateImage bundles/*.js   0
A funded competitor's production code, about 2.7MB of it.

What I built

I wrote a checker that looks at the page.

Generated design has a recognisable look: default indigo, emoji icons, invented statistics. I ported OpenDesign's craft rules into every generation and left their trademarked systems out.

Their linter reads HTML source, and that couldn't catch my actual failures. Half of what indyrect makes is a fixed-size panel, where a long headline runs off the edge instead of wrapping. So my checker measures the rendered page in the browser.

  • Measures the rendered result

    It finds overlapping text, content outside its frame and rules the parser rejected. It measures geometry, because regex can't see any of that.

  • Rules where a model would invent

    The status summary is rules-based on purpose. Ask a model to summarise flat numbers and it invents momentum.

  • Carousels in the browser, reels on Fly

    Workers can't run a browser or ffmpeg, so each format renders where it can.

  • Platform-neutral from the schema up

    Workspaces, artifacts and memory never assumed Instagram. That is why the pivot was cheap.

indyrect, live landing and example posts

What is not done yet

The pivot is half shipped.

Listed here so you can weigh the rest of this page against it.

  • The live landing page still talks about posting. The workspace positioning is decided but isn't on the site yet.
  • Sketch to design, the part meant to set indyrect apart, does not exist yet. The plan was image-to-image on Workers AI. I tested every available model, and none of them actually use the input image, so it needs another route.
  • Instagram publishing works. It now sits behind a Launch step as one channel, where it used to be the centre of the product.
Work with me