~/rudransh $ whoami

Rudranshcurious builder · always learning

From first commit to paying customers.

02 · About
Rudransh, smiling, in glasses and a dark kurta
curious builder

Hi, I’m Rudransh.

I’m a curious builder. If something works, I want to know why; if it breaks, I want to know where.

That started with mathematics at IIT Roorkee and building at MDG Space, and it hasn’t stopped. I like owning the whole problem rather than one layer of it: the API, the database, the deploy, the bill at the end of the month, and the person on the other side using it.

I learn by building. Most of what I know about payments, queues, multilingual text or running a server at 2 a.m. came from shipping something and fixing it. The maths stayed with me too: watch the tail, not just the average.

curiousalways learningbuilderowns the whole problem
03 · Products

Built one. Building one.

BuiltMay 2025 – Sep 2026

JASTRO

An astrology report business. Birth details in, a personalised kundali, dasha, numerology or matchmaking report out, sold to individuals and through partner astrologers.

2,500+customers
60,000+reports
12languages
Englishहिन्दीবাংলাमराठीગુજરાતીதமிழ்తెలుగుಕನ್ನಡമലയാളംਪੰਜਾਬੀଓଡ଼ିଆاردو
Visit JASTRO ↗

Business

  • Recurring revenue. Monthly, quarterly and yearly plans with report allowances, renewals and retries on Razorpay.
  • A partner channel. Astrologers sell reports under their own brand, with white-label logos, templates and credits.
  • Sold in person too. Reports print straight from the browser for on-site sales, and stay saved on the device.
  • Reach beyond English. The same report in twelve Indian languages, for customers a single-language product would miss.

Tech

  • Serverless generation. Five report families generated on AWS Lambda behind FastAPI, scaling with demand instead of servers.
  • An async pipeline that agrees with itself. Accepted, running, stored, retrievable and listed in history, kept consistent for every report.
  • One meaning, many scripts. Aliases and normalisation so মহিলা and “female” mean the same thing; speech is transcribed, then translated.
  • Billing state you can trust. Payment, subscription and allowance kept in step through renewals, failed charges and expiry.
BuildingAug 2026 – now

onedash

A platform for Indian D2C brands to launch, run and grow an online store, with AI agents doing the routine work.

draftrevisionbuildreleasepublished

Every store change becomes an immutable release that can retry, roll back or recover.

Visit onedash ↗

Business

  • From questions to a selling store. A merchant describes their audience and look, and gets a designed store from a library of 23 templates.
  • Sell on day one. Catalogue, checkout, payments, COD confirmation, reviews and back-in-stock alerts come built in.
  • Agents that run the routine. Orders, customer care, marketing, ads and catalogue agents that ask before they act, within limits the merchant sets.
  • Growth you can measure. Store analytics with consent built in, on the merchant’s own domain.

Tech

  • Ten services, one gateway. Each business area owns its data; contract-pinned routes stop a mismatched deploy at start-up.
  • Releases you can undo. Publishing with automatic retry, rollback and recovery, proven end to end on AWS before launch.
  • Durable AI workflows. Long model jobs split, checkpointed and idempotent, so a failure never repeats paid work.
  • Our own GPU models. Open video and image models self-hosted behind an OpenAI-compatible API.
04 · Projects

Everything else.

2026AI runtimeDurable AI jobs and agents inside onedashPython · PostgreSQL · SQSBuilding

The part of onedash that runs AI. A merchant asks for something in chat; an agent turns it into a command, waits for approval when the action matters, and hands long model work to a durable workflow that survives failures.

Problem

Model calls are slow, cost money and sometimes fail halfway. A retry that pays for the same generation twice, or an agent that changes a live store without asking, is a bug the merchant pays for.

How it works
  • Chat to command. Every request becomes an agent command with a receipt, so there is always a record of what was asked and what was done.
  • Approvals. The merchant approves each action, or gives a standing approval for a kind of action within limits they set.
  • Durable workflows. Long jobs are split into parallel parts, each kept under the provider’s 120-second timeout.
  • No repeated paid work. Every run carries an idempotency key and keeps its state in PostgreSQL, so a restart resumes instead of starting over.
  • Queues and audit. Work moves through an outbox to SQS workers, and every step writes audit events.
Chat messagemerchant asks
→
Agent commandwith a receipt
→
Approvalask or standing
→
Workflow rundurable job
→
Resultaudit events
My part

Designed the runtime across checkpoints CP-09 to CP-19 in Sep 2026, each closed with a handover and an audit, then wrote the services, the skill catalogue and the tests.

Outcome

Running on onedash staging behind the editor’s chat and the store agents.

139unit tests
16integration tests
14live API checks
32skills at launch
Built with
PythonPostgreSQLSQSAWS ECSself-hosted models
2026Streaming Wasserstein DROThesis on robust inventory control under changing demandOptimisation · PythonResearch

My master’s thesis at IIT Roorkee, supervised by Prof. S. K. Gupta: how much stock to order when demand keeps changing and the past is only a rough guide to the future.

Problem

Classic inventory policies assume demand follows a known distribution. When demand drifts or jumps, a policy fitted to the average does fine on typical days and badly on the worst ones, which is where stockouts and write-offs come from.

How it works
  • Learn from a window. A rolling window of recent demand forms the empirical distribution D̂t, updated every period.
  • Guard the neighbourhood. The order minimises the worst expected cost over every distribution within a Wasserstein distance εt of that window.
  • Shrink with evidence. The radius falls as data grows, εt = ε0 / √|D̂t|, so the policy is cautious early and confident later.
  • Stress tests. Simulated against three adversarial shifts: ambiguous growth, push shocks and contaminated demand, compared with a non-robust baseline.
xt+1 = xt + qt − dt  ·  εt = ε0 / √|D̂t|
My part

The formulation, the streaming algorithm, the simulation code and every experiment.

Outcome

Tail cost (P95) fell in all three settings for a small rise in mean cost: robustness costs a little on an average day and saves a lot on a bad one.

−7.73%P95 cost, ambiguous growth
−5.44%P95 cost, push shocks
−2.21%P95 cost, contaminated demand
+1.3–2.2%mean cost, same settings
Built with
Pythonconvex optimisationsimulationstatistics
2024HelpAIHealthcare assistant with a knowledge graph and crisis detectionPython · Flask · Neo4jMDG Space

A healthcare assistant built at MDG Space with Ananya Krishnan: one chat window with three specialist bots behind it, for first aid, mental health and general diagnosis.

Problem

People look up symptoms, first aid or mental-health help in a hurry and get generic search results. And a message that signals a crisis should reach a person who can help, not just a chatbot reply.

How it works
  • First aid. TF-IDF matching over a curated set of first-aid answers.
  • Mental health. Sentence embeddings (all-mpnet-base-v2) match each message to an intent; when a message signals distress, Twilio alerts a close contact’s phone.
  • Diagnosis. A medical knowledge graph in Neo4j. Aho-Corasick dictionaries find diseases, symptoms and departments in the question, a classifier picks the question type (cause, symptom, treatment, prevention, who is at risk) and a graph query answers it.
  • The app. A Flask server, Firebase sign-in, and chat sessions saved with timestamps.
My part

Built it with Ananya Krishnan, across the three bots, the knowledge graph and the server.

Outcome

A working assistant that answers from a graph instead of guessing, and escalates distress to a real person.

2,675graph nodes
8,257graph edges
0.93F1, crisis classifier
98.1%150-query benchmark
Built with
PythonFlaskNeo4jSentence TransformersTF-IDFTwilioFirebaseJavaScript
2024RAG chatbotAsk questions of your own PDFsTypeScript · Python · WeaviateProject

Upload your documents, ask questions in chat, and get answers drawn from the pages themselves instead of from what a model happens to remember.

Problem

A general chatbot answers from its training data, not from your documents, and it makes things up with confidence when it doesn’t know.

How it works
  • Sign-in. Firebase Auth; every API call carries a token checked by the Firebase Admin SDK.
  • Indexing. PDFs go to Firebase Storage; their text is extracted page by page and indexed in Weaviate with the title, owner and page number.
  • Answering. A question becomes a vector search over that user’s documents only, and the closest passages go to a Groq-hosted model.
  • Honest fallback. If nothing close enough is found, or the question is unclear, it says so instead of guessing.
  • Housekeeping. Deleting a document removes the file and its vectors; chats are kept as sessions.
My part

Built it end to end: the React frontend, the Python API, indexing and retrieval.

Outcome

Answers grounded in the user’s own pages, with each user’s documents kept apart.

Built with
ReactTypeScriptPythonFirebaseWeaviateGroq
2024YouTube transcript generatorPaste a link, get the transcriptTypeScript · FlaskProject

A small tool: paste a YouTube link and get the whole transcript as plain text, ready to read, search or paste into notes.

Problem

Getting what was said in a long video means scrubbing through it or copying captions line by line.

How it works
  • Frontend. React, TypeScript and Tailwind, one screen.
  • API. A Flask endpoint reads the video ID from both youtube.com and youtu.be links and fetches the captions.
  • Clear errors. An invalid link, a video with captions turned off and any other failure each get their own message.
My part

Both halves, frontend and backend.

Outcome

Transcripts of long talks and lectures in seconds.

Built with
ReactTypeScriptViteTailwindPythonFlask
2024WordleThe word game, with your own wordsTypeScript · ReactProject

Wordle rebuilt in React, with one addition: players can add their own five-letter words to the pool.

Problem

A small exercise in game state that has to agree everywhere: the guesses, the colour of each letter, and the keyboard.

How it works
  • Grid. Six guesses, each letter scored green, yellow or grey, with repeated letters handled correctly.
  • Keyboard. Keys take the best colour known for that letter so far.
  • Custom words. New words are checked for exactly five letters, A to Z, before they join the pool.
My part

All of it.

Outcome

A playable game that friends could load with their own words.

Built with
ReactTypeScriptViteTailwind
2024Ovarian cancer classificationConvolutional network on medical imagesPython · CNNProject

An image classifier that sorts ovarian cancer tissue images into subtypes. My first computer-vision project.

Problem

The subtype guides treatment, and reading slides takes a specialist’s time. Slide images are huge, stained differently from lab to lab, and some subtypes are rare.

How it works
  • Tiles. Large slide images cut into tiles, keeping only those with tissue.
  • Model. A pretrained convolutional network fine-tuned on the tiles, with flips, rotations and colour changes so stain differences don’t fool it.
  • Imbalance. Class weights so rare subtypes count.
  • Per image. Tile predictions combined into one answer per image.
My part

The whole pipeline: preprocessing, training and evaluation.

Outcome

A reported accuracy of 88.45%.

Built with
PythonPyTorchCNNOpenCV
2023Optiver: Trading at the CloseKaggle competition on closing-auction price movesPython · MLProject

A Kaggle competition run by Optiver: predict how Nasdaq-listed stocks move during the closing auction, the last ten minutes that set each day’s closing price.

Problem

Closing prices matter to everyone who trades, and the auction is short and noisy. The task: predict each stock’s move against an index over the next 60 seconds, from the order book and the auction book.

How it works
  • Features. Order imbalance, bid and ask sizes, weighted prices, spreads, and how each changed over recent seconds, per stock.
  • Models. Gradient-boosted trees.
  • Validation. Split by time, never at random, so the model never sees the future it is predicting.
My part

Feature engineering, models and validation.

Outcome

A weighted MAE of 0.0735, and a lasting habit of checking for leakage first.

Built with
PythonpandasLightGBMNumPy
2022KavatchSafety against gender-based violenceJava · AndroidMDG Space

An Android app for personal safety, built at MDG Space in late 2022: help is one hard shake away, even when there is no time to unlock the phone and find a button.

Problem

In an emergency, opening an app and navigating menus takes time a person may not have.

How it works
  • Shake to open. A background service watches the accelerometer; a hard shake, over twice the force of gravity, brings the app forward at once.
  • Starts with the phone. It runs again after a restart, so protection doesn’t depend on remembering to open it.
  • Evidence. Camera and microphone access to record what is happening.
  • Help and information. Emergency, Help, Information and Services screens for helplines and next steps.
My part

Wrote the app in Java with another MDG member: the shake-detection service, navigation and screens.

Outcome

A working prototype, and the first time I wrote software for a real safety problem.

Built with
JavaAndroid SDKsensorscamera
MDGTrendoraFashion matching with computer visionPython · CNN · YOLOMDG Space

Upload a photo of an outfit and find pieces that look like it, or go with it.

Problem

People see a look they like but can’t name the pieces, and text search doesn’t work for style.

How it works
  • Find the items. YOLO detects and crops each piece of clothing in the photo.
  • Describe the style. A CNN turns each crop into an embedding of its colour, pattern and cut.
  • Match. Nearest-neighbour search finds similar pieces, and pairs seen in complete outfits suggest what goes together.
My part

The detection and embedding pipeline.

Outcome

A prototype that turns a photo into a set of matching pieces.

Built with
PythonYOLOCNNPyTorch
MDGC++ code visualizerSee your code run, step by stepC++ · competitive programmingMDG Space

A tool for competitive programmers that runs C++ one line at a time and shows what each line does to variables, arrays and the call stack.

Problem

When a solution fails on a hidden test, most people debug with print statements. Watching the state change line by line finds the bug faster, and makes recursion and data structures easier to learn.

How it works
  • Trace. The program is compiled with debug information and stepped through a debugger, recording variables and stack frames at every step.
  • Replay. The steps can be played forwards and backwards, with the current line highlighted.
  • Draw. Arrays and recursive calls are drawn as they change.
My part

The execution tracer and the step-by-step view.

Outcome

A visual debugger for contest-style programs.

Built with
C++GDBJavaScript
AlsoExplorationsResearch and proposals that didn’t become productsVariousExploration

Questions I followed far enough to learn something, without turning them into products.

Media generation

Compared image and video generation providers on quality, speed and cost, and the post-processing an output needs before anyone can use it.

Transfusion support

A concept note, prepared with a transfusion-medicine professor, on software to support transfusion decisions: what data it would need, where it could help clinicians, and where it must not decide for them.

Maths evaluation

Image-based mathematics problems, such as maximum flow on directed networks, written to test whether a model can read a diagram and solve it correctly.

05 · How I build

From zero, step by step.

Beyond the code

pricingunit economicschannelspositioninghiring
  1. Find the one loop

    The smallest thing someone would use, or pay for.

  2. Ship it early

    Put it in front of real people before it feels finished.

  3. Turn it into a system

    Split by ownership: each part owns its data and has one way in.

  4. Make it pay

    Plans, pricing and billing designed with the product, not after it.

  5. Prove it on real infrastructure

    Done means it works, rolls back and recovers where users actually are.

  6. Run it and write it down

    Measure, watch, and record every incident and every release.

  7. Grow the team

    Hire, hand over, and keep the standards written.

06 · How I debug

From symptom to proof.

  1. 01

    Symptom

    What is wrong, for whom, and since when.

  2. 02

    Investigation

    Reproduce it, then follow the data, one change at a time.

  3. 03

    Cause

    The root cause, not the trigger.

  4. 04

    Change

    The smallest fix that removes the cause.

  5. 05

    Verification

    The old way fails, the new way holds, and the test stays.

07 · Stack

Languages, systems, clouds.

Languages

PythonGoRustJavaJavaScriptTypeScriptDartSQL

Frontend and mobile

ReactNext.jsFlutterAndroidThree.js

Backend

FastAPIDjangoFlaskNode.jsREST APIs

Data

PostgreSQLMongoDBFirebaseValkey / RedisWeaviateNoSQL

Cloud

AWSGCPAzureLambdaECSSQSCloudFrontCognito

DevOps

DockerKubernetesAWS CDKCI/CDLinux

Architecture

MicroservicesEvent-drivenOutbox + queuesServerlessMulti-tenant SaaSDurable workflows

AI systems

Agent workflowsRAGFastMCPStrands SDKKnowledge graphsSelf-hosted models
08 · Journey

How I got here.

  1. Started at IIT Roorkee

    BS–MS in Mathematics and Computing: operations research, statistics, optimisation and a lot of programming.

  2. Part of MDG Space

    The campus software development group, from my first semester until I graduated. What I built there:

    • Kavatch, a safety app against gender-based violence.
    • HelpAI, a healthcare assistant with a knowledge graph and crisis detection.
    • Trendora, a fashion-matching platform using CNNs and YOLO.
    • A code visualizer that shows C++ running step by step, for competitive programming.
  3. Into machine learning

    A Kaggle competition on market data and a CNN on medical images, alongside the ML work at MDG Space.

  4. SDE intern at Amazon

    • Agent workflows with Strands SDK and FastMCP.
    • Intent routing, so each kind of request reached the right workflow.
    • Agent benchmarks to compare behaviour across changes.
    • Document ingestion, chunking, indexing and retrieval for agent context.
  5. Started JASTRO

    One form, one generated PDF. The decision to build a product instead of another project.

  6. Began the thesis

    Robust inventory control under changing demand, supervised by Prof. S. K. Gupta.

  7. JASTRO starts charging

    Subscriptions on Razorpay, and the first lessons in keeping payments, plans and allowances in agreement.

  8. Graduated

    BS–MS Mathematics and Computing, IIT Roorkee, GPA 8.212.

  9. Started onedash

    A first commit on a new platform for Indian D2C brands.

09 · Outside tech

Off the clock

Video games

Football

Badminton

Table tennis

Formula 1

10 · Next

The next one,
from zero.

Case file · Built · May 2025 – Sep 2026

JASTRO

Problem

People want a personal astrology report from their birth details, in their own language, without waiting for an astrologer. Partner astrologers want to sell those reports under their own brand. The product had to generate them reliably, charge for them, and stay up.

What I built

Report generation on AWS Lambda behind a FastAPI backend, OTP sign-in, async jobs with history, Razorpay subscriptions with report allowances, a white-label partner admin, invoices, and printing straight from the browser.

Who used it

Individuals buying reports for themselves and their families, partner astrologers selling under their own name, and sellers printing reports on the spot for walk-in customers.

My part

Everything from the first commit: the product, the backend, billing, operations, and later hiring the team and handing work over.

How it grew

19 May 2025
The first loop: a React form sending birth details to a report backend, ending in a downloadable PDF.
Mid 2025
Report families on Lambda behind FastAPI: kundali, dasha, numerology, matchmaking and more. OTP sign-in with Cognito, cookies and Valkey over TLS. Async jobs with progress and history.
2025
Reports saved in the browser, printing through QZ Tray, and an admin for credits, white labelling and templates.
Late 2025
Razorpay subscriptions: monthly, quarterly and yearly plans with report allowances, renewals, retries and expiry. Invoices as PDFs.
2026
More languages and speech input, production operations, a growing team, partner channels and a store.

Architecture

Customer web appReact
Partner and admin panelcredits · templates · logos
Print stationbrowser · QZ Tray
↓
FastAPI backendOTP sign-in · Cognito · cookies · Valkey sessions over TLS
↓
Report generatorsAWS Lambda · one per family
BillingRazorpay · webhooks · scheduled jobs
Text generationOpenAI-backed dasha writing
↓
MongoDBusers · orders · plans · report history
S3report PDFs · invoices

The API stays small and fast; heavy work runs on Lambda, so a busy evening means more Lambda runs instead of a bigger server. Sessions live in Valkey so sign-in survives a restart, and every report and invoice ends up as a file on S3 that the history points to.

A report’s life

Accepted
→
Running
→
Progress
→
Stored
→
Retrievable
→
In history
  • Accepted. The request is checked, the allowance or credit is reserved, and a job ID comes back at once.
  • Running and progress. The generator runs on Lambda; the app polls the job and shows progress instead of a frozen screen.
  • Stored and retrievable. The PDF lands on S3 and the job returns a link.
  • In history. The report appears in the user’s history, so it can be found again on any device.

The hardest bug. One recorded failure returned a finished report link while the user’s history stayed empty: two steps that should be one. Every state above has to agree, and the fix was to make the history record part of the same step that hands out the link, so a report can’t exist without being listed.

Payments and subscriptions

  • Plans. Monthly, quarterly and yearly subscriptions, each with an allowance of reports per period.
  • Renewals and retries. Razorpay renews the plan; a failed charge is retried before the plan expires, and the allowance follows the payment, not the other way round.
  • Payment links. One-off purchases and partner top-ups paid by link.
  • Webhooks and scheduled jobs. Payment events update the subscription; scheduled jobs catch anything a webhook missed, and expire what should expire.
  • Edge cases that bit. Duplicate plan IDs, gateway timeouts that left a payment unknown, and renewals that arrived before the previous period closed.

The rule I ended with: payment state, subscription state and the allowance a user can spend are three views of one fact, and every change has to move all three or none.

Partners and white label

  • Selling under their brand. Partner astrologers sell reports with their own logo and templates.
  • Credits. Partners buy credits; each report uses one, and the admin tracks balances and report counts per customer.
  • Control. The admin sets each customer’s status, plan and limits.
  • Templates. Layers, categories and validation, so a partner’s template can’t produce a broken report.

Delivery and printing

  • Saved on the device. Reports are stored in the browser with Dexie, so a seller can reopen them without downloading again.
  • One-click printing. QZ Tray prints straight to the shop printer, for reports sold in person.
  • Invoices. Generated as PDFs with WeasyPrint and PyMuPDF, amounts written in words with num2words, and stored on S3.

Many languages

The same meaning arrives in different scripts and labels. A dasha report once failed on the Bengali word মহিলা (woman) because the generator expected “female”. The fix was aliases and normalisation, so every language maps to one value before generation, and the report is written back out in the customer’s language.

  • Input. Names, places and options accepted in every supported language and normalised to one internal form.
  • Output. The whole report rendered in the customer’s language and script, with fonts that support it.
  • Speech. Hindi and Urdu speech is transcribed first and translated second, keeping speaker turns.

Running it

IncidentWhat happenedWhat changed
Disk pressureThe server’s root disk reached about 96%Volume grown from 20 GB to 60 GB; cleanup and alerts added
Lambda releasesThe production alias was left on an earlier versionAlias moved as part of every release, then checked
MongoDB outageThe database stopped after a failed diagnostics (FTDC) writeRepaired, with disk and diagnostics settings reviewed
CORS failuresMissing or duplicate origin headers broke the appOne owner for CORS headers; preflight handled once
CertificatesTLS renewals with certbot needed watchingRenewal automated and checked
Overlapping jobsScheduled jobs could run on top of each othercron jobs wrapped in flock so only one runs at a time
PackagingNative libraries for PDF generation (libgobject) missing in the Lambda runtimeLibraries bundled with the function

Each one was written down with its cause and the change, so the next person didn’t have to rediscover it.

Team and business

  • Hiring. Hired for product design, AI product and frontend roles, and brought on interns.
  • Handovers. Wrote handover notes so work could change hands without breaking.
  • Channels. Direct customers, partner astrologers, in-person sales, and a gemstone channel model.
  • AI customer care. An assistant answering common customer questions.
  • Store. A store inside the product for related products.

What I learned

  • States must agree. Most serious bugs were two records disagreeing: a report and its history, a payment and its plan.
  • Billing is product. Plans, allowances and renewals shape what customers feel as much as any screen.
  • Operations are part of the build. Disks fill, certificates expire, aliases drift; write it down and automate it.
  • Language is more than translation. One meaning, many scripts; normalise first.
Case file · Building · Aug 2026 – now

onedash

Problem

Indian D2C brands need a store that looks like theirs, sells on day one and keeps improving, without hiring a developer. Generic builders give everyone the same template and leave the growing to the merchant.

What I’m building

A merchant answers a few questions and gets a designed store, edits it with an AI assistant, publishes to their own domain, sells, and reads the results in one place, with agents doing the routine work.

Who it’s for

Small and growing Indian brands selling online: clothing, beauty, food, home, and anything else that ships in a box.

My part

The platform architecture and most of the backend, the release process to AWS, and the product, working with a team that designs the stores.

How it’s growing

10 Aug
First commit of a new backend with its own sign-in, billing, admin and data.
5 Sep
First commit of the merchant app.
18 – 25 Sep
AI runtime architecture; checkpoints CP-09 to CP-19, each closed with a handover and an audit.
1 – 3 Oct
CP-20: a real publish, a second release, rollback, recovery and unpublish over HTTPS.
14 Oct
Staging live in AWS Mumbai.
17 – 30 Oct
Selling, store templates and design, analytics with consent, the editor, self-hosted models.
Nov
Production on onedash.si.

What merchants get

Set up

  • A few questions about the brand, audience and look.
  • A designed store from the template library, in the brand’s colours and fonts.
  • Products by hand or from a Shopify CSV, photos included.

Edit

  • Chat with an assistant that changes the store.
  • Page tabs, comments and version history.
  • Every part of every template is an editable block.

Sell

  • Catalogue, search, cart and checkout.
  • Online payments, and cash on delivery confirmed with a code.
  • Reviews, back-in-stock alerts and abandoned-checkout detection.

Grow

  • Store analytics with consent built in.
  • A Microsoft Clarity connection per store.
  • Agents for orders, customer care, marketing, ads and the catalogue.

Architecture

Merchant appNext.js
Admin appoperators
Published storesCloudFront · site worker
↓
Platform gatewaythe one public entry · firewall paths from route manifests · contract pins
↓
builder
commercial
payments
notifications
connections
marketing
agents
ai
toolkit
video editor
↓
PostgreSQLschema per owner · one table per migration
Outbox → SQS → workerssite builds · dispatch · retries
  • Owners. Each service owns one business area and its data; nobody reads another service’s tables.
  • One way in. The gateway is the only public entry. Each service declares its routes in a manifest, and the firewall’s allowed paths are generated from those manifests.
  • Contract pins. Each route pins the hash of the contract it calls, so a mismatched deploy stops at start-up instead of failing in front of a merchant.
  • Data. PostgreSQL with a schema per owner. Every migration creates or changes exactly one table; 387 of them so far.
  • Events. Changes write to an outbox in the same transaction; SQS carries them to workers that build sites, send messages and retry.
  • Infrastructure. AWS CDK stacks for foundation, identity and runtime in ap-south-1: ECS services, CloudFront, Cognito.

The schema rebuild. The early migrations had grown tangled, so I rebuilt the history as one file per table and proved the new baseline produces a byte-identical schema to the old one before switching.

Publishing

Publishfirst release
→
Republishsecond release
→
Retryfailed build
→
Roll backto the last good one
→
Recoverafter a crash
→
Unpublishclean up

Every store change becomes an immutable release, built by a worker and served from the CDN. I didn’t call publishing done until one run on an isolated AWS account went through every path above over real HTTPS in 117 API calls, and every temporary resource was cleaned up afterwards.

Agents and models

  • Agents that ask. Store agents prepare actions and wait for the merchant’s approval, or act within standing limits the merchant sets.
  • Durable jobs. Long model work runs as checkpointed, idempotent workflows, so a failure never repeats paid work.
  • Our own GPU. Open video and image models self-hosted on one L4 GPU behind an OpenAI-compatible API: LTX-Video makes a 5-second clip in about 25 seconds, SDXL-Lightning an image in about 5.
  • Studio. Product photos, banners and short videos made inside the app.

Store design

  • Stores that don’t look alike. A design system that varies layout, type and colour by store kind, checked so random stores never repeat a layout.
  • Templates from real stores. Stores designed by the team became templates, with every UI part rebuilt as an editable block.
  • AI that writes stores. A model writes a store as HTML and CSS; a converter turns it into blocks the merchant can edit.
  • Fast, safe pages. The publishing blocks are written by hand and tested byte for byte against the React versions, and they run under a strict content security policy.

The editor

  • Layout. A chat column beside the live page, with page tabs.
  • Working together. Comments on any part of the page, and version history to go back.
  • Commands. “/” for actions and “@” to point at a part of the page.
  • Tests. 593 tests on the editor alone.

How I keep it safe

  • Checkpoints. Work moves in numbered checkpoints, each closed with a handover note and an audit.
  • Proof before done. A feature is done when it works on real infrastructure, rolls back and recovers, not when it passes locally.
  • Contracts. Services agree through pinned contracts, so a breaking change is caught before it ships.
  • Written down. Every release and every incident is recorded.

Ship log

ship.log · onedash staging · newest first
31 Oct ✓ Shopify CSV import; product listing fields; Studio workflows
30 Oct ✓ self-hosted video and image models on one GPU; Products and Collections; shop assistant rework
29 Oct ✓ shop analytics, Analytics tab, Clarity connector, AI credits
27 Oct ✓ “/” and “@” commands in chat; Tasks redesign
25 Oct ✓ team-designed stores as templates; hand-written publishing blocks; checkout
23 Oct ✓ brands, payment webhooks, first selling deploy; site editor
21 Oct ✓ shop engine, checkout, search, reviews, shopping assistant
17 Oct ✓ schema rebuilt, one file per table; store setup, Studio, Products
14 Oct ✓ staging live: foundation, identity and runtime stacks; video editor

What’s next

  • Production. onedash.si going live for the first merchants.
  • Experiments. A/B tests on store pages, measured in the analytics merchants already have.
  • Market intelligence. What competitors advertise and where, inside Analytics and Marketing.
  • Return on ad spend. Connecting ads, store and orders so every rupee of spend can be traced to sales.