Agent-first CLI for inspecting, matching, and submitting attendance codes.
Project description
Always Attend
An attendance CLI built for agents.
Always-Attend inspects what is open, collects evidence, matches candidates, and submits only when it is confident.
Always-Attend does what most people do manually: find the code, figure out which slot it belongs to, and submit it. It checks what's actually open, pulls candidates from Gmail, Moodle, Ed, and GOG, and submits only when it's confident.
It's built to be run by an agent. The external sources are eyes, and attend is the hand. The agent is the one that decides.
Philosophy
Always-Attend checks before it acts, looking at what's actually open, then gathering evidence from multiple sources before making a move.
This makes it composable with AI agents in a way that scripts rarely are. An agent can inspect, reason, and decide, or hand off entirely and let Always-Attend run the loop. Either way, the result comes back as structured JSON, so the agent knows exactly what happened and what's left.
For Agents
Copy this prompt and give it to your agent:
Bootstrap always-attend on this machine.
Read and follow:
https://raw.githubusercontent.com/bunizao/always-attend/main/skills/BOOTSTRAP.md
Resolve any issues you encounter autonomously before moving to the next step.
Quick Start
uv tool install always-attend
attend setup
What It Does
- Inspect the attendance site DOM before guessing from external sources
- Collect structured code candidates from Gmail, Moodle, Ed, and GOG
- Package text and image evidence for multimodal reasoning
- Submit guarded high-confidence matches
- Report rejected, locked, and unresolved items in JSON
Story
The following is excerpted from a reflection I wrote in my FIT1045 H3 report.
I've been developing Always-Attend for two months now. There are already more than 150 commits, and the project has grown from a small 500-line script into something I'm genuinely proud of. Today it has over 30 Python files and around 6,000 lines of code. Modern, elegant, and useful, something I believe many people would enjoy.
Along the way, AI helped me move faster. Codex and Claude Code set up test frameworks, caught bugs, and iterated alongside me. But the thinking was always mine, the architecture, the decisions, the refactoring over details no one would ever notice.
Then ChatGPT Atlas launched. I watched it find the attendance code in Gmail, open a GitHub issue, and fill the form, all on its own. For a moment, I thought: Always-Attend doesn't matter anymore. It felt like every startup story I'd heard, quietly replaced by something shinier and better-funded.
I kept building anyway. Not to compete, but to finish what I started.
Somewhere in that process, the project stopped being just a tool. It became a record of how I think, my curiosity, my patience, and the slow satisfaction of watching something come alive line by line.
That was then. Now, Always-Attend is leaning into what once felt like a threat. The next chapter is agentic, less scripting, more thinking. Less automation, more autonomy. The tool that once felt obsolete is still figuring out what it wants to be when it grows up.
License
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 always_attend-0.2.0.tar.gz.
File metadata
- Download URL: always_attend-0.2.0.tar.gz
- Upload date:
- Size: 97.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b86254f45f72cc0b5919d4862c7d082799e6269671d22357181324edcd0f236
|
|
| MD5 |
5f96b055884bffa75ee91f2e7963602d
|
|
| BLAKE2b-256 |
130a4b84259292665e6b8f02bf9ad567fd92fee323c388760a6305f53aa77dce
|
Provenance
The following attestation bundles were made for always_attend-0.2.0.tar.gz:
Publisher:
release.yml on bunizao/always-attend
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
always_attend-0.2.0.tar.gz -
Subject digest:
0b86254f45f72cc0b5919d4862c7d082799e6269671d22357181324edcd0f236 - Sigstore transparency entry: 1341836617
- Sigstore integration time:
-
Permalink:
bunizao/always-attend@ad653b7e19b9a1cbe23fa6fa0011ffd559951a3c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/bunizao
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ad653b7e19b9a1cbe23fa6fa0011ffd559951a3c -
Trigger Event:
push
-
Statement type:
File details
Details for the file always_attend-0.2.0-py3-none-any.whl.
File metadata
- Download URL: always_attend-0.2.0-py3-none-any.whl
- Upload date:
- Size: 99.3 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 |
ec4177ad08ded502731df8f7cb5ecbf90d9403a4784cbe3e31b7d938207faf5f
|
|
| MD5 |
cc74ed7df34d592b28e80f18cfb18ae3
|
|
| BLAKE2b-256 |
3058df4f8248f95ef07f14ffc1ec0377d144f9b6b4090d0eecdd7eb0fbeecabc
|
Provenance
The following attestation bundles were made for always_attend-0.2.0-py3-none-any.whl:
Publisher:
release.yml on bunizao/always-attend
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
always_attend-0.2.0-py3-none-any.whl -
Subject digest:
ec4177ad08ded502731df8f7cb5ecbf90d9403a4784cbe3e31b7d938207faf5f - Sigstore transparency entry: 1341836624
- Sigstore integration time:
-
Permalink:
bunizao/always-attend@ad653b7e19b9a1cbe23fa6fa0011ffd559951a3c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/bunizao
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ad653b7e19b9a1cbe23fa6fa0011ffd559951a3c -
Trigger Event:
push
-
Statement type: