Keeping the lights on.
The Afterhours operator guide
First visit
Register an Afterhours account with your email, username and password. Enter a community invitation after signing in. The owner uses the private setup invitation supplied separately; public registration never grants administrator access.
Account recovery
Sign in with either your email or username. Account & security lets you change your password and sign out. Verification and password reset need configured transactional email; their screens explicitly report when delivery is unavailable. The operator must set RESEND_API_KEY and EMAIL_FROM, verify the sender domain, test delivery, then enable REQUIRE_EMAIL_VERIFICATION.
Bring your people
Use “Invite your people” to create a seven-day invitation with five uses. Share the invitation link yourself. Visitors can reach room.zaibatsu.live without ChatGPT, then sign in with their own Afterhours account. An invitation or administrator role cannot open somebody else’s direct messages.
Rooms & members
Use the plus beside a room category to create a text or voice room. The room menu edits its topic, minimum role, posting restriction, and selected members. Click a member to start a direct conversation or manage their role. The owner cannot be removed or demoted here.
Connect voice
The microphone processor is included. Group voice needs a LiveKit server or a LiveKit Cloud project. Configure these server-side Site values:
LIVEKIT_URL=wss://your-voice-host LIVEKIT_API_KEY=your-api-key LIVEKIT_API_SECRET=your-server-secret
Use the source bundle’s deploy/ examples and docs/DEPLOYMENT.md for ports, TLS, TURN relay, and a local setup. Do not paste secrets into messages. Until configured, the app explains that voice is unavailable and does not request your microphone.
Use a top-level HTTPS application page for voice. Embedded microphone permissions vary and have not been qualified. If the embedded view denies access, open this Site directly in your browser.
GIFs & media
Direct GIF, PNG, JPEG, and WebP uploads work without a provider account. The default is 8 MB per upload, four attachments per message, and 1 GB total community storage. Change MAX_UPLOAD_MB and MAX_STORAGE_MB in the Site settings.
Search uses a browser-direct GIPHY adapter. Add GIPHY_API_KEY after obtaining a key. Beta access is limited to 100 calls per hour; production requires provider approval and pricing discussion. See GIPHY’s requirements.
Maintenance
Community → About includes unused/deleted media cleanup and a voice-permission enforcement retry. Source migrations are additive; save a version before updates. Read docs/BACKUPS.md before relying on this app for irreplaceable conversations.
Release status
| Capability | Evidence / remaining work |
|---|---|
| Persistent text and private media | 43 local API/storage assertions passed, including concurrent retries and runtime restart. Tests inject identities at the community identity boundary. A separate suite tests real password sessions, verification and recovery tokens. |
| Noise engine | Real RNNoise WASM executed in synthetic tests. Speech quality and physical microphone behavior remain unqualified. |
| Group voice | LiveKit integration implemented. Server credentials, cross-network three-person test, and TURN verification are still required. |
| Desktop | Windows/Linux packaging source provided. See the downloads page and source release report for which builds actually completed. |
Message synchronization polls every 1.2 seconds while the conversation is visible. Presence refreshes every 15 seconds. This release does not use a WebSocket event bus, and it has no measured participant-capacity claim.
LiveKit may accept an already issued voice token until its two-minute expiry after a ban. The server removes connected participants and denies new tokens. An unused token held by an absent user can remain valid on Cloud as well; absolute immediate revocation of a cached token is a remaining hardening requirement. A failed voice eviction is reported and can be retried.
