Platform
What’s running, down to the detail.
Everything on this page exists in the console today, backed by the infrastructure it describes. Where something has a limit or is not finished, this page says so.
Applications
Source in, container out — or an honest refusal.
Upload a directory with the CLI, push to a linked GitHub branch, or point at a prebuilt image. The detector reads the files you shipped; it never guesses a start command.
| Detected runtime | Evidence required |
|---|---|
Dockerfile | Dockerfile at the root — used exactly as written |
Next.js | next in dependencies; standalone output when configured |
Next.js (static export) | output: "export" — served by Nginx |
Static site (Vite) | vite plus a build script |
Static site (Create React App) | react-scripts plus a build script |
Node.js service | a start script that is not a dev server |
Python (ASGI via uvicorn) | FastAPI or uvicorn and a top-level app |
Python (WSGI via gunicorn) | Flask or gunicorn and a top-level app |
Static site | index.html at the root, nothing to build |
- Your Node version, not ours
- Node 18, 20 or 22, chosen from
engines.nodeor.nvmrc. A version with no image is refused rather than built on the wrong runtime. - Refused by name
- Development servers (next dev, vite, nodemon…), Bun and Deno projects, monorepo roots and Django without a Dockerfile are stopped with a message that names what triggered the refusal.
- Environment variables
- Secret values are masked, never written into an image layer, injected only at runtime, and every reveal is recorded in the audit log with the key — never the value.
- Contained by default
- Each container runs with memory, CPU and process limits, no-new-privileges, and on its project's network only.
- Operate it
- Runtime logs from the running container, stop and restart, a configurable health-check path, and a permanent hostname under apps.meimocloud.com.
- Custom domains
- Attach verified domains to an application; see Domains & SSL.
Deployments
Every deploy is a record you can inspect and return to.
Each deployment carries its status, the detected runtime, its image and its build log, so what shipped — and why it failed — is never a guess.
- PENDING
- BUILDING
- DEPLOYING
- SUCCESS
- FAILED
- ROLLED_BACK
- Readiness gate
- Success means the container is running, has not restarted, and its port accepted a connection from the ingress — optionally on your health-check path. What the gate proved is written into the build log.
- One at a time
- An application has at most one deployment in flight. A second request is refused with a clear message instead of racing the first.
- Roll back
- Re-run an earlier deployment's exact image — no rebuild, just a container replacement. Images from recent deployments are kept on the host for this.
- Nothing left hanging
- A reaper closes out deployments that stopped making progress, so a crashed worker cannot leave one building forever.
Databases
A dedicated engine per database.
Never a shared, multi-tenant server: each instance is its own container with its own volume, on the project's network and nowhere else.
- PostgreSQL
- MySQL
- MariaDB
- Redis
- MongoDB
- Credentials sealed at rest
- Generated per instance and encrypted with AES-256-GCM; decrypted server-side only when the platform has to act on the instance.
- Reachable only from the project
- No host port is published. Your applications reach the instance over the project network; other projects have no route to it.
- Lifecycle
- Start and stop an instance, view its connection details, and reset its password from the console.
- Metered while running
- Instance hours count the time an instance is actually running, reconstructed from recorded status changes.
Storage
Object storage where files skip the API.
Buckets live on an S3-compatible object store. Uploads and downloads use presigned URLs, so bytes travel directly between the client and storage.
- Private or public-read
- Buckets are private by default. A public bucket gets a read-only policy for its objects — nothing more.
- Presigned upload and download
- Signed URLs for a single object, valid for between one minute and one day, for browser or server use.
- Browse objects
- List a bucket's objects page by page from the console.
- Metered by real bytes
- Storage is measured in GB-months from a scan of the objects actually stored.
Domains & SSL
Proof first, then a real certificate.
A domain has to prove ownership before anything is issued, and DNS has to point at the platform before a certificate challenge is ever attempted.
01
Verify
Publish the TXT record the console gives you.
02
Point
Resolve the hostname to the platform's address.
03
Issue
Let's Encrypt certificate issued, expiry tracked, renewed automatically.
- Edge caching, honestly scoped
- Optional Nginx caching and compression per domain, with a configurable TTL, purge, and hit metrics. It runs on the platform host — a cache in one region, not a multi-region CDN.
- Application hostnames
- Every application also gets a permanent name under apps.meimocloud.com, covered by a wildcard certificate — no setup required.
Platform services
Services your application calls.
Enabled per project from the console's marketplace and metered where they do real work.
- Verified sending domains with DKIM signing, delivered direct to the recipient's mail server, with a per-organization hourly quota.
- Identity
- OAuth 2.0 clients for your own applications, with client secrets stored only as hashes.
- IoT
- A device registry where each device authenticates with its own bearer token and reports telemetry.
AI, Maps, SMS and Push have screens in the console, but no provider is connected to them yet. Requests to them are recorded as not configured rather than faked.
Teams & access
Real multi-tenancy, enforced in the database.
Organizations own billing, members and projects. Every organization's data is isolated by Postgres row-level security, not only filtered in application code.
- Owner
- Administrator
- Developer
- Billing
- Support
- Read-only
- Six roles, one matrix
- Each role maps to a fixed set of permissions, checked on every request against the membership as it is now — a revoked role stops working immediately.
- Project membership
- Owners and administrators reach every project. Everyone else needs a membership on that specific project.
- No self-promotion
- Only an owner can grant or change the owner role, nobody can change their own role, and an organization always keeps at least one owner.
- Environments
- Projects are marked development, testing or production, so the environment is visible wherever the project is.
Audit log
Know what happened, and who did it.
Deployments, resource changes, membership and role changes and billing events are written to an audit log in the same transaction as the change itself.
- Scoped and filterable
- Audit history is isolated per organization and browsable per project, filtered by category: auth, access, billing, resources, deployments and platform services.
- Retained
- Entries are kept for 400 days by default, then swept by a daily retention job.
CLI & API
Reference: the meimo CLI and API tokens.
The CLI signs in with an API token created in the console under Account → API Tokens. Progress goes to stderr and results to stdout, so meimo deploy > url.txt captures just the URL.
meimo loginmeimo projects listmeimo project use <project-slug>meimo deploy| Command | What it does |
|---|---|
meimo login | Sign in with an API token from the console |
meimo whoami | Show the signed-in account and the token's scopes |
meimo projects list | Projects in the current organization |
meimo project use <slug> | Select a project for this directory |
meimo apps list | Applications in the current project |
meimo deploy [path] | Upload, build and deploy a directory |
meimo status | Current application and last deployment |
meimo logs | Runtime logs from the running container |
meimo logs --build | Build log for the most recent deployment |
| Option | Effect |
|---|---|
--app <name|id> | Application to act on |
--port <number> | Port the container listens on (overrides detection) |
--yes | Create a missing application without asking |
--files | Print every file that will be uploaded |
--verbose | Stream the full build log while deploying |
--stdin | Read the token for meimo login from standard input (CI) |
| File | Contents |
|---|---|
~/.meimo/config.json | Your API token, mode 0600. Never commit or share. |
./.meimo/config.json | Selected organization, project and application ids. No secrets — safe to commit. |
./.meimoignore | Extra upload exclusions in .gitignore syntax. node_modules, .git, .env and .env.* are never uploaded. |
| Scope | Allows |
|---|---|
read | Any read request. Implied by every other scope; a read token never mutates. |
deploy | Changes to applications: uploads, builds, deployments and settings. |
storage | Changes to buckets and objects. |
write | Every other change — databases, domains, projects and services. |
- Scopes narrow, roles still apply
- A token can do only what both its scopes and your role allow. No token can create another token, reach the operator surface, or reveal a secret environment variable.
- Built to be found and revoked
- Tokens begin with
meimo_pat_for secret scanners, can expire, are stored only as a hash, and are revoked from the console.
curl -H "Authorization: Bearer $MEIMO_TOKEN" \ https://api.meimocloud.com/api/v1/me# the signed-in account, and this token's name and scopesBilling
Per organization, from what is actually used.
Choose pay-as-you-go or a monthly subscription per organization. Usage is computed from real signals — running intervals, stored bytes, bytes served, messages sent.
Put something real on the internet today.
Create an organization, set up billing, open a project, and run meimo deploy. The first URL is a few minutes away.