ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Team tracker for competitive programming: one matrix of who solved what (live, virtual or upsolved) across Codeforces incl. gyms and team virtuals, AtCoder, Kilonova and CSES. FastAPI + SQLAlchemy, in
EducationPython · HTMLGitHub @amcbn06OnlineOwner 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
Team tracker for competitive programming: one matrix of who solved what (live, virtual or upsolved) across Codeforces incl. gyms and team virtuals, AtCoder, Kilonova and CSES. FastAPI + SQLAlchemy, incremental submission store, one module per judge.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Squadforces
See what your whole competitive-programming team has solved — across Codeforces, AtCoder, Kilonova and CSES — and how: live, virtually, or upsolved.
One assignment, four members. A gym contest solved as a team (7/11 for each member), Codeforces rounds split into live ✓, virtual ✓ and upsolved ▲, rating changes, and an AtCoder round. Demo data.Read the full README ↗Coaches and ICPC-style teams practise across several judges, and no single site shows the picture: who has solved this week's problems, who only did it after the editorial, who virtual-participated as a team. Squadforces watches the judges for you. You assign contests and problems, and it shows one matrix of members × problems with how each was solved.
It never runs code or hosts problems. It is an observer of Codeforces, AtCoder, Kilonova and CSES, so it works with the practice people already do on those sites.
graph LR
subgraph Judges
CF["Codeforces API"]
AC["AtCoder Problems + history"]
KN["Kilonova API"]
end
Store[("Submission store<br/>every submission, per user")]
Results["Results per item<br/>(what the matrix shows)"]
UI["Server-rendered UI<br/>FastAPI + Jinja2"]
CF -->|"only what's new"| Store
AC --> Store
KN --> Store
Store -->|"platform module<br/>derives results"| Results
Results --> UI
Store --> UI
A local copy of every submission. Judges are only asked for a user's submissions, once. They are mirrored into a table and afterwards refreshed incrementally: everything newer than the newest stored submission, plus anything still being judged. Every contest and problem status is then a database query, so adding the tenth assignment that mentions a contest costs no judge calls. A 15,000-submission history loads in seconds and refreshes in about one.
One module per judge. Everything specific to a judge (its links, how to fetch, how to display, how to derive results) lives in app/platforms/<judge>.py behind one Platform interface. Recognising where a link comes from is a single switch in app/problems.py. Supporting a new judge means one new file, one registry line and one if; templates never branch on the platform.
Correctness you can check. The live/virtual/upsolved logic is tested against the implementation it replaced: identical answers on thousands of random submission histories, and on real Codeforces contests compared against live API calls. The suite (150+ tests, standard-library unittest) never touches the network.
Careful with other people's servers. Codeforces requests are serialised and spaced 2.1 s apart, concurrent syncs of one user share a single refresh, and a failed judge call leaves stored data untouched and is reported on the item instead of showing false "not solved" cells.
Safe to deploy over live data. No migration framework needed for additive changes: new tables come from create_all, new columns from an idempotent ensure_columns(). The last deploy was rehearsed on a copy of the production database first.
git clone https://github.com/amcbn06/squadforces
cd squadforces
pip install -r requirements.txt
python scripts/demo.py
Open http://localhost:8000. Sign in as admin / demo (admin), or as a fictional member (ioana, matei, sofia, radu) with demo-pass. The demo seeds a fictional team with synthetic submissions; contest and problem names are real public data. Every judge API is replaced by an in-memory fake, so the refresh buttons work offline too.
pip install -r requirements.txt
cp .env.example .env # then edit it
python run.py # http://localhost:8000
| Variable | Purpose |
|---|---|
ADMIN_PASSWORD | Password of the admin account, used only when the database is first created; change it later from the Password link |
SECRET_KEY | Signs session cookies. Set a long random value in production |
DATABASE_URL | SQLAlchemy URL, default sqlite:///./squadforces.db |
SYNC_INTERVAL_HOURS | How often histories and stale items refresh (default 2) |
CF_API_KEY / CF_API_SECRET | Optional: signed Codeforces requests |
ALLOW_OPEN_REGISTRATION | 1 lets anyone sign up without an invite. Leave it off in production; it is for local development and the demo |
PUBLIC_URL | Base URL used in invite links. Defaults to Railway's public domain, then to the address a request came to |
Then sign in as admin and open Admin → Invite links to make a link for each person (or cohort). They sign up with it, add their handles (their histories load straight away), and can create groups of their own or join others' through group links.
Existing databases upgrade in place. Groups made before ownership existed become admin-owned with a member limit of 10 (or their current size if larger), so nothing is removed or moved.
HttpOnly, SameSite=Lax, Secure when deployed) that end on every device when a password changes. A deployment refuses to start without SECRET_KEY, and without ADMIN_PASSWORD when it creates the admin account.tests/test_security.py and tests/test_invites_groups.py check the outsider, member, owner and admin cases.pip-audit.Found something? Open an issue, or email the address on the GitHub profile for anything sensitive.
The repo ships with railway.toml.
/data.DATABASE_URL=sqlite:////data/squadforces.db, ADMIN_PASSWORD and SECRET_KEY.railway.toml.app/
main.py, routers/ routes: groups, assignments, accounts, profiles
problems.py the source-detection switch (which judge is this link?)
platforms/ one module per judge: cf, atc, kn, cses, pbinfo, infoarena, spoj, codechef, other (+ registry)
submissions.py the submission store: incremental refresh, queries
sync.py refresh members' submissions, then derive an item's results
scraper/ the HTTP calls to each judge, nothing else
scheduler.py periodic refresh
templates/, static/ server-rendered UI, no JS build step
tests/ 150+ offline tests, incl. the differential classifier tests
scripts/ the offline demo and the screenshot generator
python -m unittest discover -s tests -t .
Tracked as GitHub issues: team gym contests with ICPC-style scoring, a curated ICPC contest database with a per-team "which SEERCs did we solve" table, and more profile views.
MIT. Built with Claude Code.