Conference activities and planning app.
- Clojure backend + HTMX
- Datomic
- Discord for Auth
- Integrant
- Ornament and Open Props
This will be used at Heart of Clojure, replacing the aging Eurucamp Activities App which we used five years ago (and which stopped being developed several years before that).
In the Compass app people can find the conference schedule, but also any additional activities, and they can add their own activities, unconference style.
People can star/bookmark or sign up for their favorite activities/sessions. Activity organizers can limit the capacity, so e.g. if you want to take up to 5 people to the climbing gym or go for Thai dinner with up to 8 people you can do that.
We currently only support Discord for authentication. We understand this will not please everyone, and in the future this may change, but for Heart of Clojure 2024 this will be the only auth option.
The reason is that we also use Discord as the conference chat (backchannel), so people should have an account there anyway. And this allows us to do some nice things, like create a private channel with all attendees of a certain activity.
To get started you need to set up a discord bot, and then create a
config.local.edn in the project root like this:
;; config.local.edn
{:discord/client-secret "..."
:discord/bot-token "..."
:discord/client-id "..."
:discord/public-key "..."
:discord/server-id "..."
:discord/session-channel-id "..." ;; ID of the channel where session threads will be created
:discord/ticket-holder-role "role-id"
:discord/ticket-roles
{"release-slug" "role-id"}}Livestreams are managed from Compass itself, at /admin/livestreams
(requires a crew ticket, see Admin access below). Creating a
stream there creates a signed live stream through the Mux API and stores its
id, playback ID, and allowed Ti.to release slugs in the database — there is no
:mux/streams config to hand-edit.
Compass still needs a few Mux-related config values, since these are credentials rather than data managed through the UI:
{:mux/token-id "..."
:mux/token-secret "..."
:mux/signing-key-id "signing-key-id"
:mux/signing-private-key "base64-encoded-private-key"
:mux/playback-token-ttl-seconds 43200}:mux/token-id/:mux/token-secret— a Mux API access token with Video write permission, used by the admin UI to create live streams.:mux/signing-key-id/:mux/signing-private-key— the URL-signing key used by Compass to generate playback tokens for viewers. Separate from the API token above, and from the stream key used by OBS.
Keep all of these in config.local.edn, environment variables, or system
credentials. Never commit them.
Open /admin/livestreams and fill in the form: a URL-safe Compass stream ID
(e.g. main-stage), a display title, and the Ti.to release slugs that should
have access. Optionally check "Create as Mux test stream" — Mux live
streaming, including test streams, requires a Pay As You Go or higher plan;
the Free plan supports on-demand video only. Test streams display a
watermark, stop after five active minutes, and delete their recorded asset
after 24 hours.
Submitting the form creates a Mux live stream with a signed playback policy
(and configures its recorded asset the same way), then shows the OBS server,
secret stream key, and combined ingest URL once. Use those values in OBS
under Settings → Stream → Custom: the server is
rtmps://global-live.mux.com:443/app, with the stream key entered separately
in the Stream Key field. Treat that key and the combined URL as secrets — Mux
does not show the stream key again after creation.
Deleting a stream from /admin/livestreams removes it from Compass but does
not delete the underlying Mux resource; do that from the Mux dashboard if
needed.
/admin/* routes require the signed-in user to have a Ti.to ticket whose
release slug is crew.
See [[notes.txt]] for a basic outline of what we have planned. We will (probably) not be able to do all of it this edition, but we should have the basics of creating/editing activities, and signing up for them.
Currently the initial setup is then, we have Discord OAuth working, and have a database connection, which gets pre-seeded with the talks from the schedule. The front page renders all activities, is somewhat mobile-friendly, and does dark and light mode. (important ;)
bin/launchpad dev --go
Copyright © 2024 Arne Brasseur and Contributors
Licensed under the term of the Mozilla Public License 2.0, see LICENSE.