Changelog¶
Upgrade Procedure: Please follow Upgrading for general upgrade steps.
Version 2.0.0 (unreleased)¶
A modernization release. The runtime, framework, and toolchain were all brought up to date.
Highlights
The web interface is completely new. A React single-page app (Material UI) replaces the server-rendered Django UI. Every part of the interface was rebuilt: browsing (home, kegs, drinkers, drinks, session archives, system stats with charts), the fullscreen/kiosk mode (which now updates in place instead of reloading), account management, registration and password flows, the full admin area, and the setup wizard (which now also works in production, not just
DEBUG). Public URLs are preserved, including short links (/d/<id>,/s/<id>) and links in older notification e-mails.The new API now covers everything the web UI does, including: list filtering and page sizing; a
/api/users/meboot endpoint; per-user/keg/session/system stats; keg and tap lifecycle operations (attach/start/end kegs, record drinks and spills, connect hardware); drink management and picture uploads; account self-service and authentication flows (registration, password reset, e-mail change, activation); admin user management and site settings; backups, logs, test e-mail, and bugreport endpoints; an API-driven setup wizard; and plugin settings.Kegboard v4 boards are supported natively via the new kegboard event protocol endpoint at
/api/kegboard-event. Boards pair from the admin Controllers page — an unprovisioned board announces itself and appears there automatically; approving it creates a controller and provisions its bearer token, with no key entry. Pours (device-authoritative volumes), temperature readings, and heartbeats flow in over HTTP with outage-proof queueing, and token presentments are authorized or denied by the server in a single round trip.Python 3.14 is now required (was 3.10).
Django 5.2 LTS (was 3.2).
Web server switched from gunicorn/gevent to waitress.
Packaging moved from Poetry to uv; linting and formatting moved to ruff.
protobuf upgraded to the 6.x series.
Docker image rebuilt on
python:3.14-slimwith uv; images are published toghcr.io/kegbot/server.Very old backups can now be restored directly.
kegbot restoreaccepts legacy format-1 backups (created by Kegbot v1.1.x) and upgrades their data in one step; no intermediate 1.2/1.3 install is needed.Time zone choices are now derived from the system time zone database.
A new REST API is served at ``/api/`` (previously the experimental
/api/v2/, now always enabled). An OpenAPI schema is available at/api/schema, with interactive documentation at/api/docs.The legacy HTTP API is deprecated and now lives only at ``/api/v1/``. It serves only the endpoints used by kegbot-pycore (plus the events feed); every other endpoint returns
410 Gone, and all legacy responses carry aDeprecationheader. Protocol Buffers are no longer used anywhere in the server. kegbot-pycore users: set the api url tohttp://<server>/api/v1/(the bare/api/prefix no longer serves the legacy endpoints).
Upgrade notes
Everyone is logged out once. Sessions now use the JSON serializer, so existing session cookies are invalidated on upgrade. Users simply log in again.
Background jobs enqueue on database commit. Stats and notification jobs are handed to the worker only after the surrounding database transaction commits. Ensure
run_workersis running (unchanged) to process them.Building from source now requires bun for the frontend. Run
bun install && bun run buildbeforekegbot collectstatic; the Docker image does this automatically. For development, runbun run dev(vite, http://localhost:8000) alongsidekegbot runserver(Django, now defaulting to port 8001); the dev server proxies API requests to Django.Site privacy is now enforced by the API and rendered by the frontend; the server-side privacy interstitials (and
KEGBOT_EXTRA_PRIVACY_EXEMPT_PATHS) are gone.Plugins no longer provide Django template views; plugin settings are managed through the plugin settings API. The webhook plugin is otherwise unchanged.
The legacy
ga.jsGoogle Analytics snippet is no longer emitted.run_gunicornwas removed. Usekegbot run_server(now waitress).The Docker image no longer publishes a
linux/arm/v7variant (amd64 and arm64 only).The legacy gflags-based Python API client was removed from the server package; it lives in the separate kegbot-api project.
Breaking change: the following legacy API endpoints have been removed and now return
410 Gone:GET /api/v1/versionPOST /api/v1/loginGET|POST /api/v1/logoutGET /api/v1/get-api-keyPOST /api/v1/devices/linkGET /api/v1/devices/link/statusGET /api/v1/devices/link/status/:codePOST /api/v1/auth-tokens/:auth_device/:token_value/assignGET|POST|DELETE /api/v1/controllers/:idGET /api/v1/drinksGET /api/v1/drinks/lastGET /api/v1/drinks/:idPOST /api/v1/drinks/:id/add-photoGET|POST|DELETE /api/v1/flow-meters/:idGET|POST /api/v1/flow-togglesGET|POST|DELETE /api/v1/flow-toggles/:idGET /api/v1/kegsGET /api/v1/kegs/:idPOST /api/v1/kegs/:id/endGET /api/v1/kegs/:id/drinksGET /api/v1/kegs/:id/eventsGET /api/v1/kegs/:id/sessionsGET /api/v1/kegs/:id/statsGET /api/v1/keg-sizesPOST /api/v1/picturesGET /api/v1/sessionsGET /api/v1/sessions/currentGET /api/v1/sessions/:idGET /api/v1/sessions/:id/statsDELETE /api/v1/taps/:meter_name_or_idPOST /api/v1/taps/:meter_name_or_id/activatePOST /api/v1/taps/:meter_name_or_id/calibratePOST /api/v1/taps/:meter_name_or_id/spillPOST /api/v1/taps/:meter_name_or_id/connect-meterPOST /api/v1/taps/:meter_name_or_id/disconnect-meterPOST /api/v1/taps/:meter_name_or_id/connect-togglePOST /api/v1/taps/:meter_name_or_id/disconnect-togglePOST /api/v1/taps/:meter_name_or_id/connect-thermoPOST /api/v1/taps/:meter_name_or_id/disconnect-thermoGET /api/v1/thermo-sensorsGET /api/v1/thermo-sensors/:sensor_name/logsGET /api/v1/usersGET /api/v1/users/:usernameGET /api/v1/users/:username/drinksGET /api/v1/users/:username/eventsGET /api/v1/users/:username/statsGET|POST /api/v1/users/:username/photoPOST /api/v1/new-userGET /api/v1/statsGET /api/v1/sound-events
The following legacy API endpoints are deprecated, but remain supported for compatibility with kegbot-pycore. They will be removed in a future release:
GET /api/v1/statusGET /api/v1/auth-tokens/:auth_device/:token_valuePOST /api/v1/cancel-drinkGET|POST /api/v1/controllersGET /api/v1/eventsGET|POST /api/v1/flow-metersGET|POST /api/v1/tapsGET|POST /api/v1/taps/:meter_name_or_idGET|POST /api/v1/thermo-sensors/:sensor_name
The old Kegbot mobile apps depended on now-retired API endpoints (device linking, registration, drink lists) and no longer work against this server.
Version 1.3.0 (2022-08-10)¶
For a detailed look at what’s new in version 1.3, see Kegbot Server Version 1.3 Release Notes.
Breaking Changes
Several features have been removed in order to lower code or documentation complexity, reduce maintenance, or both.
Settings are no longer read from
local_settings.pyand must instead be supplied by env.The
setup-kegbot.pytool is no longer supported.Built-in support and documentation for
supervisorandnginxhas been dropped.The Twitter, Foursquare, and Untappd plugins have been removed.
Optional support for Sentry has been removed.
Optional support for django-storages has been removed.
Optional support for memcache has been removed.
Optional support for statsd has been removed.
Optional support for django-debug-toolbar has been removed.
New features
Email configuration is now managed in the admin dashboard.
Allow deletion of tokens from web (#337)
Add mini (5L) keg size (#331)
Add drinks tab to drinker details page (#347)
Allow deleting drinks from Kegbot Admin drinks page (#348)
Don’t require user to be active in order to view the user’s details and sessions (#350)
Add a create controller view (#364)
Bugfixes
Prevent divide by zero error when keg volume is set to zero (#353)
Fixed keg list error (#353)
Fix chart (#342)
Skip notifications for inactive users (#349)
Fix compatibility with with MySQL versions later than v5.7.5 (#356)
Allow usernames with a period (#336)
Update stats and sessions when admin deletes a drink (#371)
Automatic checks for updates have been removed.
Fixed pagination not rendering correctly in the dashboard.
Media files are served in production mode (#415)
Other Changes
Upgraded to Python 3 and Django 3.
Internal: Improved static file serving (#368)
Internal: Developer tests now use
pytestInternal: Now using
rqfor worker queue
Version 1.2.3 (2015-01-12)¶
Allow users to change e-mail addresses.
Added “bugreport” admin page.
Fix invitation email footer.
Version 1.2.2 (2015-01-03)¶
Version 1.2.1 (2014-12-02)¶
Fixed run_gunicorn launcher.
Version 1.2.0 (2014-12-01)¶
Keg management improvements: The new “Keg Room” view shows kegs by status, and allows kegs to be manually moved between “available” and “finished” states.
Fancy keg graphics.
Backup file format has changed. Downgrade to v1.1 to restore from an earlier file format.
Django 1.7 update.
Flow sensing and multiuser features can be hidden.
Statistics now properly consider local timezone (#199).
Some new keg sizes are supported (#318).
Keg full volume and beverage type can be edited (#279).
Version 1.1.1 (2014-11-11)¶
API: New endpoint: drinks/last.
Newly-created meters now default to FT330-RJ calibration values.
Kegadmin: Kegs can be deleted from the “Edit Keg” screen.
The kegbot restore command can run against an unzipped directory.
Version 1.1.0 (2014-09-19)¶
Fullscreen mode.
New keg artwork.
New internal beverage fields: IBU, SRM, star rating, and color.
Version 1.0.2 (2014-08-21)¶
Bugfix: Issue #309 (cannot reset password on private sites).
Redis logging backend is configurable; see Settings (thanks Jared).
Bugfix: Issue #313 (
link/matching on usernames).
Version 1.0.1 (2014-07-21)¶
Bugfix: Issue #302 (api
status/endpoint).
Version 1.0.0 (2014-06-24)¶
Initial 1.0 release.
See Upgrading from a pre-1.0 release for upgrade instructions.
For versions prior to 1.0, see Pre-1.0 Changelog.