The Build Order is in progress. 📑🛠️
LedgerLine · Engine Build · Stage 2.0 of Step 02 ✅
Scaffolding and infrastructure is done: FastAPI → Postgres on Neon → React/Vite, config-driven, containerized, and live on Cloud Run.
(The spec and pricing posts were the planning phase. This is where code and cloud began.)
Full log below: the decisions, the toolchain, and every bug that cost me time. 🧵
Step 1 done: full specifications + tier structure, written and documented before touching code.
Step 2 starts next — member auth and the ledger database schema. Building the systems, writing the scripts & implementating the logic for the software to power LedgerLine. 🗂️🗃️ #WedDev #coding #SaaS
Cloud Run, containerized, scaling to zero, talking to Neon. That was the Step 1 finish line. ✅💚🍏
The live URL proves all the engineering behind LedgerLine as a client software is foolproof & works. Written, scripted & designed solely by me, AI can make mistakes, the engine will never. #SaaS #WebDev
https://t.co/09Q0jKByqA
The Build Order is in progress. 📑🛠️
LedgerLine · Engine Build · Stage 2.0 of Step 02 ✅
Scaffolding and infrastructure is done: FastAPI → Postgres on Neon → React/Vite, config-driven, containerized, and live on Cloud Run.
(The spec and pricing posts were the planning phase. This is where code and cloud began.)
Full log below: the decisions, the toolchain, and every bug that cost me time. 🧵
Step 1, what actually happened:
Aug 21: scaffold generated Sep 26: cloud billing blocked Oct 2: IDE set up Oct 3: Neon
provisioned Oct 5: first full-stack run.
The gap between the first two dates and the last was provisioning, not engineering.
The URL that proves all the engineering behind LedgerLine's architecture is live, see with your own eyes.
https://t.co/09Q0jKByqA
The Build Order is in progress. 📑🛠️
LedgerLine · Engine Build · Stage 2.0 of Step 02 ✅
Scaffolding and infrastructure is done: FastAPI → Postgres on Neon → React/Vite, config-driven, containerized, and live on Cloud Run.
(The spec and pricing posts were the planning phase. This is where code and cloud began.)
Full log below: the decisions, the toolchain, and every bug that cost me time. 🧵
Milestone 4/4: browser → Vite → FastAPI → Neon, end to end, on one Windows laptop.
Zero product features. 100% of the plumbing. That's Step 1.
#WebDevelopment#SaaS
•The connection panel: switch
connection pooling on, copy the
-pooler string.
Two things to check before you
paste it anywhere: the host contains
-pooler, and the
string ends with
sslmode=require. Everything else in
it is a secret.
•Handling the connection string: it
contains the database password.
It went into a local .env and
nowhere else. Not chats, not
tickets, not git. Production plan:
Secret Manager, because env vars
passed on a command line sit in
shell history
•Why one Neon project per client:
blast radius.
A bad migration, a
runaway query or a dropped table
stays contained to one client. The
tradeoff is slower scaling past
roughly 15 to 20 clients. That's a
good problem to have, and
one I
can solve later.
•Neon connection strings end with
sslmode=require&channel_binding
=require.
TLS is enforced, and
channel binding ties the
authentication to that TLS session.
Keep
both parameters when you
copy the string. Strip them and
you've quietly weakened the
connection.
@neondatabase is a serverless Postgres with compute that scales to zero. The plan: every client gets
their own Neon project.
Isolation by default. A bad migration or a runaway query can't touch another client's data,
and an idle client's database isn't burning compute. Yeah, that's how my client's business databases will be stored.
Per-client project isolation and effortless serverless scaling is quite innovative, I'll be using Neon's Postgres database for the entirety of my project. Prolly scale to multi-tenacy once the software starts doing numbers.
Pretty smart huh, even if I do say so myself? 📃🤓
#DataAnalytics #SaaS
Btw it was my first time using @neondatabase as my PostGres database server, so there were a lot of things I had to learn firsthand on the fly.
•Creating the database. The Neon
wizard choices:
Project:
ledgerline-dev, Postgres only,
Object storage, Functions, AI
gateway, Neon Auth: all OFF
Unused services are surface area,
Postgres alone is everything the
engine needs today.
•Region is a decision, not a default.
Neon's wizard defaulted to AWS US
East 2 (Ohio). I moved it to US East 1
(N. Virginia), the
closest AWS region
to Google's us-east4, where gcloud
will run, which I also had to change
from it's original location
'us-central1', I did this by editing the
region in the final deployment cmd.
By putting my Cloud Run app in
'us-east4, it sits right next to my
Neon database, making the app
noticeably faster without costing
anything extra on the Free Tier,
which I want to remain in. 📑📃
Co-locating the database and the
app is the cheapest performance
win there is.
@neondatabase The shape of the system today:
Browser → React/Vite on :5173 → FastAPI on :8000 → SQLAlchemy → Neon Postgres.
Tomorrow's shape swaps localhost for Cloud Run. The seams between environments are
two env vars: VITE_API_URL and DATABASE_URL.
#SaaS#buildinpublic
Windows PowerShell blocks venv activation scripts by default: "running scripts is disabled
on this system."
One-time fix: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser. Scope it to your user, not the whole machine.
The Windows toolchain behind LedgerLine, verified from PowerShell before I wrote
anything:
python --version node --version git --version gcloud --version. Four CLIs, four version checks. If one fails, you're debugging the wrong problem later.
I just realized it's crazy that while someone's building flying cars I'm busy building client software. 😮💨☹️
IDE choice: Google's Antigravity, a VS Code-family editor with an agent built in, native on
Windows.
Opening the project: File → Open Folder. Not "New Project." The folder owns the repo, not
the IDE.
Elon Musk left South Africa at 17 years old and arrived in Canada with a small bag, a few hundred dollars, and the address of a relative he had never met. The relative was not at the address. The house was empty. His first night in the country he was supposed to build his life in began with a closed door and nowhere to sleep.
He had left South Africa to avoid mandatory military service in the apartheid era army. The choice was serve a government he considered morally bankrupt or leave everything and start over in a country where he knew almost no one. He left. At 17. Alone.
The first months in Canada were spent doing manual labor. He worked at a lumber yard. He shoveled grain. He cleaned boilers at a lumber mill. The boiler cleaning job was described by his cousin as "the most physically disgusting work available" because it involved climbing inside industrial boilers and scraping sludge in confined spaces. He was paid $18 per hour, which was the highest wage he could find, and he took it because the money mattered more than the conditions.
The distance between cleaning industrial boilers at 17 and running 6 companies at 53 is not a metaphor for the American dream. It is a literal account of what a 17 year old was willing to endure to escape a country that offered him nothing but violence at school, indifference at home, and conscription into an army he refused to serve.
He has rarely spoken about the Canada period in detail. The vulnerability is too raw. The story of a teenager arriving at an empty house in a foreign country with no plan except "not South Africa" does not fit the image of the calculated visionary. The visionary came later. The teenager was just surviving.
The man who calculates orbital trajectories began by calculating which Canadian city had the cheapest rent. The ambition scaled. The survival instinct that launched it did not come from a boardroom. It came from a boiler.