Features
- Guild admin access — Server admins (users with Administrator or Manage Guild permissions, or server owners) are now automatically granted scoped access to the dashboard without manual approval.
- Guild-scoped data — Guild admins see only panels, events, backup options and announcements belonging to their own guilds.
- Role badge in sidebar footer — "Timely Admin" (blurple) and "Guild Admin" (grey) labels make the access level immediately visible.
- Collapsible sidebar — Click the header to collapse or expand the sidebar on desktop. State is persisted in
localStorage.
- Mobile sidebar — A hamburger button in the top bar slides the sidebar in from the left with a backdrop overlay.
- Announcement enhancements — The edit form now pre-loads the existing embed. A title field and colour picker with 8 preset swatches are available.
- Discord dark theme — All dashboard pages use a custom Tailwind
dc-* colour palette matching the Discord client's dark mode.
- Favicon — The bot avatar is shown as the browser tab icon across all dashboard pages.
Fixes
- Mobile viewport overflow — Sidebar now uses
height: 100dvh instead of 100vh.
- Hamburger toggle — Correctly closes an already-open sidebar.
- Table overflow — All data tables are wrapped in
overflow-x-auto containers.
- Main content scrollability — Added
min-h-0 to the flex item.
- Horizontal page scrollbar — Replaced
overflow-auto with overflow-y-auto overflow-x-hidden.
Docs
- Privacy Policy updated to reflect
identify+guilds OAuth scope.
- Terms of Service updated to describe the
guilds scope and guild admin auto-detection.
Full Changelog: v1.7.2 → v1.8.0
Fixes
- Re-validate admin status against the database on every authenticated request — a revoked admin can no longer continue using the dashboard until their session expires.
Full Changelog: v1.7.1 → v1.7.2
Infrastructure
- CI matrix build — bot and web Docker images are now built as separate jobs in a matrix strategy, reducing total CI time.
Full Changelog: v1.7.0 → v1.7.1
Features
- Admin dashboard — Full web-based admin interface (FastAPI + Jinja2 + Tailwind CSS) as a separate Docker service on port 8080. Login via Discord OAuth2.
- Full CRUD parity — Every slash command now has a web equivalent: panels, appointment types, exclusion roles, role toggle buttons, events.
- Announcements in dashboard — Send a formatted embed to any panel's channel directly from the browser.
- Backup & restore in dashboard — Download a JSON.gz export or upload and restore one via a file input.
- Read-only REST API — External applications can query Timely data via
/api/v1 endpoints secured by API keys. Endpoints: guilds, panels, events, stats.
- All participants in vote DM and calendar exports — Now includes all confirmed participants, with the organiser visually marked.
Infrastructure
- Docker split — Separate
Dockerfile.bot and Dockerfile.web. Bot runs migrations and writes a sentinel file; web waits for it.
- Root-level
.dockerignore — Correctly excludes .env, .git, .ai, __pycache__.
Fixes
- Fixed backup and restore being accessible across guilds — both operations are now scoped to the requesting guild only.
Full Changelog: v1.6.0 → v1.7.0
Features
- /timely edit_announcement — Edit an existing announcement embed with a pre-filled modal, avoiding the need to delete and repost.
Full Changelog: v1.5.1 → v1.6.0
Features
- /timely edit_panel — Edit panel properties (name, channel) in place.
- /timely edit_exclusion_role — Modify the
excludes_requesters / excludes_invitees flags.
- /timely edit_role_button — Update the label or emoji of an existing status role toggle button.
Full Changelog: v1.5.0 → v1.5.1
Features
- Status roles (exclusion roles) — Admins configure exclusion roles per appointment type. Users with a matching role are blocked from requesting or being invited.
- Self-service role toggle buttons — Panels can include up to five status role buttons. Clicking toggles the role on or off.
- Timezone support — Each appointment stores a timezone. Users can set a personal override via
/timely timezone.
- Counter-proposals — Participants can propose entirely new time slots from their vote DM. The counter-proposer takes over as requester.
Fixes
- Migrations 0003–0005 are now fully idempotent (IF NOT EXISTS).
- Fixed timezone name not being forwarded to the participant picker's slot display.
- Fixed naive datetime objects being interpreted as UTC instead of the event timezone.
- Fixed counter-proposals incorrectly accumulating slots across rounds.
- Fixed a race condition where duplicate slots from concurrent counter-proposals were not deduplicated.
Full Changelog: v1.4.0 → v1.5.0
Features
- Calendar buttons in confirmation DM — "Add to Google Calendar" and "Download .ics" buttons, both persistent across bot restarts.
- Title prefix per appointment type — Each button can have a
title_prefix (e.g. [Coaching]) prepended to every event title.
- Rotating bot status — 8 status messages cycling every 3 hours in shuffled order.
Legal
- Added
TERMS_OF_SERVICE.md and PRIVACY_POLICY.md for Discord app verification.
Full Changelog: v1.3.0 → v1.4.0
Features
- Backup & restore —
/timely backup exports the full database as JSON.gz. /timely restore reimports it.
- Cancel confirmed appointments — Requesters can now cancel confirmed events, not just open ones.
- Participant withdrawal — Participants can withdraw their acceptance via
/timely status.
- Invited events in /timely status — Participants see events they've been invited to alongside events they created.
- COMMAND_GROUP env var — Run separate prod and dev bot instances on the same server without slash command conflicts.
Full Changelog: v1.2.1 → v1.3.0
Features
- PostgreSQL + Alembic — Production-grade database with proper schema migrations.
- Rate limiting — Configurable max simultaneous open requests per user per button.
- /timely edit_type — Edit appointment type configuration with full autocomplete.
- /timely disable & enable — Pause and resume panels without deleting them.
- /timely announce — Post a formatted info embed to any channel.
- /timely status with filter — View open, confirmed and cancelled events with filter.
- Auto-cancel on all decline — If every participant declines, the event is cancelled automatically.
- EUPL-1.2 license and Contributor Covenant 2.1 Code of Conduct added.
Full Changelog: v1.1.0 → v1.2.0
Features
- Multi-panel support — Admins can create any number of panels across channels, each with independent appointment type buttons.
- Select-based datetime picker — Date, hour, minute, timezone dropdown menus. Multiple slots per request.
- 3-step appointment flow — Participant selection → time slot picker → title & description modal.
- Auto-confirm — Bot picks the slot with the highest availability after all participants reply.
- Creator status DM — Requester receives a persistent DM with cancel button and live status.
- Centralised strings — All user-facing text in
bot/strings.py for easy localisation.
Full Changelog: v1.0.0 → v1.1.0
Initial Release
- Bot entry point with cog loading and guild-level command sync.
- SQLAlchemy async models:
AppointmentType, Event, TimeSlot, Participant, TimeSlotVote.
- Admin commands:
create_panel, add_type, post_panel, list_types, delete_panel.
- Role-based participant picker.
- DM vote view with slot select and decline button.
- Auto-confirmation with iCal export (
appointment.ics).
- Docker setup with PostgreSQL and VS Code DevContainer.
- GitHub Actions CI/CD — multi-platform Docker image on GHCR.
Full Changelog: v1.0.0