sometimes giving up control can set us free https://skji.org/holder
Find a file
2026-04-27 18:50:47 +02:00
.vscode markdown lint 2026-02-18 13:13:07 +01:00
config wip(mithridate): command stores, options 2026-04-27 18:50:46 +02:00
lib wip(mithridate): better Option.to_discord/1 typing 2026-04-27 18:50:47 +02:00
priv/repo/migrations refactor permissions 2026-04-22 20:55:56 +02:00
.formatter.exs feat(dx): drop makefile 2025-09-03 17:51:24 +02:00
.gitignore add expert lsp to gitignore 2026-04-08 14:54:09 +02:00
.tool-versions chore: config refresh 2025-08-25 21:50:47 +02:00
compose.yml feat(dx): drop makefile 2025-09-03 17:51:24 +02:00
license lowercase files 2025-09-26 19:27:54 +02:00
mix.exs add /timer command 2025-09-07 00:22:14 +02:00
mix.lock add /timer command 2025-09-07 00:22:14 +02:00
readme.md unify models and their schema to make this way less of a headache 2026-02-27 20:06:28 +01:00

skji/holder

sometimes giving up control can set us free

dev

setup

  • cp config/config.{example,secret}.exs
  • fill in config/config.secret.exs
  • docker compose up -d db

running

  • mix ecto.migrate
  • iex -S mix

prod

setup

  • cp config/config.{example,secret}.exs
  • cp config/db.{dev,secret}.exs
  • fill in config/config.secret.exs and config/db.secret.exs
  • mix ecto.create

design

holder is split into 3 main components:

  1. Schema: We use a classic Ecto + Postgres setup for persistent storage of data. priv/repo/migrations/ houses the code that modifies the Postgres schema
  2. Actions: Modules under Holder.Model contain the data models and associated higher-level logic which describes each possible Action, e.g. creating a new hold. This is also where permission (or more accurately, consent) checks happen.
  3. Commands: are how users interface with holder. These are contained under Holder.Command

Commands call upon Actions, Actions modify the data through the Schema.