Calendaring app for shift-workers to enter their uneven work schedule more easily
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Adam Piontek 33d36ed713 adding some prefetching, and changing how static files are handled 1 year ago
assets implement custom favicon 1 year ago
config removing prod.secret.exs from version control 1 year ago
lib adding some prefetching, and changing how static files are handled 1 year ago
priv minor adjustments to be in line with bones73k 1 year ago
test much progress on shift assigning & app navigation 1 year ago
.formatter.exs Create phoenix project 2 years ago
.gitignore updated gitignore & readme 1 year ago
.iex.exs month & shift navigation progress 1 year ago minor readme edit 1 year ago
mix.exs some improved code via credo, sobelow 1 year ago
mix.lock updated dep 1 year ago


Calendaring app for shift-worker shift tracking, with support for CSV export and sharing work schedule with others.

Written in Elixir & Phoenix LiveView, with Bootstrap v5.


  • Ability to edit shifts?
  • Proper modal to delete shifts?
  • Allow all-day items for notes, or require hours even for sick days?


New versions

When improvements are made, we can update the deployed version like so:

cd /opt/shift73k
git pull
mix deps.get --only prod
MIX_ENV=prod mix compile
# might not be needed:
MIX_ENV=prod mix ecto.migrate
# rebuild static assets:
rm -rf priv/static/
npm run deploy --prefix ./assets
MIX_ENV=prod mix phx.digest
MIX_ENV=prod mix release --overwrite
# test starting it:
MIX_ENV=prod _build/prod/rel/shift73k/bin/shift73k start

systemd unit:

Description=Shift73k service

ExecStart=/opt/shift73k/_build/prod/rel/shift73k/bin/shift73k start
ExecStop=/opt/shift73k/_build/prod/rel/shift73k/bin/shift73k stop


nginx config:

upstream phoenix {
  server max_fails=5 fail_timeout=60s;
server {
  location / {
    allow all;
    # Proxy Headers
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Cluster-Client-Ip $remote_addr;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_redirect off;
    # WebSockets
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://phoenix;