change management · for the people who actually do the work

cambiar.world

A small, honest change-management app built for a VFX workshop — not for an enterprise rollout, not for a procurement committee, not for a Jira instance that's already lost.

Apache-2.0 · Node · SQLite · single-container deploy · API-first

View on GitHub →

What it is

cambiar.world (the name is from the Spanish verb cambiar — “to change”) is a self-hosted change-management application. You define your change types in JSON, the workshop submits changes against them, the right people approve, and the audit log keeps score. Notifications go out by email, by SMS, or to whatever calendar the workshop already lives in.

It runs as a single container next to your other infrastructure. There's no SaaS dependency, no "talk to sales", no per-seat licensing. The data file lives on your disk; you can scp it.

Who it's for

What's in the box

Lifecycle & audit

draft → submitted → approved → in_progress → implemented → closed, with rejected and rolled_back branches. Every transition is captured: who, when, from-status, to-status, any free-form comment.

Auto-approve change types skip the approval gate — for routine, well-understood work that doesn't need a human in the loop.

Approver groups

Many-to-many user/group membership. Any one member of any group assigned to a change type can approve. Submitter can never approve their own change. Admin always has override.

Optional Active Directory group sync: AD owns the group membership; cambiar.world reconciles on every login.

Notes & attachments

Markdown notes per change with full edit history. File attachments (images, PDFs, text/CSV/JSON) up to 10 MB. Attachments can be threaded under a specific note or attached to the change as a whole.

Drag a screenshot into the note where you describe what you saw.

Templates

Save a change as a template, copy a change as a new draft, instantiate a fresh draft from a template. The change type, fields, planned duration, and description carry forward.

For the work you do every Tuesday at 02:00.

Recurring changes

Mark a change as a recurring parent with a cron schedule and a timezone. At each fire, a child is spawned with the parent's blueprint and threaded back via parent_change_id.

Composes with auto-approve and the email engine for fully unattended scheduled work.

Linked changes

depends_on (directional, gates Start/Implement until prereqs are implemented or closed; transitive cycles refused) and relates_to (symmetric, soft).

For changes that line up like dominoes — “don't start the firewall change until the storage migration is verified.”

Inbound email

IMAP poller turns each incoming message into a configurable action: create_change, transition (submit / approve / start / etc.), or add_note on a referenced change. Idempotent by Message-ID — replays don't double-create.

Wire monitoring alerts straight to cambiar.world. Forward an outage email and a change opens for it automatically.

Scheduled digests

Admin-defined cron schedules render upcoming-changes digests to a recipient list (free-form addresses or user-id resolved emails). Use it to brief on-call before a maintenance window.

Operational alerts

A scheduled checker raises and resolves alerts when an approval has been pending past the SLA threshold (with per-change-type overrides), or when a recurring parent's last fire is older than the most recent expected fire.

It tells you about the things that quietly didn't happen.

Calendar & scheduling

Month / week / day / list views for upcoming changes. Week and day use a time-grid with blocks sized by planned duration; status filter; click a chip to jump to the change.

Mobile-aware: the week view scrolls horizontally on phones rather than crushing the layout.

iCal subscription

Each user gets a personal tokenized URL. Subscribe from Google Calendar, Apple Calendar, or anything that speaks RFC 5545 — and upcoming changes show up alongside their other commitments.

Google Calendar push

For workshops that want changes to land directly in a shared Google Calendar without each user having to subscribe: a service-account-driven background reconciler inserts, updates, and deletes events as changes move through the lifecycle.

Branding

Admin-uploadable logo (PNG / SVG / JPEG / WebP) and app name. Renders top-left for everyone, including the login screen. Light and dark themes, persisted per browser.

API-first

Every UI action is a documented HTTP endpoint. Build your own integrations, scripts, or Slack bots against the same surface the web client uses — no internal-only RPCs.

What it isn't

Honesty is part of the design. cambiar.world is not:

Trying it

git clone https://github.com/djsincla/cambiar.git && cd cambiar
cp .env.example .env
# set JWT_SECRET to something long and random
docker compose up -d --build
# open http://localhost:3000
# log in: admin / admin  (forced password change on first login)

SQLite database persists in ./data/. Configuration in ./config/ (mounted read-only). Restart to pick up edits to auth.json or notifications.json.

Issues & support

Bug reports, feature requests, and questions all go to GitHub Issues. There's no separate ticket queue, no support email, no "contact our team" form — every conversation lives in the open where the workshop and any contributors can see it.

Open or browse issues →

Before opening a new issue, a quick search is appreciated — many questions have been answered in closed threads.

The shape of the project