One friendly toolkit for Students' Union UCL: scrape data and auto-fill forms, with a single `suu` command.
Project description
suu
One friendly toolkit for Students' Union UCL, made to save student leaders time. It does two jobs:
- Get data out of the SU website — election results and the What's On calendar.
- Fill SU forms for you — payment and purchase requests — either from a file, or by letting an AI assistant (like Claude) do it through chat.
Everything runs through a single command: suu.
Not affiliated with UCL or the Students' Union UCL.
Install
You only install the parts you need. Pick one:
pip install "suu[scrape]" # just the data scraper
pip install "suu[forms]" # just the form filler (from a file)
pip install "suu[mcp]" # form filler + AI assistant support
pip install "suu[all]" # everything
New to the command line? pip comes with Python. If pip isn't found, install Python
first from https://python.org, then try again.
If you installed forms, mcp, or all, run this one extra line to set up the browser
the form filler uses:
playwright install chromium
First steps
suu --help # see everything suu can do
suu scrape --help # learn about a group of commands
The first time you do something that needs the SU website, a browser window opens so you
can log in normally. suu remembers it afterwards, so you only do that once. To forget all
saved logins at any time: suu logout.
Getting data out (scrape)
# Browse and pick an election interactively
suu scrape election
# Search by name (you'll get a list if several match)
suu scrape election "Leadership"
# Use a direct link, keep only winners, and save to Excel
suu scrape election https://studentsunionucl.org/election/... --winners-only --xlsx
# What's On events between two dates
suu whatson --start 2026-09-01 --end 2026-09-30
Handy options for scrape election: --csv, --xlsx, --sheets (copies for pasting into
Google Sheets), --winners-only, --officers-only, --key-roles, --resume (continue an
interrupted run). See suu scrape election --help for the full list.
To also upload results to Supabase, add --upload and set SUPABASE_URL / SUPABASE_KEY
(see .env.example).
Filling forms (forms)
# Log in once (opens a browser; log in, then close the window)
suu forms login
# Fill a form from a data file — opens a browser, fills it in, leaves it for you to check
suu forms fill payment_request --data my_payment.json
Built-in forms: payment_request (reimbursements) and purchase_request (paying invoices /
asking the Union to buy something). suu never submits a form — it fills it in and leaves
the browser open so you can review and submit yourself.
Letting an AI assistant fill forms (mcp)
suu mcp setup # finds your AI apps (Claude Desktop, Claude Code, Cursor…) and connects them
That's it — setup writes the right settings for you (backing up anything it changes), then
tells you to restart your AI app. To disconnect later: suu mcp setup --remove.
If you'd rather wire it up by hand, the server command is suu mcp run (it speaks MCP over
stdio). suu mcp setup will print a copy-paste snippet if it can't find a known app.
Running the form-filling worker (poll)
For the receipt-gatherer web app: suu poll claims queued jobs and fills the form for each
one. It needs a couple of environment variables (put them in a .env file — see
.env.example):
| Variable | What it's for |
|---|---|
APP_URL |
Address of the receipt-gatherer web app (required) |
WORKER_AUTH_TOKEN |
Shared secret the worker uses to read jobs |
WORKER_DEFAULT_FORM_ID |
Form to use if a job doesn't say (default: payment_request) |
The worker uses the same saved login as suu forms — run suu forms login first.
Where suu keeps things
Everything lives in one folder: ~/.suu (saved logins, downloads). Delete it, or run
suu logout, to start fresh. Advanced users can move it with the SUU_HOME env var.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file suu-0.1.1.tar.gz.
File metadata
- Download URL: suu-0.1.1.tar.gz
- Upload date:
- Size: 82.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
563a811be454c95957b662201748ccdd8fc73bb65d9c5d20dbcff0550433d929
|
|
| MD5 |
762472dfdf8be7b2d68f8075ac54eae1
|
|
| BLAKE2b-256 |
ec328fa7ea5da1aa2bae26411f9e3f9443f71e0e6fcac5b1e2a674156120d90d
|
Provenance
The following attestation bundles were made for suu-0.1.1.tar.gz:
Publisher:
release.yml on MaybeItsAdam/suu
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
suu-0.1.1.tar.gz -
Subject digest:
563a811be454c95957b662201748ccdd8fc73bb65d9c5d20dbcff0550433d929 - Sigstore transparency entry: 1839881203
- Sigstore integration time:
-
Permalink:
MaybeItsAdam/suu@bee097e5521e024df2f2fc730778f5203e9cd922 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/MaybeItsAdam
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@bee097e5521e024df2f2fc730778f5203e9cd922 -
Trigger Event:
push
-
Statement type:
File details
Details for the file suu-0.1.1-py3-none-any.whl.
File metadata
- Download URL: suu-0.1.1-py3-none-any.whl
- Upload date:
- Size: 88.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2f51e8ffd293450116fa0a185fa9bf4452f98ae46d0809e4fb98627f9cf06f1
|
|
| MD5 |
305e1d216f8e8f0efec3b11585ee1636
|
|
| BLAKE2b-256 |
2653a878d1d6ff49c3686f3dd48a6de6c8a36b02b9acd569d10f8ebed6fd26e8
|
Provenance
The following attestation bundles were made for suu-0.1.1-py3-none-any.whl:
Publisher:
release.yml on MaybeItsAdam/suu
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
suu-0.1.1-py3-none-any.whl -
Subject digest:
d2f51e8ffd293450116fa0a185fa9bf4452f98ae46d0809e4fb98627f9cf06f1 - Sigstore transparency entry: 1839881210
- Sigstore integration time:
-
Permalink:
MaybeItsAdam/suu@bee097e5521e024df2f2fc730778f5203e9cd922 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/MaybeItsAdam
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@bee097e5521e024df2f2fc730778f5203e9cd922 -
Trigger Event:
push
-
Statement type: