A reimplementation of aw-server in Rust.
Features missing compared to the Python implementation of aw-server:
- API explorer (Swagger/OpenAPI)
Build with cargo:
cargo build --releaseYou can also build with make, which will build the web assets as well:
make build
Your built executable will be located in ./target/release/aw-server-rust. If you want to use it with a development version of aw-qt you'll want to copy this binary into your venv:
cp target/release/aw-server ../venv/bin/aw-server-rustIf you want to quick-compile for debugging, run cargo run from the project root:
cargo run --bin aw-serverNOTE: This will start aw-server-rust in testing mode (on port 5666 instead of port 5600).
A multi-stage scripts/Dockerfile is included. It builds the web UI and the
server, and produces a slim Debian-based image containing only the aw-server
binary (the web UI assets are embedded into it at compile time).
The aw-webui submodule must be initialized before building:
git submodule update --init --recursive
docker build -f scripts/Dockerfile -t aw-server-rust:local .Run it with:
docker run -d --name aw-server-rust \
-p 5600:5600 \
-v aw-server-rust-data:/home/aw/.local/share/activitywatch \
aw-server-rust:local aw-server-rust --host 0.0.0.0Notes:
- The server binds to
127.0.0.1by default, which is unreachable from outside the container. Pass--host 0.0.0.0(as above) to make it reachable. - The server runs as the unprivileged user
aw(uid/gid10001). When using a bind mount instead of a named volume, the host directory must be writable by that uid (sudo chown -R 10001:10001 <dir>). - The database lives in
/home/aw/.local/share/activitywatch/aw-server-rust. Mount a volume there to keep it across container recreations. Images built before the switch to a non-root user stored it under/root/.local/share; to keep existing data, copy it over and fix its ownership, e.g.docker run --rm -v aw-server-rust-data:/data alpine sh -c 'chown -R 10001:10001 /data'. - The image only ships
aw-server. Theaw-syncbinary is deliberately not built, since on Linux it pulls in OpenSSL with thevendoredfeature and compiles it from source. docker buildproduces an image for the architecture of the machine running it. To target a different one, usedocker buildx build --platform linux/amd64 -f scripts/Dockerfile ....
The server reads its configuration from ~/.config/activitywatch/aw-server-rust/config.toml (or config-testing.toml in testing mode).
Available options:
# Address to listen on
#address = "127.0.0.1"
# Port to listen on (default: 5600, testing: 5666)
#port = 5600
# Additional exact CORS origins to allow (e.g. for custom web interfaces)
#cors = ["http://localhost:3000"]
# Additional regex CORS origins to allow (e.g. for sideloaded browser extensions)
#cors_regex = ["chrome-extension://yourextensionidhere"]By default, the server allows requests from:
- The server's own origin (
http://127.0.0.1:<port>,http://localhost:<port>) - The official Chrome extension (
chrome-extension://nglaklhklhcoonedhgnpgddginnjdadi) - All Firefox extensions (
moz-extension://.*)
To allow additional origins (e.g. a sideloaded Chrome extension), add them to your config:
# Allow a specific sideloaded Chrome extension
cors_regex = ["chrome-extension://jmdbkmbphoikckgkcnpoojbfeiaoaocl"]
# Or allow all Chrome extensions (less secure, but convenient for development)
cors_regex = ["chrome-extension://.*"]For details about aw-sync-rust, see the README in its subdirectory.