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/me boot 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-slim with uv; images are published to ghcr.io/kegbot/server.

  • Very old backups can now be restored directly. kegbot restore accepts 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 a Deprecation header. Protocol Buffers are no longer used anywhere in the server. kegbot-pycore users: set the api url to http://<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_workers is running (unchanged) to process them.

  • Building from source now requires bun for the frontend. Run bun install && bun run build before kegbot collectstatic; the Docker image does this automatically. For development, run bun run dev (vite, http://localhost:8000) alongside kegbot 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.js Google Analytics snippet is no longer emitted.

  • run_gunicorn was removed. Use kegbot run_server (now waitress).

  • The Docker image no longer publishes a linux/arm/v7 variant (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/version

    • POST /api/v1/login

    • GET|POST /api/v1/logout

    • GET /api/v1/get-api-key

    • POST /api/v1/devices/link

    • GET /api/v1/devices/link/status

    • GET /api/v1/devices/link/status/:code

    • POST /api/v1/auth-tokens/:auth_device/:token_value/assign

    • GET|POST|DELETE /api/v1/controllers/:id

    • GET /api/v1/drinks

    • GET /api/v1/drinks/last

    • GET /api/v1/drinks/:id

    • POST /api/v1/drinks/:id/add-photo

    • GET|POST|DELETE /api/v1/flow-meters/:id

    • GET|POST /api/v1/flow-toggles

    • GET|POST|DELETE /api/v1/flow-toggles/:id

    • GET /api/v1/kegs

    • GET /api/v1/kegs/:id

    • POST /api/v1/kegs/:id/end

    • GET /api/v1/kegs/:id/drinks

    • GET /api/v1/kegs/:id/events

    • GET /api/v1/kegs/:id/sessions

    • GET /api/v1/kegs/:id/stats

    • GET /api/v1/keg-sizes

    • POST /api/v1/pictures

    • GET /api/v1/sessions

    • GET /api/v1/sessions/current

    • GET /api/v1/sessions/:id

    • GET /api/v1/sessions/:id/stats

    • DELETE /api/v1/taps/:meter_name_or_id

    • POST /api/v1/taps/:meter_name_or_id/activate

    • POST /api/v1/taps/:meter_name_or_id/calibrate

    • POST /api/v1/taps/:meter_name_or_id/spill

    • POST /api/v1/taps/:meter_name_or_id/connect-meter

    • POST /api/v1/taps/:meter_name_or_id/disconnect-meter

    • POST /api/v1/taps/:meter_name_or_id/connect-toggle

    • POST /api/v1/taps/:meter_name_or_id/disconnect-toggle

    • POST /api/v1/taps/:meter_name_or_id/connect-thermo

    • POST /api/v1/taps/:meter_name_or_id/disconnect-thermo

    • GET /api/v1/thermo-sensors

    • GET /api/v1/thermo-sensors/:sensor_name/logs

    • GET /api/v1/users

    • GET /api/v1/users/:username

    • GET /api/v1/users/:username/drinks

    • GET /api/v1/users/:username/events

    • GET /api/v1/users/:username/stats

    • GET|POST /api/v1/users/:username/photo

    • POST /api/v1/new-user

    • GET /api/v1/stats

    • GET /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/status

    • GET /api/v1/auth-tokens/:auth_device/:token_value

    • POST /api/v1/cancel-drink

    • GET|POST /api/v1/controllers

    • GET /api/v1/events

    • GET|POST /api/v1/flow-meters

    • GET|POST /api/v1/taps

    • GET|POST /api/v1/taps/:meter_name_or_id

    • GET|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.py and must instead be supplied by env.

  • The setup-kegbot.py tool is no longer supported.

  • Built-in support and documentation for supervisor and nginx has 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 pytest

  • Internal: Now using rq for 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)

  • New command kegbot bugreport collects various system information.

  • Bugfix: Crash on end keg button (#326).

  • Bugfix: Unicode error during kegbot upgrade (#328).

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)

For versions prior to 1.0, see Pre-1.0 Changelog.