AI-native workflow for software teams

Designs your solution.Builds your architecture.Reviews your code.

One workspace for the whole dev loop: requirements, stories, tests, and PR reviews. Orwin participates at every step, never in another tab.

orwin · acme · launch board
Backlog4
Reporting

Bulk CSV export for reports

50/4
bug-12

Fix login redirect loop

20/2
task-14

Speed up board first paint

30/2
Billing

Stripe webhook: subscription events

80/3
In Progress3
task-8

Upgrade to Node 22

30/2
admin-3

Kickoff call with Acme

1/3
Notifications

Email digests for mentions

51/3
Testing3
Auth

OAuth device flow

5run in IDE3/3
Platform

Rate-limit the public API

3run in IDE2/2
Reporting

CSV import for the backlog

3run in IDE2/2
In Review3
Platform

Realtime presence on the board

6passing6/6
Security

Audit log for settings changes

4passing4/4
Security

SAML SSO for orgs

8passing7/7
Done3
Platform

Project groups in sidebar

34/4
task-5

⌘K team switcher

22/2
task-9

Keyboard shortcuts overlay

23/3

Built with Orwin, on Orwin

0stories shipped0%built by Orwin0%test coverage

Works with your stack

GitHub
Cursor
Claude Code
VS Code
Reviews every PR against the requirementsAcceptance criteria linked to test casesFull story context, right in your editor
Step 1 / 8 · Design

Orwin drafts five design documents first

Before any story is written, Orwin produces the Problem, Constraints, Solution, Architecture, and Requirements documents in that order. It runs an AI review on each one and lists the findings, and you choose which findings to apply.

  • Problem, Constraints, Solution, Architecture, Requirements
  • You choose which findings apply, it never rewrites on its own
Five gated docsAI critic reviewYou approve findings
orwin · research
Design documents
2 findings
Design docs
Problem
Constraints
Solution Design
Architecture
Requirements

Solution Design

edited 2m ago

Subscription events arrive at src/webhooks/stripe.ts and are verified against the Stripe-Signature header before any handler runs; an unsigned payload is rejected at the edge. Each event is keyed by its Stripe event id and written to an idempotency table, so a redelivery is a no-op rather than a double charge. Verified events route by type to the customer record.

Review findings

Replay window for the idempotency key is unspecified.

Open

Document the dedupe window on the events table — suggest 24h.

Apply fixDiscuss

Signature check moved ahead of body parsing.

Applied

Applied — unsigned payloads now reject at the edge before parse.

Step 2 / 8 · Plan

Stories are proposed from the requirements

Orwin reads the requirements document and proposes epics and stories, each with acceptance criteria. You approve each one before it goes on the board.

  • Every story links to an epic
  • Re-running updates the stories instead of duplicating them
Epics & storiesAcceptance criteriaIdempotent re-runs
orwin · docs
I've drafted 4 epics and 24 stories based on the solution design and architecture.
244 epics · 24 stories
Discard allApply
Billing8 stories
8 ptsnew

Receive Stripe subscription webhooks, verify them at the edge, and keep our customer records in sync.

Acceptance criteria
Verifies the Stripe-Signature header before parsing the body
Routes customer.subscription.updated to the matching customer record
Treats a replayed event id as a no-op, never a double charge
+ 21 more stories across 4 epics
Looks good.
Added 24 stories to the board.
Step 3 / 8 · Architecture

The architecture is designed before the build

Orwin turns the approved solution design into a clear system architecture: the services, the data flow between them, and the contract at each boundary. Every story is then built against one agreed design instead of an approach improvised per task.

  • Services, data flow, and contracts in one diagram
  • The same architecture every story builds against
Zones & boundariesData-flow contractsAI design review
orwin · acme · architecture
System architecture
Approved
External
Stripe
webhook source
signed
Edge
Webhook handler
verify signature
dedupe by id
Idempotency
events table
verified
Domain
Event router
route by type
upsert
Data
Subscriptions
customer records
Step 4 / 8 · Board

Moving a card starts the work

The kanban board has five columns: Backlog, In Progress, Testing, In Review, Done. Moving a card to Testing drafts the test cases, and moving it to In Review opens the pull request.

  • Backlog, In Progress, Testing, In Review, Done
  • Same result whether you drag the card or move it from your editor
Five-stage pipelineMoves trigger workIDE parity
orwin · acme · launch board
Backlog2
Reporting

Bulk CSV export for reports

50/4
bug-12

Fix login redirect loop

20/2
In Progress2
task-8

Upgrade to Node 22

30/2
admin-3

Kickoff call with Acme

1/3
Testing1
Auth

OAuth device flow

5run in IDE3/3
In Review1
Platform

Realtime presence on the board

6passing6/6
Done3
Platform

Project groups in sidebar

34/4
task-5

⌘K team switcher

22/2
Billing

Stripe webhook: subscription events

8passing3/3
Step 5 / 8 · Build

One command loads a story into your IDE

In your editor, one command pulls the story's acceptance criteria, test cases, and design documents into context. Orwin proposes a technical approach and waits for your approval before writing production code.

  • Works in Cursor, Claude Code, and VS Code
  • You approve the approach before any code is written
Cursor & Claude CodeFull story contextApproach approval
cursor · orwin mcp
+1import { stripe } from "@/lib/stripe";
+2import { db } from "@/lib/db";
+3
+4// Verify the signature, then route subscription events.
+5export async function handleWebhook(req: Request) {
+6 const sig = req.headers.get("stripe-signature");
+7 const event = stripe.webhooks.constructEvent(body, sig, SECRET);
+8
+9 // Replays are a no-op — key each event by its Stripe id.
+10 if (await db.events.has(event.id)) return ok;
+11 await db.events.record(event.id);
+12
+13 if (event.type === "customer.subscription.updated") {
+14 await db.subscriptions.upsert(event.data.object);
+15 }
+16 return new Response("ok", { status: 200 });
+17}
TerminalProblemsOutput
orwin build 2.3
·Pulling story, ACs, design docs, test specs…
git checkout -b feat/2.3-stripe-subscription-events
Design approved · writing src/webhooks/stripe.ts
Card moved to In Progress · PR opened
Step 6 / 8 · Test

Each test case becomes three tests

When a card reaches Testing, Orwin drafts the test cases, and your editor turns each one into a happy path, an edge, and an error test. Coverage reports back to the board.

  • A happy path, edge, and error test per case
  • Insufficient coverage blocks the merge
Happy · edge · errorCoverage gateBoard sync
orwin · acme · testing
2.3Stripe webhook: subscription events
Billing
3
Total
3
Passing
0
Failing
0
Pending
96%
Coverage
passingProvisions the subscription on a valid signature
passingRejects an unsigned payload with 401
passingStays idempotent when an event id is replayed
Coverage96% · 80% to merge
Step 7 / 8 · Review

Opening the pull request runs a review

Opening the pull request runs about ten structured checks, starting with the acceptance criteria. A blocking finding sends the card back to an earlier column.

  • Acceptance criteria checked first
  • Every finding cites a specific file and line
10 structured checksACs verified firstfile:line citations
orwin · review · 2.3
1 blocking issue
feat/2.3-stripe-subscription-events · a1b2c3d
Changes requested
Acceptance criteriaResolved

All three criteria are met and covered by tests.

SecurityResolved

Signature is verified before the body is parsed.

TestsResolved

Happy path, edge, and error cases all present.

ContractsResolved

Matches the Stripe event schema for this version.

DocsSuggestion

Consider a note on the idempotency window.

PerformanceBlocking
Does this handler add latency or load that scales with traffic?

The handler queries the subscription table once per event inside the loop. Batch the lookups or cache by customer id so a burst of events does not fan out into N queries.

src/webhooks/stripe.ts:42 · N+1 query on subscription lookup
+ 4 more checks · 1 blocking finding
Approve & merge
Step 8 / 8 · Done

One card, from first document to merged PR

The same card carried the work from the first design document all the way to a merged pull request.

orwin · acme · done
Stripe webhook: subscription events2.3 · Billing
Merged
Lifecycle
  1. Design5 docs
  2. Plan24 stories
  3. Architecturemapped
  4. Boardtracked
  5. Buildbranch
  6. Test3 · 96%
  7. Review10 checks
  8. Donemerged
Acceptance criteria 3 / 3 met
Verifies the Stripe-Signature header before parsing the body
Routes customer.subscription.updated to the matching customer record
Treats a replayed event id as a no-op, never a double charge
Branch→ main
Pull requestmerged
Coverage96%
Commits12

Pricing built to scale

Generous free tier when we open up. Paid plans as you grow.

Free

$0

For solo devs and trials

  • 1 project
  • 100 stories
  • 500K AI tokens / month
  • 5 members
  • Community support
Request early access
Most popular

Pro

$15/seat/mo

For small teams shipping fast

  • 10 projects
  • 500 stories / project
  • 5M AI tokens / month
  • 15 members
  • GitHub + PR review
  • Priority support
Request early access

Team

$25/seat/mo

For growing orgs

  • Unlimited projects & stories
  • 20M AI tokens / month
  • Unlimited members
  • MCP for IDEs
  • SSO (soon)
  • Dedicated support
Request early access

Innovate with Courage

Orwin is in private pilot. Request early access and we'll reach out as spots open.