Loading...
Loading...
Develop a Base44 app remotely inside Base44's cloud sandbox using your own agent — no local checkout and no deploy/push commands. The implementation is remote: writing a resource file into the sandbox is what ships it (backend functions, entities, and agents all auto-sync from the file you write), and OAuth connectors are set up against the remote app via MCP tools or the projectless `base44 connectors` CLI. This skill is the place for learning what you can author in the sandbox, how backend functions, entities, and agents are structured, and how to connect a connector without a local filesystem. Triggers on 'develop my Base44 app remotely', 'no local files', 'cloud sandbox', 'create an entity/agent remotely', 'connect a connector remotely', 'bring my own agent', or any work editing a Base44 app inside a sandbox.
npx skill4agent add base44/skills base44-sandboxbase44 sandboxbase44 sandboxread_filewrite_fileedit_filerun_commandgreplist_directorycreate_checkpointsandbox readsandbox writesandbox editsandbox runsandbox grepsandbox lssandbox checkpointbase44-remote-devCheck these references first. This skill and its siblings (,base44-remote-dev) are the source of truth — consult them before searching the web. See Reference order & the complete README.base44-sdk
base44 deploybase44 functions deploybase44 ... pushbase44 createbase44 scaffolddeploypushbase44 connectors--app-idrun_commandsandbox runnpm run buildnpx tsc --noEmitnpm run lintbase44-remote-dev| Resource | Status in the sandbox |
|---|---|
Backend functions ( | ✅ Supported — write the files; they deploy from the sandbox. |
Entities ( | ✅ Supported — write the |
Agents ( | ✅ Supported — write the |
Frontend code ( | ✅ Supported — edit normally; HMR/preview reflects it. Use the |
| Connectors (OAuth integrations) | ✅ Supported — set up via the connect flow below (MCP tools or |
base44/functions/entry.tsbase44/functions/<name>/function.jsoncbase44/functions/
process-order/
entry.tsDeno.serve()npm:import { createClientFromRequest } from "npm:@base44/sdk";
Deno.serve(async (req) => {
const base44 = createClientFromRequest(req); // inherits the caller's auth
const { orderId } = await req.json();
const order = await base44.entities.Orders.get(orderId);
return Response.json({ success: true, order });
});entry.tscreateClientFromRequest(req)base44.asServiceRole.…Deno.env.get("KEY")Response.json(body, { status })base44-clifunctions-create.mdfunction.jsoncentry.tsCalling the function from the frontend:returns the raw axios response — your function's JSON is onbase44.functions.invoke(name, data)(.data), not the top-level object, and it throws on non-2xx (error body atconst result = res.data). See theerr.response.dataskill'sbase44-sdkfor details.functions.md
.jsoncbase44/entities/base44 entities pushdeploy{kebab-case}.jsoncteam-member.jsoncTeamMembername/^[a-zA-Z0-9]+$/snake_case// base44/entities/task.jsonc
{
"name": "Task",
"type": "object",
"properties": {
"title": { "type": "string", "description": "Task title" },
"status": { "type": "string", "enum": ["todo", "doing", "done"], "default": "todo" },
"due_date": { "type": "string", "format": "date" },
"board_id": { "type": "string", "description": "Owning board" }
},
"required": ["title"]
}stringnumberintegerbooleanarrayobjectbinarydatedate-timeemailuriuuidfilerichtextbase44-clientities-create.mdrls-examples.mdentities push.jsoncbase44/agents/base44 agents pushdeploy{agent_name}.jsoncsupport_agent.jsoncname/^[a-z0-9_]+$/// base44/agents/support_agent.jsonc
{
"name": "support_agent",
"description": "Brief description of what this agent does",
"instructions": "Detailed instructions for the agent's behavior",
"tool_configs": [
{ "entity_name": "tasks", "allowed_operations": ["read", "create", "update", "delete"] },
{ "function_name": "send_email", "description": "Send an email notification" }
],
"whatsapp_greeting": "Hello! How can I help you today?"
}namedescriptioninstructionstool_configs[]whatsapp_greetingentity_nameallowed_operationsreadcreateupdatedeletefunction_namedescriptionbase44-cliSKILL.mdagents pushagents pullDeclarative scopes — read before you set. Connecting a connector replaces its scope set with exactly the scopes you pass (it does not merge). Any scope you omit is removed and the user is re-prompted to consent. Always list the connector's current scopes first and pass the complete desired set (the ones you want to keep plus any new ones).
OAuth needs a human. Connecting returns an authorization URL the user must open in a browser to sign in and consent — you cannot complete it yourself. After they finish, re-list to confirm it's connected and to read the granted scopes (a provider may grant fewer than you requested).
base44-remote-devappIdlist_connectorsapps:readinitiate_connector_connectionapps:writesandbox:writelist_connectors{ appId, integrationTypes? }integrationTypesintegrationTypesinitiate_connector_connection{ appId, integrationType, scopes, connectionConfig? }scopesalready_authorized: trueredirect_urllist_connectorsOn appId <APP_ID>: call list_connectors to read googlecalendar's current scopes,
then initiate_connector_connection for googlecalendar with the full scope set
(existing + the calendar.events scope I need). Give me the authorization URL.--app-idbase44 connectors--app-idBASE44_APP_ID.app.jsoncconfig.jsonc# 1. See available integration types for the app
npx base44 connectors list-available --app-id <APP_ID>
# 2. Initialize the connector and start OAuth (sets it to EXACTLY these scopes).
# Non-interactive: prints the authorization URL. Interactive: also opens the
# browser and polls until authorized.
npx base44 connectors initiate --app-id <APP_ID> \
--integration-type googlecalendar \
--scopes https://www.googleapis.com/auth/calendar.readonly https://www.googleapis.com/auth/calendar.events
# 3. (optional) Fetch the resulting connector config
npx base44 connectors pull --app-id <APP_ID> --dir ./connectors--scopeslist-availablepullThis is the only Base44 CLI use that belongs in remote-dev — it targets a remote app by id with no local project and no deploy step. It is not a contradiction of the "no CLI" rule above, which is about local-project/deploy commands.
base44.asServiceRole.connectors.getConnection(integrationType)accessTokenconnectionConfigfetchimport { createClientFromRequest } from "npm:@base44/sdk";
Deno.serve(async (req) => {
const base44 = createClientFromRequest(req);
// App-scoped OAuth token — backend / service role only.
const { accessToken, connectionConfig } =
await base44.asServiceRole.connectors.getConnection("googlecalendar");
const events = await fetch(
"https://www.googleapis.com/calendar/v3/calendars/primary/events",
{ headers: { Authorization: `Bearer ${accessToken}` } },
).then((r) => r.json());
return Response.json({ events });
});getConnection()getAccessToken()connectionConfigbase44-sdkconnectors.mdbase44-remote-devbase44-sdkhttps://app.base44.com/api/sandbox/<APP_ID>/local-agent/readme.md…/api/sandbox/<APP_ID>/claude-web/readme.mdbase44-remote-devlist_directoryread_filegrepsandbox lssandbox readsandbox greprun_commandsandbox runnpm run buildnpx tsc --noEmitget_app_preview_urlbase44-remote-devcreate_checkpointbase44 sandbox checkpoint --name "..."base44-remote-dev