Your own machine
The README. One command, six questions. This is the shape everything else is measured against: whatever the tenant does for you, it must not need anything this one does not have.
Reaching your cloud
A cloud is reached at its server's address, and that is all Cloudmorrow does about the network. It ships no relay, no VPN and no name service, and a cloud never talks to cloudmorrow.com.
- At home, the box announces itself with multicast DNS as
<name>.local(the cloud's name made into a hostname:larsens.local) and as a service,_cloudmorrow._tcp, whose TXT record carriesname,versionandurl: the address to open, which ispublic_urlwhen the config has one andhttp://<name>.local:<port>otherwise.cm loginwith no server lists the clouds it finds.access_lan = falseturns the announcement off. - From outside, it is the owner's own setup: a domain and a reverse
proxy in front, with
public_urlsaying what the address is, or a VPN such as Tailscale, where the cloud is simply the box's address on it. - A hosted tenant is reached at the subdomain the platform gives it (above).
What the server does for whichever way is chosen:
- TLS is required once
public_urlis https; a plain request is answered only straight to the port from the box itself, the local network or a VPN's addresses (ENCRYPTION.md). - Sign-in is limited. Failed sign-ins are counted per visitor address
(10 in 15 minutes) and per account (20 in an hour); past either, sign-in
answers 429 with
Retry-Afteruntil the window has passed. - No cookies. A sign-in is a bearer token the page keeps in its own origin's storage.
Me → Add a device, in the web app and the terminal, is the one place
for putting the cloud on another device, at the address the person is
signed in to: curl -fsSL <address>/install.sh | sh for a computer (the
desktop app, cm and the TUI), <address>/app and a QR code of it for a
phone, <address>/mcp for an assistant. Every one signs in with the
person's own name and password.
From docs/HOSTING.md in the Cloudmorrow repository. Something wrong? A pull request there fixes it here.