My profile
Voter registration
Change password
8–128 characters with at least one letter and one digit; not your username or the default password. Changing it signs out your other sessions.
Two-factor authentication
Loading…
Account
Appearance
Privacy & cookies
Candidate tracker
Upgrade Stripe
| Upgrade | States | Candidates | Covers your tracked | Price |
|---|
Purple = a 2024 swing state.
Upgrade button administrator
Applies to every account's Upgrade to track more candidates button. Sales and promo codes are on the Promotions tab.
Issue match
Pick 5–10 issues — tick "My issue" on the dashboard's national, state and local issues, or add them here — and see where your tracked candidates stand, from their votes, bills, actions and statements on record. .
Tracked
Candidate
Select a tracked candidate to see everything about them as of the last update.
Users
| Username | Name | Role | Status |
|---|
Groups
New group
Select or create a group.
Accounts
| Username | Name | Role | Status | Last sign-in | Groups |
|---|
Click an account to edit it.
Edit account
Select an account above.
Create account
New accounts must change their password at first sign-in.
New registrations
Days, weeks (Monday–Sunday), weekdays and hours are in your time zone: . The default accounts are not counted.
Registered vs. verified
Table
| Period | Registered | Verified |
|---|
By tier
| Tier | Registered | Verified |
|---|
Breakdowns cover accounts registered in the period; "verified" = how many of them have confirmed their email.
By state profile state
| State | Registered | Verified |
|---|
By day of week
| Day | Registered | Verified |
|---|
By time of day
Hours with registrations
| Hour | Registered | Verified |
|---|
Analytics
Only visitors who allowed analytics are counted (fea-0036), so totals are a lower bound. Visitors are pseudonymous: a keyed hash of a random cookie, never an account. Events older than 13 months are deleted automatically.
Pages
| Page | Views |
|---|
Dashboard views office · state
| View | Count |
|---|
Referrers
| Site | Visits |
|---|
Devices
| Device | Page views |
|---|
Page speed milliseconds · p50 / p75 / p95
| Page | Samples | Time to first byte | First paint | Largest paint | Load | Layout shift |
|---|
Good: largest paint under 2,500 ms and layout shift under 0.10 at p75 (Core Web Vitals).
Server load saved browser data cache
Cookie consent
Package sales
These are the packages buyers see after clicking Upgrade to track more candidates. Pick a discount for a package and press Apply, or use Apply to all. Buyers see the original cost struck through and the new cost.
| Promo | Candidate group | States included | Candidates | Show details | Discount | Cost |
|---|
Purple = a 2024 swing state. Discounts round to the nearest cent and never go below $0.50 (Stripe's minimum). Custom Track's discount applies to the price of the number the buyer chooses. Packages that aren't offered (Payments tab) aren't listed.
Promo code generator
Tick the packages in the Promo column above, or All packages below, then generate a code. A promo code never adds to a sale: the buyer gets whichever is larger.
| Code | Discount | Packages | Uses | Expires | Active |
|---|
A use is a paid purchase made with the code. Test opens Available Upgrades with the code entered, so you see the buyer's prices; with Stripe in test mode you can buy with a test card.
Stripe connection adm-0008
Bank account and payouts are attached in your Stripe account (identity checks and bank details stay with Stripe — this server never stores them). Open Stripe → Settings → Payouts ↗ to add the bank account, then press Verify.
Keys are stored encrypted and are write-only: they can be replaced but never displayed. A restricted key needs write access to Checkout Sessions and Refunds and read access to Balance and Account. Stripe API keys ↗
Settings
Upgrades & prices USD
| Name | States | Candidates | Price | Offered |
|---|
Groupings make every candidate in their states free to track. Defaults: swing = the seven 2024 battlegrounds (not offered since v1.31 — tick Active to offer it again); Battleground States (2026) = every state with a Senate or governor race rated Tossup, Tilt or Lean; red / blue = every state by its 2024 winner, swing states included (Trump won all seven), minus the 2024 purple states (ME, MN, NH, NM, VA) (automatic). Tier upgrades are off until you price and enable them.
Revenue & purchases
| Created | User | Upgrade | Amount | Status | Valid until |
|---|
Position classifier adm-0007
The choice applies to the next poll update (step "Analysing candidates' positions"). Answers are cached per model, so only new or changed sentences cost tokens.
Token usage & spend
Tokens per day (input + output). Hover a bar for details. Cost = tokens × the model's price at the time of use; requests for models without a price are counted as "unpriced".
By model
| Provider | Model | Requests | Input | Output | Cost | Last used |
|---|
Recent runs
| Started | Run | Model | Requests | Tokens in / out | Cost | Avg latency |
|---|
Prices USD per million tokens
| Provider | Model | Input | Output | Cache read | Tier above (input tokens) | Input above tier | Output above tier | Note |
|---|
Claude Haiku 5.5 is seeded with the rates reported in October 2026 ($0.10 input / $0.50 output per million tokens for prompts up to 100K tokens; $0.50 / $2.50 above). Verify them at anthropic.com/pricing.
Support chatbot fea-0018 · adm-0010
Signed-in users chat through this server, which forwards each message to AnythingLLM — the browser never sees AnythingLLM or its key. Pick the language model, and add more documents to the workspace, in AnythingLLM ↗ (password: ANYTHINGLLM_AUTH_TOKEN in .env).
Set up automatically
Creates an API key for this server, the workspace with the support instructions, and embeds the help guide (chatbot/midterms26-help.md). Safe to run again — it updates the instructions and re-embeds the guide when it changed.
Settings
The key is stored encrypted and never shown again.
Language model — Ollama adm-0011
The URL is as seen from inside Docker: http://host.docker.internal:11434 for the Ollama app on this computer (fastest on a Mac — it uses the GPU), http://ollama:11434 for the optional compose service (COMPOSE_PROFILES=…,ollama), or a server's address on your network. Pull a model first, e.g. ollama pull llama3.2. Saving checks that Ollama has the model, then makes it AnythingLLM's language model; "Set up" re-applies it if AnythingLLM is ever reset.
Usage
Recent errors
| Time | Error |
|---|
Only sizes, timing and outcome are kept here — the conversations themselves stay in AnythingLLM. Each user may send 30 messages per hour (CHAT_RATE_PER_HOUR).
Local database adm-0009
Tables
| Table | Rows | Size |
|---|
Connections & settings
Updates every 15 seconds while this tab is open.
Live replication — this server as primary
| Standby | Address | State | Sync | Replay lag | Behind | Since |
|---|
Replication slots
| Slot | Active | WAL kept |
|---|
Allowed standbys pg_hba.conf
| Type | Role | Address | Name |
|---|
Adds a host replication line to the managed block of pg_hba.conf, creates the role (new password, shown once) and a physical slot, and reloads PostgreSQL. Then run the shown pg_basebackup on the standby. Same as scripts/dbsync.py.
Standby servers monitored
| Name | Server | Status | Received | Replayed | Delay | Receiver |
|---|
The URL is stored encrypted and never shown again.
Sync to other databases adm-0013
Copy this app's data to PostgreSQL databases hosted elsewhere — one way, this server → the target. Check verifies compatibility (version, tables, columns, types, privileges); Sync replaces the target's app tables with one consistent copy of this database in a single transaction and then compares row counts and checksums; Verify compares them again at any time. Log sync keeps a target up to date continuously with PostgreSQL logical replication (the write-ahead log). Only the app's own tables are touched on a target. Encrypted fields (2FA secrets, date of birth, driver's license) stay encrypted — the target app needs the same encryption key.
| Name | Server | Compatibility | Last sync | Last verify | Log sync |
|---|
The URL is stored encrypted and never shown again. From the command line: scripts/dbsync.py check | sync | verify | dump | load-dump.
File dump
A zip with schema.sql, one CSV per table, restore.sql and manifest.json (row counts, SHA-256). Load it elsewhere with python scripts/dbsync.py load-dump --file … --url … (verifies the counts) or psql … -f restore.sql. It contains every account's password hash — keep it private.
Early vote refresh adm-0012
Recent refreshes
| Started | By | Result | Snapshot | Early votes | Took |
|---|
A refresh downloads the latest counts from civicAPI (about 2 minutes) and rebuilds the Early Vote view; a failed download keeps the previous counts. From the command line: docker exec midterms2026-backend python scripts/early_vote_refresh.py run (or run --if-due from cron).
Usage tiers adm-0005
Every account is on a tier; new accounts start on Base. The limit counts tracked candidates outside the account's home state (home-state candidates are free when the profile has a street address). Local updates let the account re-read its tracked candidates' sources on demand. Override the limit for one account in Accounts → Edit.
| Tier | Label | Tracking limit | Local updates | Cooldown (min) | Max per update | Accounts | Last change |
|---|
Create backup
Archive
| File | Created | By | Contents | Files | Size |
|---|
My API keys
| Name | Key | Status | Created | Last used | Expires |
|---|
Mobile apps (iOS / Android) sign in with your username and password and receive their own key automatically; each appears here, and signing out of the app revokes it. Changing your password, an administrator resetting it, or your account being disabled invalidates every key.
Create a key
Send it as Authorization: Bearer <key> (or X-API-Key) to /api/v1/…. The key is shown once; the server stores only its SHA-256 hash. Keys expire after a year; at most 10 can be active.
Audit log
| Time (UTC) | Actor | Action | Target | Detail | IP |
|---|