Service lifecycle
The whole path a software service takes through Aidrop: create, get the code in, build, open the address — and which steps a person must perform.
A Service is one deployable piece of a Project — a frontend, a backend, a
worker: one repository, one runtime, one address, and the audit trail of what
was done to it, kept together so the next person or assistant can continue
the work without reconstructing it from old chats. The Project is the
product those pieces make up; projects_list and project_create are where
one starts.
This page is the map. Each step links to the tool that performs it.
1. A Service is made by building one
There is no create call. service_build makes the Service: name
the Project it belongs to and a name for the deployable, and the first call
creates it. A later call with the same project_id and name builds that same
Service again, so repeating the call never leaves a second one behind. Pass
service_id instead once you have one.
A Service has no shape until code is pushed to it. Nothing is read out of the repository to decide what it is. What it is, and how it builds and runs, is what the agent passes to that first build — because the agent wrote or read the code and Aidrop did not. A starter was chosen from a description until 2026-09-01, sixteen monorepo shapes each implying a runtime contract; the whole registry is gone.
The repository is the Team’s, not the Service’s. It exists before any
Service builds from it, one repository may back several Services, and the first
service_build links one to the Service for good. Find it with
repositories_list or make one with repository_create.
The runtime settings are recorded by the build, not before it. The port the
application listens on, its health path, its size, how the image is built and
the names of the values it reads all arrive with the first service_build —
a runtime profile is bound to a revision by its table’s contract.
Its address answers from that first successful deploy, and it is open to the internet — see The address.
If the repository might already back an Aidrop Service, read repositories_list
before creating a duplicate: it says which Services build from each repository.
2. Get the code into a repository
Two paths, depending on where the code lives. Either way the repository is
linked to the Service by the first service_build, not by a step of its own.
GitHub. A person installs the Aidrop GitHub App for the account — this is
a browser step and an agent cannot do it. The repository then appears in
repositories_list, and Aidrop syncs it on push.
Nothing to bring yet, or code only on a local disk. Aidrop hosts the repository in the Team’s own Git service:
- An agent with a local
gitclient callsrepository_createwith a name, which makes an empty repository and returns a push credential for the agent’s owngitto use;repository_getreturns the same credential again for a repository that already exists. - An agent with no shell at all — a chat-only client — has no path to get code in. Aidrop accepts no uploaded archive and never commits on your behalf, so such a session can read and remember but cannot start a codebase. Push from a terminal, or use an existing GitHub repository.
Which branch builds is stated, not assumed. service_get’s
repository carries branch. A repository Aidrop created for you is main
and has no other; an imported repository keeps the default it already had,
and only that branch is built — a push to any other is never deployed. Pass
branch to service_build to build, and from then on follow, another one.
3. Build
service_build builds the head of the tracked branch and, when the build
succeeds, deploys the image to the Service’s address — one call, queued,
minutes long. That address is on the open internet from this first deploy. The first call links the repository and
records the runtime settings:
| Setting | What it decides | Default |
|---|---|---|
repository_ref |
The repository this Service builds from, from repositories_list or repository_create; linked for good. |
none — required the first time, not accepted differently afterwards |
container_port |
The port the application listens on inside the container. | none — required the first time |
health_path |
The HTTP path that answers once the application is up. | / |
resource_class |
The bounded CPU/memory envelope — see sizes. | the smallest size the plan includes |
runtime_kind |
How the application serves traffic. | container |
build_type |
nixpacks infers the build from the repository and needs no Dockerfile; dockerfile builds your own. |
nixpacks — Aidrop does not inspect the code to choose |
build_dockerfile_path |
Which Dockerfile a dockerfile build reads, with its file name, relative to the repository root — build/Dockerfile.api. The root is the build context whatever the path. |
none — required with build_type: dockerfile, refused with nixpacks |
required_secret_names |
The names of the Project values this Service reads at run time — the selection as well as the requirement: exactly these reach its environment, and a Project value it does not name never does. | none |
Every later call keeps them unless one is passed again. A build is refused up
front — before a run is opened — for the reasons it would otherwise stop on:
a repository the Team does not have or the App cannot read, a named value the
Project does not hold, a size the plan does not include, hosting paused. Values
are stored on the Project — by a person in the dashboard, or by an agent with
project_secret_set — and no tool ever answers one back.
The settings cannot carry arbitrary Docker options, Compose, host configuration, volume paths, commands, or secret values — that boundary is what keeps Managed Runtime from becoming general-purpose hosting.
4. Read how it went, fix, build again
service_get is the one call to poll. Its build is the furthest
point reached (created → built → checked → deployed → addressed) with a
status of running, succeeded, stopped or superseded, and its
next_step names the one call that follows: wait, read the log, fix and push,
or start the application. Its deployment is the latest attempt, while
application.deployment_id, application.commit_sha and application.tag
identify what is actually serving the address. A later failed attempt does not
make an earlier active revision disappear.
service_logs is the latest build’s log, credential-redacted and bounded.
A build that failed says why there; the agent reads it, changes the code,
pushes, and calls service_build again. A run that stopped before a build was
queued — no builder available, no settings — answers its stop reason instead.
Two things account for most first builds that fail: nothing listening on the
PORT the runtime hands the container, and an image that exits before it
serves. The runtime_envelope service_get answers is what settles both before
a build is spent: its resources name the port, its runtime_rules say what a
container may and may not do here, and its dockerfile — for a named runtime
kind — is one that binds that port and runs under those rules.
5. The address
There is no separate production, and no lock. A Service has one address, and deploying is what opens it: anyone holding the URL can reach the application, and nobody needs an aidrop.it account.
It was closed by default until 2026-09-09 — a preview password, a forward-auth
gateway, and a visibility argument to move between the two. All of it is
gone. Say what a deploy does before the first build, not after it.
service_stop pauses the application — the container stops and the
address stops answering — and service_start resumes it.
Every build keeps its image under a tag, the first twelve characters of
its commit, and the registry keeps every image a build pushed.
service_tags_list lists them; service_start with a tag starts that
image without rebuilding, under the settings that build ran with. A rollback
is that call with an older tag. Nothing is promoted and nothing is rebuilt:
the image that ran is the image that runs.
Promotion into a second application, behind a human review, was how this worked
until 2026-08-23. It asked somebody building a landing page to learn staging and
an approval queue in order to show their work to a client, which is the wrong
price for the thing they actually wanted. The five separate calls that
remained after it — index, preflight, profile, address, deploy — became one
service_build on 2026-09-02, and preflight itself went on 2026-09-09:
aidrop.it runs no analyser over a customer’s repository, and a build is the
only thing that says whether a revision works.
6. Keep it continuable
What the next person or assistant needs to continue this Service lives in the
repository — CLAUDE.md and its equivalents, the changelog, the commit
history — and in the Service’s audit trail, which records every tool call and
every build.
Knowledge records, work instructions, secret-pattern findings and the production publish review were a separate store on the Service until 2026-09-05, when they were removed: what a Service is worked on by is what its repository says, where the next session reads it anyway. Credential-shaped files are still withheld from the indexed snapshot; what changed is that nothing keeps a list of them afterwards.
What only a person can do
Not a limitation to work around — these are the points where a human decision is the product:
- Installing the GitHub App.
- Entering runtime values. An agent can learn a value is required; it can never read or write it.
- Confirming that an address is made public, that an application is paused, that a billed service is created or deleted, and that a Project or Service is archived.