ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Your first real Thai line in 2 minutes. Free, no sign-up needed.
Translation pending
EducationJavaScript · CSSGitHub @jayp-hashOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Thai study app based on Can You Speak Thai curriculum
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Thai you'll use today. A web app for people living in Thailand. Each day is one short lesson built around a real moment, like ordering coffee, bargaining at the market or telling a taxi where to stop, plus a line to go and say to someone that same day.
Live: https://soitalk.app (public launch 1 Nov 2026)
I live in Bangkok. I took Thai classes, and the classes were fine. Practising at home was the problem. Most apps teach random travel phrases, or hand you a word list with no context.
What I wanted was simpler: learn the thing I'll need at the coffee stall tomorrow, hear it from a Thai voice, then actually say it. So I built that.
I spent about 15 years in English teaching and EdTech, including a platform launch for 2.5 million learners in China. This time I'm building the product myself.
Next up: a quick practice round you can do any time, replaying past lessons, a classifier game (Thai counting words), a tones lesson, and a Bangkok map of places you've learned to handle.
I run every feature past a panel of AI reviewers before I build it: a learning scientist, a Thai teacher, an expat customer, a product designer and a technical lead. Each gives a verdict and a ranked list of changes. I make the call. The reviews and decisions live in a project log.
A few rules came out of that process:
The word list is my own. I cross-referenced three Thai word-frequency lists, kept the most common words, then added the classifiers, function words and everyday phrases that basic sentences need but frequency lists miss. Older versions of the CU-TFL (Chulalongkorn University's Test of Thai as a Foreign Language) are a reference for what a learner should be able to do at each level.
Words and sentences live in one Excel workbook. An import script loads it into the database, so content changes never touch the code. Lessons and sentence patterns are written in code and checked by a Thai teacher.
Some example sentences were drafted with AI help. Every sentence has a review status, and native Thai review is ongoing. Rejected sentences never reach the app.
I built this with AI coding tools (Claude). I made the product, curriculum and design decisions, wrote the specs, and reviewed and tested each change.
| Part | Tool | Why |
|---|---|---|
| Website | Next.js 14 (React) | Pages and small server functions in one codebase |
| Database and accounts | Supabase (Postgres) | Words, sentences, sign-in, progress and feedback, with row-level security |
| Audio | ElevenLabs API | The most natural Thai voices I tested (against Google Cloud and Botnoi) |
| Analytics | PostHog | Which lessons people finish and where they drop off |
| Hosting | Vercel | Deploys straight from this repo |
| Content | Excel workbook + Node import script | The spreadsheet stays the source of truth |
| Testing | Playwright | Automated walk-throughs of every lesson and screen at phone and laptop sizes |
How the data fits together:
vocabulary: one row per word (Thai, romanization, English, frequency rank, topic, course order)sentences: one row per example sentence, with its review statusword_sentences: links words to the sentences they appear inprofiles, word_progress (memory strength per word), study_days, said_it: each user's settings and progress, readable only by that userfeedback: mistake reports. Anyone can send one, nobody can read them through the app.The public website can only read course content. Only the import script, run with a private key, can change it. The audio endpoint only speaks text that is in the course, so it can't be used to run up the ElevenLabs bill.
npm install
cp .env.example .env.local # then add your own Supabase and ElevenLabs keys
npm run dev # opens at http://localhost:3000
Create the tables by running the files in supabase/ (001 to 010) in order in the Supabase SQL editor, then load the content:
node scripts/import-curriculum.js path/to/your-workbook.xlsx
Run the automated checks (they use a pretend database, so no keys are needed):
npm test
Keys go in .env.local, which is never committed. On Vercel they are set as encrypted environment variables.
I'm Jason Pshyk, a strategy and operations lead based in Bangkok, with an MBA and a PMP. Soi Talk is my side project. Feedback is welcome: [email protected]