Skip to main content
Jason Finance
AI Startup

Jason Finance from Zero to One: 10 Days, 190 Commits and the Tech Stack Behind a Four-Language Finance Site Built with Claude Code

Jason Finance's tech stack, from the first commit on 2 October 2026 to four languages: Astro, Cloudflare Workers, GitHub, Supabase, why, and each day's work.

On this page
  1. 1.The whole stack in one sentence
  2. 2.What happened in 10 days
  3. 3.Seven key decisions
  4. 3.11. Every public page is static
  5. 3.22. Posts live in Git, one folder per post, with a shared slug across languages
  6. 3.33. Rules live in the data structure, not in anyone’s memory
  7. 3.44. Each kind of data has exactly one source
  8. 3.55. One sign-in, with database permissions as the real boundary
  9. 3.66. Translation is a rule, not extra work
  10. 3.77. AI permissions depend on impact, not on the command
  11. 4.How a post goes from draft to live
  12. 5.SEO and AI search basics
  13. 6.What I deliberately didn’t use
  14. 7.Where things stand
  15. FAQ

Jason Finance’s first commit was on 2 October 2026. By 11 October the site had 190 commits and 27 posts, each in Traditional Chinese, Simplified Chinese and English, with 22 of the crypto posts also in Spanish. It also has an admin area, comments, data that updates automatically every day and an SEO monitoring setup. Claude Code wrote all the code. I can’t read code; my job is setting the direction and reviewing the writing.

This post documents the whole tech stack and how it was built: what it uses, why I chose it, what got done each day, and what I deliberately left out. For what each service costs and how I give the AI permissions, see Building a Website Without Reading Code.

This post is a record of how Jason Finance was built, and the figures reflect its state on 11 October 2026. Tool features, free tiers and prices all change, so check each service’s official documentation.

The whole stack in one sentence

One Astro site deployed on Cloudflare Workers: every public page is pre-generated as a static page, posts are stored in GitHub, the admin area is server-rendered, sign-in, comments and admin data live in Supabase, and an Oracle server runs Claude Code and the daily backups.

Layer What it uses Why
Site framework Astro Public pages are output as static HTML; only the admin area and the homepage’s language redirect need a server
Content Markdown + content schema checks (zod schema) Git is the content management system: it has version history and supports review, and the build does not depend on a database
Languages Traditional Chinese, Simplified Chinese and English, plus Spanish for the crypto topic Every language has a URL prefix, with no exceptions to the rule
Hosting Cloudflare Workers Static pages are served from a global CDN, so post pages are unaffected when the database has problems
Deployment Pushing to main deploys automatically; the preview branch produces a preview URL that includes drafts A push is a publish, so no separate publishing system is needed
Sign-in and data Supabase free plan (Postgres, sign-in, RLS) Comments and the admin area both need to be clear about who owns which data, which the database’s row-level permissions control
Sign-in method Google sign-in The free plan’s email quota is very low, so sign-in methods that send email are avoided
Admin protection Cloudflare Access Unauthorized requests are blocked at the Cloudflare layer
Comment bot protection Cloudflare Turnstile Verification happens in the database, so calling it directly and bypassing the site does not skip it
Always-on server Free Oracle server Runs Claude Code and the daily backups
Backups The database is backed up to Cloudflare R2 daily and kept for 30 days The free plan has no automatic backups, so I make my own
Traffic and SEO GA4, Google Search Console and a separate SEO Monitor project The site itself only needs to be indexed; analysis is handled by an independent project
Testing Vitest, Astro’s type checking, content schema checks If data or formatting is wrong, the build fails, so errors don’t go live

What happened in 10 days

Date Main progress
2 October Created the Astro project
3 October Wrote the AI permission rules (whether to ask me depends on the impact) and the communication language; first draft post; structured data (WebSite, BlogPosting, BreadcrumbList)
4 October Menu, language switcher, dark mode, author bio, comments; admin area (Google sign-in, content analysis, translation progress, comment moderation); dollar-cost averaging calculator; first posts published in three languages
5 October Exchange data framework; writing and editing rules
6 October A flat sitemap.xml
7 October Crypto content plan; first exchange review published; USDT rate tool (draft)
8 October Exchange fact data (fees, reserves, licenses, incidents) and a public rating methodology; screenshot uploads in the admin area; Spanish edition
9 October Site-wide sidebar and mobile bottom bar; first news post published in four languages
10 October A to-do list for hand-offs; exchanges ordered by CoinGecko ranking
11 October Sitemap dates, Organization structured data, RSS in four languages, related reading; connected SEO Monitor; 12 exchange reviews published in four languages

Commits per day ranged from 1 to 36, with the most on 7 October. I use the Claude app on my phone to connect to Claude Code on the Oracle server and tell it in Chinese what to do.

Seven key decisions

1. Every public page is static

A free Supabase project is paused after a week of inactivity, and cloud services fail too. If public pages requested data from the database on every visit, the site would go down whenever the database did. So every page readers see is generated at build time, and Supabase only handles the “extras” such as comments and the admin area. If comments fail to load, the page just shows “Comments could not be loaded right now”, and the post can still be read as normal.

2. Posts live in Git, one folder per post, with a shared slug across languages

Each post has its own folder containing one Markdown file per language, for example okx-review/zh-hant.md and okx-review/en.md. URLs differ only in the language prefix, so the language switcher and hreflang need no mapping table. If a language has no file, that page is not generated, and no other language is substituted. Once a slug is live it does not change; if it really must, a 301 redirect is set up.

3. Rules live in the data structure, not in anyone’s memory

Every post’s frontmatter (fields such as title, description, topic and date) is format-checked: a post must belong to one topic, the description can’t exceed 160 characters, and a translation must state which language it was translated from and the date of the original. Anything that fails stops the build. Before the 12 reviews went live this time, one English description was over 160 characters; it was blocked and only went live after being shortened.

4. Each kind of data has exactly one source

  • Exchange fees, reserves, licenses and incidents: kept in one data file, with every entry carrying an official source and the date it was verified. The ratings, comparison tables and the data box in each review all read the same file, so the figures never contradict each other.
  • Savings rates and exchange rankings: fetched daily by GitHub Actions; if a fetch fails, the previous data is kept.

5. One sign-in, with database permissions as the real boundary

The admin area has three layers: Cloudflare Access blocks first, the code checks again, and the database’s row-level permissions (RLS) decide in the end what can be seen. Neither the site’s code nor the server holds a top-level key that can bypass those permissions.

6. Translation is a rule, not extra work

Once the Traditional Chinese version is final, the Simplified Chinese and English versions (plus Spanish for crypto posts) are produced through a fixed process: English and Spanish are translated directly from Traditional Chinese, while Simplified Chinese is first converted using a terminology glossary and then edited. Each translation records the original’s update date, and if the original changes and the translation falls behind, the build flags it.

7. AI permissions depend on impact, not on the command

I can’t read code, so I can’t approve commands one by one. The rule is that whether to ask me depends on what impact an action will have. Ordinary changes and deployments go ahead directly. Publishing content I haven’t seen or changing production settings needs my decision. Deleting data or changing the database means explaining the scope, risk and backup once before starting. The details are in Building a Website Without Reading Code.

How a post goes from draft to live

  1. Choose the topic: I decide the topic and angle; Claude Code makes suggestions based on the content plan.
  2. Write the Traditional Chinese draft: every figure comes with an official source and date, and I provide my own experience and screenshots.
  3. Edit: multilingual editing rules remove translationese and AI clichés without adding or dropping facts.
  4. Self-check list: keywords, structure, sources, internal links, FAQ and the share image are checked one by one, and the results are reported to me.
  5. Preview: the draft is pushed to the preview branch, and I review it at the preview URL.
  6. Translate once final: when I say a post is final, Claude Code produces the other language versions, and all four languages are published together.
  7. Record after launch: SEO changes are recorded in SEO Monitor, and the results are checked after 7, 14 and 28 days.

SEO and AI search basics

  • Structured data: site and organization (WebSite, Organization), articles (BlogPosting), breadcrumbs, FAQ, and post lists on topic pages (CollectionPage, ItemList).
  • Sitemap: a single flat /sitemap.xml. Each URL’s last-updated date comes from the post itself, and list pages take the date of their newest post.
  • RSS: one feed per language.
  • llms.txt: generated automatically from published posts for AI search engines to read.
  • Multilingual: hreflang lists only the language versions that actually exist.
  • Monitoring: Search Console, GA4, PageSpeed and indexing status are collected daily by the independent SEO Monitor, which Claude Code can query directly.

What I deliberately didn’t use

Not used Reason
Server-rendered public pages When the database or a service goes down, the public site goes down with it
Storing posts in a database, a web editor A single author writes Markdown with Claude Code, and Git already provides versioning and review
An admin area that writes back to Git Two-way sync is error-prone, so the admin area is read-only
Magic link (email) sign-in The free plan’s email quota is too low
HTML and auto-linking in comments XSS and spam link risks; plain text is enough
Scroll animation libraries A content site doesn’t need them, and taking over scrolling hurts the reading experience
Front-end packages loaded from a CDN Everything is bundled, with no dependence on external services
Backups in Git or on the server itself The repo would keep growing, and if the server were reclaimed the backups would vanish with it
Different slugs per language It would need a mapping table and turn every translation into a special case

Where things stand

Item Count (11 October 2026)
Commits 190
Published posts 27 × Traditional Chinese, Simplified Chinese and English, 22 also in Spanish
Topics US stocks, crypto, credit cards and banking (AI startup in preparation)
Updated automatically every day Savings rates and exchange rankings
Automated tests 204

More posts are on the AI startup topic page.

FAQ

What is Jason Finance built with?

The site framework is Astro. Every public page is pre-generated as a static page and served from Cloudflare Workers. Posts are Markdown files in GitHub. Sign-in, comments and admin data use Supabase. A free Oracle server runs Claude Code and the daily backups.

Why are all public pages static?

A free Supabase project is paused after a week of inactivity, and cloud services can also fail. If public pages had to request data from the database on every visit, the site would go down whenever the database did. Static pages do not depend on the database, so readers can still read the posts.

How long did it take to go from zero to launch?

The first commit was on 2 October 2026. On 4 October the first posts were published in three languages. By 11 October there were 190 commits and 27 posts, each in Traditional Chinese, Simplified Chinese and English, 22 of them also in Spanish.

How are the URLs of a multilingual site designed?

Each post has its own folder, and all languages share the same slug, so URLs differ only in the language prefix, for example /zh-hant/okx-review/ and /en/okx-review/. If a language has no file, that page is not generated, and no other language is substituted.

Without an admin editor, how are posts published?

Posts are Markdown files. Once Claude Code has edited them, it pushes them to the main branch on GitHub, and Cloudflare builds and deploys automatically. A separate preview branch produces a preview URL that includes drafts, so I can review them before they are published.

Related articles

About the author

Photo of Jason

Jason

Account Manager in Google Large Customer Sales and Columbia MBA admit, sharing the money tools and experience he actually uses.

Comments

Sign in with Google to comment. Your comment will not show your Google profile picture or name; it appears under a randomly generated nickname to protect your privacy.

By signing in you agree to this site's privacy policy.

  1. Loading comments…