ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Learn Japanese, from kana to reading real text.
Vocabulary, kanji, grammar, reading, listening and mock JLPT exams, from N5 to N1,
in one app with one daily review queue.
Tsuji is a Japanese-learning app for the web and mobile. It covers the whole
path from the first kana to the JLPT N1, in English and French.檢視完整 README ↗Tsuji is a Japanese-learning app for the web and mobile. It covers the whole path from the first kana to the JLPT N1, in English and French.
I'm learning Japanese myself, at an intermediate level and working towards the N3. For a long time that meant juggling several apps. Anki handled vocabulary: it's powerful, but austere and slow to set up. Separate tools for grammar and kanji never talked to each other. Duolingo is pleasant, but too light to prepare for the JLPT. After months of study I still couldn't read a real page of Japanese.
Tsuji is the app I wanted instead. Vocabulary, kanji, grammar, reading, listening and exam practice live in one place, feed one daily review queue, and lead back to real Japanese text at every step. It is being built as a real product, and it also shows what one student can ship by directing an AI coding agent.
One path, one queue. Kana, vocabulary, kanji, grammar and your own cards all feed a single spaced-repetition queue. A day's study is one list, not five apps.
Built to read real Japanese. The Analyzer takes any text you type, photograph or pull from a video's subtitles. It splits the text into words with readings and grammar, marks which words you already know, and opens each word's dictionary entry in one tap.
A station, not a menu. 辻 (tsuji) means "crossroads". It is a kokuji, a character invented in Japan, and its five strokes draw the intersection it names. The app is designed as a Japanese railway station:
The metaphor gives a dozen subjects one coherent map instead of a menu of menus.
Tsuji is organised into five tabs.
New learners start with a short onboarding. They choose their level or take a placement test, pick a daily pace (5, 10 or 20 new cards), and take a guided first ride through a flashcard and a reading exercise.
All content is organised by JLPT level:
| Level | Vocabulary | Kanji | Grammar points |
|---|---|---|---|
| N5 | 675 | 103 | 91 |
| N4 | 642 | 144 | 108 |
| N3 | 1,771 | 366 | 110 |
| N2 | 1,767 | 367 | 115 |
| N1 | 3,235 | 1,232 | 117 |
| Total | 8,090 | 2,212 | 541 |
The interface is shown here in French, its first language; it is also available in English.
Tsuji is free to use during early access.
A paid plan, the Pass (定期券, "commuter pass"), is built into the app but not on sale yet. When it launches, the free tier and the Pass are planned to split as follows. The limits may change before launch.
| Free | Pass | |
|---|---|---|
| Reviews | 200 credits on sign-up, then 30 more a day (up to 50); one credit per review. Kana are always free. | Unlimited |
| Your own decks | 7 | 100 |
| Your own cards | 200 | 10,000 |
| Practice modes (reading, comprehension, translation, dictation, mock exams) and the Analyzer | Not included | Included |
Tsuji is built by one person directing an AI coding agent. I'm a third-year student in artificial intelligence. I set the product direction, the design and the priorities, reviewed the work, and tested it every day. The code itself was written by Claude Code, Anthropic's coding agent. I did not write it by hand.
Since spring 2026 that has produced 120 numbered plans and more than 160 merged pull requests. The work is organised around four habits:
Written plans, shipped in waves. Every piece of work starts as a numbered plan that I read and approve before any code is written. A plan sets out the scope, the decisions, the files and the tests. Related plans ship together as a wave: the mobile release, the deck library, the desktop layout, and so on.
Mockups before code. New screens are explored as mockups first, and I choose a direction before implementation starts.
Daily use and feedback. I study with Tsuji on my phone and report
what I find. Decisions made this way are recorded as "owner-directed" in
DESIGN.md, so they are not reopened later.
Written rules, and checks that enforce them. Four sets of documents set the rules the agent works by:
CLAUDE.md: how to work in this repository;DESIGN.md: the visual language;CONTEXT.md: the shared vocabulary;Continuous integration enforces them: more than 300 test files, linters, and design guards that fail the build when a font size, a spacing value or a colour escapes the design's token scale.
An agent also checks the content. Twice a week, a scheduled Claude Code
session takes one slice of what Tsuji teaches (grammar points, vocabulary or
example sentences) and tries to disprove it against reference sources. It
files its findings as a single GitHub issue and never edits the content
itself: a wrong correction that arrives with a citation is worse than the
original error. The method is in
docs/content-audit/PLAYBOOK.md.
| Layer | Technology |
|---|---|
| Frontend | React 19, React Router 7, Vite 8, plain CSS with design tokens in a single stylesheet |
| Mobile | PWA (vite-plugin-pwa), Capacitor 8 for Android and iOS |
| Backend | Python 3.12, FastAPI, Uvicorn, psycopg2 (raw SQL, no ORM) |
| Data | PostgreSQL 16 (on Supabase), SQLite for the dictionary data |
| Auth | Supabase Auth (email and password, Google) |
| Japanese | fugashi + UniDic (MeCab), pykakasi, JMdict, KANJIDIC2, KanjiVG |
| AI | Gemini, OpenAI and OpenRouter through OpenAI-compatible HTTP; Tesseract.js for OCR |
| Audio | edge-tts for exam listening and dictation; the browser's speech synthesis for study |
| Testing | pytest, Vitest with Playwright (Chromium), ESLint, Stylelint |
| Hosting and CI | Vercel (web), Render (API), GitHub Actions |
flowchart LR
W["Web and PWA"] --> V["Vercel<br/>static site + /api proxy"]
N["Android and iOS<br/>Capacitor"] --> V
V --> A["FastAPI<br/>on Render"]
A --> DB[("PostgreSQL<br/>learner data")]
A --> R[("SQLite and JSON<br/>dictionary and decks")]
A --> L["LLM providers<br/>Gemini, OpenAI, OpenRouter"]
A --> T["edge-tts<br/>exam audio"]
W -. sign-in .-> S["Supabase Auth"]
N -. sign-in .-> S
A -. token check .-> S
The browser only ever talks to one origin. Vercel serves the app and
forwards /api, the stroke-order diagrams and the exam audio to the
FastAPI backend. The backend keeps each learner's progress in PostgreSQL. It
reads the dictionary and the decks from files shipped with the code, and
calls an AI provider only for the features that need one.
.
├── backend/ FastAPI application
│ ├── routes/ one thin router per feature
│ ├── srs/ spaced-repetition engine, scheduler, XP, schema
│ ├── study/ exams, sentence analysis, tokenizer, AI client, dictation
│ ├── content/ authored content: grammar (N5–N1), sentences, audio clips
│ ├── datas/ vocabulary and kanji decks, dictionary databases
│ ├── scripts/ data builds, migrations, maintenance
│ └── tests/ pytest suite
├── frontend/ React + Vite application
│ ├── src/ screens, components, hooks, domain logic, locales (en, fr)
│ ├── android/, ios/ Capacitor native projects
│ └── public/ icons, PWA assets, privacy page
├── docs/ decision records, design notes, release and audit guides
├── CLAUDE.md the working guide to this codebase
├── DESIGN.md the visual language
└── CONTEXT.md glossary of domain terms
These are the essentials. CLAUDE.md and
frontend/README.md cover the rest. Run each block
from the repository root.
Prerequisites: Python 3.12, Node 22 or later, and Docker (or a local PostgreSQL 16).
1. Start a database
docker run -d --name jp-db -e POSTGRES_PASSWORD=dev -p 5432:5432 postgres:16
docker exec -i jp-db psql -U postgres -c "CREATE DATABASE jp;"
docker exec -i jp-db psql -U postgres -d jp < backend/srs/data_structure.sql
2. Run the backend (on port 8000)
cd backend
cp .env.example .env # the defaults match the database above
pip install -r requirements.txt
uvicorn main:app --reload --port 8000
DEV_USER_ID in .env makes the backend treat every request as that one
local user, with no token check. It is for local development only and
must never be set on a deployed server; the backend prints a warning
banner when it is on.GOOGLE_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY) are
optional. Without one, the AI-backed features return an error: exam
generation, comprehension, translation feedback, the Analyzer's
explanations and photo recognition by a vision model. Everything else
works.3. Run the frontend (on port 5173)
cd frontend
grep -E '^VITE_SUPABASE' .env.production > .env.development.local
npm install
npm run dev
Open http://localhost:5173 and sign in. The dev server forwards /api to
the backend on port 8000.
4. Run the tests
# Backend: the tests use their own database.
docker exec -i jp-db psql -U postgres -c "CREATE DATABASE jp_test;"
docker exec -i jp-db psql -U postgres -d jp_test < backend/srs/data_structure.sql
cd backend
DATABASE_URL=postgresql://postgres:dev@localhost:5432/jp_test DEV_USER_ID=test-user python -m pytest -q
# Frontend
cd frontend
npx playwright install chromium # once, for the browser test lanes
npm test
npm run lint && npm run lint:css && npm run lint:scale && npm run lint:ink
If DATABASE_URL isn't set, the backend tests look for a database at
localhost:5433/jp_test.
frontend/ from main.
frontend/vercel.json forwards /api, /kanjivg
and /exam-audio to the backend, so the browser only talks to one origin.render.yaml. A persistent disk stores the generated exam
audio.backend/srs/data_structure.sql is the
reference snapshot of the schema.vX.Y.Z tag on main builds a signed Android App
Bundle and uploads an iOS build to TestFlight. See
docs/release.md.CI: backend and frontend tests, linters and the build.Mobile: the native builds.Database maintenance: weekly log pruning and history compaction.Weekly digest: a weekly usage summary.| Document | What it covers |
|---|---|
CLAUDE.md | The full working guide: commands, architecture, conventions, maintenance scripts |
DESIGN.md | The visual language: the station metaphor, colour, type, spacing, motion, layout |
CONTEXT.md | The glossary: what card, deck, mode, sentence, passage mean here |
docs/adr/ | 18 architecture decision records |
docs/design/ | Notes on the mobile and desktop layouts |
docs/release.md | How to ship a web, Android and iOS release |
docs/oauth.md | How Google sign-in works on the web and in the native apps |
docs/llm-commercial-plan.md | The choice of AI providers and cost control |
docs/content-audit/PLAYBOOK.md | How the twice-weekly content audit works |
Alexandre Bauwens, third-year Bachelor's student in Artificial Intelligence at Hénallux (Namur, Belgium), learning Japanese.
I'm looking for an internship from February to May 2027, in Belgium, in AI-assisted software development or full-stack development. Tsuji shows how I work: I take a product from idea to production by directing an AI coding agent. That means defining the work, writing down the rules, reviewing the result and testing it in real use.
Tsuji's dictionary and reference data come from open projects, used under their own licences:
The full notices are in THIRD_PARTY_NOTICES.md.
© 2026 Alexandre Bauwens. All rights reserved. The source code of this project is not licensed for reuse. The third-party data above remains under its own licences.
| The grammar catalogue's format and style guide |
frontend/README.md | Frontend commands, native shells and the design guards |
THIRD_PARTY_NOTICES.md | Licences of the third-party data and fonts |