A project per repository: its git URL, its notes, its secrets
cm devproject init in a folder makes it a project and reads every .env file into its vault
cm devproject update pulls the code and writes the .env files back; clone does it on a new machine
One environment per file: .env.prod is prod, .env is local, and each is written back to the file it came from
A board per project: To Do, Doing, Done
The same on the phone, the web app and the terminal: import and export .env files there too
Add it to your cloud
In your cloud, open Quills: Administration → Quills as an administrator, Me → Your Quills as anybody else. On its Catalog tab, DevProject is on the Developer shelf: open it and say yes. Its id, wherever your cloud asks for a quill by name:
id devproject
Or on the command line, as an administrator for everyone, with --mine for yourself alone:
$ cm quill add devproject
Either way your cloud shows you everything below and waits for your yes.
Standard. The installer offers DevProject when you set up a new cloud, so you may have it already. How installing works
What it adds to your cloud
Datamodels
The kinds of data it works with. On a fresh cloud everyone can read and write what it brings the moment it is installed; the install sheet says so, and an administrator narrows it with circles. Records belong to the people who write them, not to the quill: removing it leaves every one where it is. What it adds — fields of its own, datamodels of its own — stays too, unless the administrator removing it chooses to drop them.
A piece of work with a beginning and an end, that tasks and hours belong to. Shared with the people on it. Which customer it is for is a CRM Quill's to add.
Namenametext, one linerequiredEncrypted
Statusstatusone of Planned, Active, Done, ArchivedIndexed
Fields of its own on every project, readable by anyone who may read the record, never required.
Repositorydevproject.repoweb addressEncrypted
Vaultdevproject.vaulttext, one lineIndexed
Env filesdevproject.env_filesJSONEncrypted
Introduces
Card devproject.card
new, from DevProject
One thing to do on a project's board.
Projectprojectlink to Projectrequired · deleted with its projectIndexed
Titletitletext, one linerequiredEncrypted
BodybodyMarkdownEncrypted
Lanelaneone of To Do, Doing, DoneIndexed
Indexed fields are kept plain, so your cloud can sort and filter by them. Encrypted fields are encrypted before they reach the disk.
Screens
ProjectsA list of projects.
BoardA board of cards. Lanes: To Do, Doing, Done; one project at a time, chosen across the top.
Project secretsA list of secrets.
Each is a tab, drawn by your cloud itself on every surface:
Phonethe web app, made for the phone
Webthe full web app, in a browser
Terminalthe terminal app
Command linecm devproject
Assistanttools for your assistant, as you
Its own code
None. Everything it does is declared in quill.toml and run by your cloud itself.
In its own words
A Quill for Cloudmorrow: your
software projects, each with its git repository, its notes, a board, and
its .env secrets, on every machine you work on.
cd ~/code/myapp
cm devproject init # a project, and every .env file here into its vault
cm devproject list # your projects
# on another machine
cm devproject clone myapp # the repository, then its .env files written back
cm devproject update # in the folder: git pull, then the .env files from the vault
cm devproject secrets # its environments, and the file each is
cm devproject secrets import -e local -f .env # one file in (or every file, without -e and -f)
cm devproject secrets export myapp -e prod -f .env.prod # one environment out, from anywhere
One environment per file..env.prod is prod, .env.local is
local, .env is local (or default when there is a .env.local
beside it). Each environment is written back to the file it was read
from. .env.example and other templates, and any file git tracks, are
left alone.
The secrets are Cloudmorrow's. They go into the Secrets manager, in a
vault named after the project (myapp), sealed under the server's key,
and cm secret -v myapp … reaches them as well. Installing DevProject
installs Secrets.
Nothing local is lost.update never takes a key out of a .env file
that the vault does not have: that file is left as it is and named, until
you secrets import it or pass --force. Files are written mode 600.
The same on every surface. In the web app and on the phone a project's
sheet lists its environments: save each as its .env file, or read one
in; the Project secrets tab has Import .env and Export .env. In the
terminal app, i inits a folder, u updates, c clones and m imports,
on the project under the cursor.
A board per project: To Do, Doing, Done.
What it adds to your Cloudmorrow
Datamodels
extends the foundational project with devproject.repo, devproject.vault and devproject.env_files; introduces devproject.card (the board); uses secret
Screens
Projects (a list of projects: the vault, repository and env files bound), Board (a board per project), Project secrets (by vault and environment)
Requires
the Secrets Quill
Jobs, datasets, services, webhooks, APIs
none
It contains no code: everything above is declared in quill.toml.
What a list of projects does on your machine is Cloudmorrow's own
(checkout.py in the core), the same for every Quill that binds a vault.
Working on it
See CLAUDE.md and the skills in .claude/skills/. In short:
uv sync # .venv with Cloudmorrow and pytest
cm quill check # the manifest, as a server would install it
cm quill test # tests/, against the real record store and gate
cm quill dev --local # a throwaway server here, reinstalled as you save