ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Higher Studies calculation app
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A web calculator for the total university fees, in Singapore dollars, of a Bachelor's or Master's degree in Singapore and in nine of the countries where Singaporeans most often study: Australia, the UK, the US, Germany, Canada, New Zealand, Switzerland, Japan and Ireland (ranked by UNESCO's counts of Singaporean students abroad). It is built for Singaporean students and families.
It covers tuition plus compulsory university fees (student services fees, Japanese admission fees, and so on), and optionally living costs for studying abroad. Visas, flights and health insurance are out of scope.
monthly GitHub Action every request (cached 24h)
university ──► scrapers/ (Python) ──► PR with data/ ──► Next.js site ◄── ECB daily rates
fee pages changes, reviewed (Vercel) + Frankfurter or IMF
by a human
| Data | Where it comes from | How it stays current |
|---|---|---|
| Tuition and compulsory fees, per university, level and field | Each university's published fee page (HTML, PDF or JavaScript page) | scrapers/ re-reads the pages monthly and publishes the result when every check passes, otherwise holds it for review |
| Exchange rates to SGD | European Central Bank daily reference rates (about 30 currencies, read from the ECB's own file, or Frankfurter's copy if that fails). For any currency the ECB lacks, the source chosen in Site settings (otherExchangeRates): Frankfurter central-bank rates (MAS, Bank of England, Bank of Canada, RBA or IMF daily, else the currency's own central bank; at most a week old and within 2% of a second bank where one exists), or the IMF data API month-end rates. All free, no key | Fetched live and cached for an hour, with a daily visit after the ECB publishes (refresh-rates.yml); data/fx-fallback.json is used if the API is down |
| Yearly fee increase used for future years | Each university's own rate: the median compound yearly rise across its programmes' published fee histories (per residency tier in Singapore), computed in lib/increase.ts. A per-country default in data/countries/ is used where a university has fewer than two programmes with history | Country defaults are set by hand (the monthly run's summary suggests a new one when the fee history points elsewhere); university rates follow the data |
There is no public API for university tuition anywhere, so fees are scraped
from each university's own pages. Pages change layout from time to time, so the
monthly run (refresh-data.yml) only publishes a refresh by itself when every
check passes: the website's lint, type checks, tests and build, the scraper tests,
and the safety checks in scrapers/guard.py. Those allow only fee, fee-year,
history, living-cost, default-increase and fallback-rate changes, each fee moving
by at most 25% (never to or from zero), exchange rates by at most 10%, and no change
at all to a fee entered by hand. A passing refresh is committed straight to main
and Vercel publishes it; anything else stays on the data/refresh branch as a pull
request (or, if GitHub doesn't let Actions open one, an issue linking to it) and the
run is marked failed so GitHub emails you. In the scrape itself:
manual: true page
unless its source lists that page under also_covers;114 universities, 1,537 programmes: five to sixteen universities in each of the
10 countries, plus SIM Global Education in Singapore, across nine fields (engineering,
computing, business, sciences, arts and humanities, law, medicine, psychology,
nursing). Business includes a dedicated accountancy degree (one bachelor's and one
master's at most) wherever a university teaches one in English; where accounting is only
a major inside a general commerce degree, that degree is listed once. Psychology covers the main bachelor's and one taught master's at
every university that offers them (Imperial, SIT, TUM, ETH, EPFL and St. Gallen
have none; most US universities and several others teach psychology master's
only as research degrees, so they have the bachelor's only). MIT is listed with
Brain and Cognitive Sciences, its nearest equivalent. Law and medicine are
included wherever a shortlisted university teaches them; every law or medicine
programme is labelled "SILE listed" or "Not on SILE list" (Singapore Institute
of Legal Education approved universities) and "SMC listed" or "Not on SMC list"
(Singapore Medical Council registrable qualifications), from sgRecognition in
the data, so a reader can see at once whether the degree leads to practice in
Singapore. Undergraduate-entry degrees (LLB, MBBS) sit under Bachelor's and graduate-entry
ones (JD, LLM, graduate-entry MD) under Master's. Where later years of a
programme cost more (the clinical years of medicine, say), each year is priced
at its own published fee (laterYears in the data; see data/SCHEMA.md).
Every current figure was checked against the university's own fee page or PDF
where the page is readable, and 2024/2025 figures come from the universities'
published fee tables for those years.
| Country | Universities | Scraped automatically |
|---|---|---|
| Singapore | NUS, NTU, SMU, SIT, SUSS, SIM (9 partner universities) | NUS, NTU, SIT; SMU, SUSS and SIM are manual |
| Australia | ANU, Melbourne, Monash, UNSW, Sydney, RMIT, Deakin, Queensland, Adelaide University | ANU, UNSW, Sydney; Melbourne and Monash are manual (Cloudflare); RMIT, Deakin, Queensland and Adelaide University are manual |
| UK | Cambridge (MBA), Imperial, LSE, Oxford, UCL, Glasgow, Manchester, Warwick, Hertfordshire, Coventry, East London, King's College London, Bristol, Birmingham | Cambridge, Imperial, LSE, UCL; Oxford is manual; the last nine are manual |
| US | Berkeley, CMU, Harvard, MIT, Stanford, ASU, UIUC, Purdue, Northeastern, USC, UCLA, Columbia, NYU, Boston University, Johns Hopkins, North Texas | First five: all; the other eleven are manual |
| Germany | TUM, LMU Munich, Heidelberg, RWTH Aachen, HU Berlin, TU Darmstadt, Duisburg-Essen, Bonn, Goethe Frankfurt, FU Berlin, OVGU Magdeburg | TUM, LMU Munich, Heidelberg and RWTH Aachen; HU Berlin (semester-fee page blocks bots) and the six newer universities are checked by hand |
| Canada | McGill, McMaster, Toronto, UBC, Waterloo, York, Concordia, Simon Fraser, Alberta, Western | First five: all (McMaster's tuition spreadsheet and UBC compulsory fees are manual); the other five are manual |
| New Zealand | Auckland, Canterbury, Massey, Otago, Victoria Wellington, Waikato, Lincoln, EIT, Unitec | All except Otago (bot-protected); Waikato, Lincoln, EIT and Unitec are manual |
| Switzerland | ETH Zurich, EPFL, Zurich, Geneva, St. Gallen, Lausanne, Basel, Bern, Neuchâtel, Fribourg, USI | All of the first five; Lausanne, Basel, Bern, Neuchâtel, Fribourg and USI are manual |
| Japan | Keio, Kyoto, Osaka, UTokyo, Waseda, APU, Ritsumeikan, Sophia, Kyushu, Nagoya, Tohoku, Institute of Science Tokyo, Tsukuba | First five: all (Waseda's lab/health fee is manual); the other eight are manual |
| Ireland | Trinity College Dublin, UCD, UCC, Galway, DCU, TU Dublin, Limerick, Maynooth, RCSI, Griffith College | First five: all (UCD's living-cost page is manual); TU Dublin, Limerick, Maynooth, RCSI and Griffith are manual |
Why these countries: Singapore's MOE does not track students who study overseas, so the list follows the host countries' own counts of Singaporean students as compiled by UNESCO UIS (2023–24): Australia ~6,800, UK ~6,100, US ~3,800, then Germany, Canada, New Zealand, Switzerland, Japan and Ireland at 250–650 each. Malaysia (about 550) is left out because most Singaporeans there take Singapore-delivered or branch-campus degrees.
Manual sources are listed in scrapers/registry.yaml and
scrapers/registry.d/*.yaml with the reason. They are pages that block
automated access (SMU, SUSS, Oxford, Melbourne, Monash, Otago, UCL's central
site, some NUS programme sites) or that show a fee spread across rows. Figures
from those sites carry an "Unofficial source" badge where the university's own
page could not be read.
SIM Global Education teaches 86 bachelor's and master's degrees awarded by University of London, University at Buffalo, Birmingham, Wollongong, RMIT, Stirling, Cardiff, Sydney and Alberta. Its fees appear only on each programme page (GST-inclusive, Singaporeans & PRs vs international), so every page is a manual source; 2024 to 2026 figures come from archived copies of those pages, and programmes with no archived copy say so in their notes.
A few earlier-year figures are an official per-credit or per-course rate multiplied by a standard full-time load (UNSW, UBC, Auckland), the same way the current figures are built; their notes say so.
The sidebar on the left holds the student settings (level, residency, start year, fee increase, living costs) and the comparison slots. One university is shown at first; "Compare another university" adds a second and a third slot, each with a "remove" link. Each slot has a country dropdown, then a dropdown of that country's universities, then the field of study offered at that university (and a programme dropdown where it has more than one in that field). SIM Global Education teaches degrees awarded by partner universities, so for SIM a "Partner university" dropdown (University of London, Buffalo, Birmingham and so on) comes between the university and the field, and the partner is named on the tile, chart and details. Because the field is chosen per slot, the same university can be compared across two of its own courses, or two universities across different courses. The results show a headline tile for each selection (programme, total in SGD and how much more it costs than the cheapest), then vertical bars on a common baseline. "Compare" switches the bars between the total and one part of it (tuition, other fees, one-off fees, living costs); the total is stacked by part. The year-by-year fees, living-cost breakdown, badges and source links for each university sit in the details panel below the chart, all converted to SGD, with the local-currency figure shown once in the heading.
Every university name is a link to its website; hovering (or tapping) it shows
a short description and why the university is in the calculator (description
and whyIncluded in its data file). For Singapore universities the details
also list the Citizen, PR and international fee per year side by side.
Switch on "Include living costs" to add each overseas university's own
published estimate of a student's living costs (housing, food, transport and
personal/books), stored as monthly amounts in livingCosts in its data file.
Every university outside Singapore has one. Where the university publishes no
itemised budget, the entry uses its single stated total, or failing that the
national visa authority's living-cost requirement (marked as an unofficial
source), split into the four categories using the average shares of that
country's other universities; each entry's notes say which.
livingCostIncrease in data/countries/).The site is responsive and can be installed as an app. In Safari, choose
Share → Add to Home Screen; in Chrome on Android, ⋮ → Install app.
It then opens full-screen with its own icon (app/manifest.ts,
public/icons/). On small screens a bottom bar links from the options to the
results, chart bars open their breakdown on tap, and form fields are sized so
iOS doesn't zoom in.
The start year is typed in and must be 2026 or later; earlier years are refused with a prompt saying so. For each year of study:
Years up to the latest published fee year use published figures only: the
current fee, or for earlier years the programme's feeHistory. If a needed
year has no published figure, the programme is shown as "No published fee on
file"; the past is never estimated. Earlier years' fees (2024, 2025) stay in
the data because the per-university increase is computed from them.
Later years are projected:
fee(year) = (annual tuition + annual compulsory fees) × (1 + yearly increase) ^ (years after the published fee year)
One-off fees are added in the first year, and everything is converted to SGD at the latest rate.
The yearly increase is automatic and specific to the university chosen. The sidebar box "Rates based on … figures" names the published fee year the projections start from, takes the start year, and lists each selected university's "% inflation": the median compound rise across that university's programmes between their earliest and latest published fees, per residency tier in Singapore. A university with fewer than two programmes carrying history falls back to its country's typical rate, and the box says so. "Use my own rate instead" applies one rate to every university.
The engine is lib/calc.ts, with tests in lib/calc.test.ts.
app/, components/ Next.js site (App Router, Tailwind)
lib/ fee engine, zod schema, data loader, exchange rates
data/ all fee data as JSON; format described in data/SCHEMA.md
scrapers/ Python scraper pipeline
registry.yaml which page and regex feeds which fee figure
registry.d/ one more registry file per newer university, merged in by run.py
run.py runs the registry, validates, writes data/, writes the PR summary
.github/workflows/ ci.yml (tests + build), refresh-data.yml (monthly scrape → PR)
npm install
npm run dev # http://localhost:3000
npm test # fee engine + validation of every data file
npm run lint && npm run typecheck
python -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/pytest # scraper tests (offline fixtures)
.venv/bin/python -m scrapers.run --dry-run # live scrape, prints the diff, writes nothing
For parser: browser sources, also run pip install -e ".[browser]" and
python -m playwright install chromium.
data/universities/<country>/<id>.json (see data/SCHEMA.md).
Every programme needs a sourceUrl.scrapers/registry.yaml
with a regex whose first capture group is the amount. Test it with
python -m scrapers.run --dry-run --only <id>.manual: true. The
monthly run's summary will remind you when it needs re-checking. A fee
entered by hand from a manual page is never changed by a scraped page.Import this repo into Vercel with Add New → Project →
Import Git Repository (not "Clone Template", which creates a separate, empty
repo). Vercel detects Next.js automatically; the calculator needs no settings or secrets.
Production deploys from main.
The editor at /admin (reached by the faint three-bar symbol at the top right of the header, shown on computers only) stays
switched off until you add an EDITOR_PASSWORD environment variable (at least 8
characters) under Settings → Environment Variables. Everyone who edits shares
that password; changing it signs everyone out.
To let the editor save, add an EDITOR_GITHUB_TOKEN as well: on GitHub go to
Settings → Developer settings → Fine-grained tokens → Generate new token,
choose Only select repositories with this repository, give it Contents,
Pull requests and Issues set to Read and write, and Actions, Commit
statuses and Deployments set to Read-only, and set an expiry date (renew it
before then). If GitHub refuses a request, the editor names the permission it was
missing. Each saved change becomes a pull request labelled editor-change; it goes
live once it is approved on the editor's Approvals screen (the sender can
approve their own change) after its checks pass. Everything one person edits
between signing in and signing out (or the 12-hour limit) joins that same pull request, so a single
approval covers it; once it is approved or sent back, the next edit starts a
new one. Approving merges it, and Vercel then
redeploys the site.
Editors can also add and remove programmes, universities and countries. A new
university's fee pages go into scrapers/registry.d/<id>.yaml as pages to check
by hand; removing one also drops its scraper entries and shortlist place. A new
country's currency must be one the European Central Bank or the International Monetary Fund publishes, and its
rate is added to data/fx-fallback.json; the list of currencies to fetch comes
from the country files. The page re-renders at most hourly for fresh exchange
rates (a scheduled workflow visits it daily after the ECB publishes, so it never waits for a visitor), and every merge into main (including approved data PRs) redeploys it.
The monthly fee refresh publishes by itself when its checks pass (no setting needed). To get a pull request instead of an issue when one is held for review, go to Settings → Actions → General and allow GitHub Actions to create pull requests.
Figures are estimates for planning. Scholarships, bursaries, MOE service obligations and fee changes a university hasn't published yet are not included. Always confirm with the university.