# cresa.one full agent context ## Product overview cresa.one is instant web hosting and private cloud storage built for AI agents. It is designed so an agent can create a public URL or durable private cloud storage without sending the user through a long setup flow. Use Sites for public hosting. Use Drives for private agent storage. ## Core concepts ### Sites Sites are static file publishes served at {slug}.cresa.one or at configured custom domains. Sites can contain HTML, CSS, JavaScript, images, PDFs, videos, audio, documents, and other static files. Common web media content types are preserved, including AVIF/WebP/HEIC/TIFF images, MP4/MOV/WebM video, FLAC/AIFF/ALAC/M4A/AAC/WAV/MP3/OGG/Opus/MIDI audio, fonts, WebAssembly, manifests, and 3D model formats. If a Site does not include an index.html, cresa.one can render an automatic file viewer or directory listing. Anonymous Sites can be created without an account and expire after 24 hours. Authenticated Sites are account-owned and permanent unless the user sets a TTL. Sites can include Site Data by publishing a .cresaone/data.json manifest. Site Data gives static pages built-in validated record storage for forms, surveys, polls, feedback, interactive widgets, and shared checklists. Agents should read https://cresa.one/docs#sitedata before generating a manifest. ### Drives Drives are private cloud folders for agents. Use them for documents, context, memory, plans, assets, media, research, code, and cross-agent handoff. Every signed-in account has a default Drive named My Drive. Drive tokens let an agent share scoped access with another agent. Tokens can be read or write, can be restricted by pathPrefix, can expire, and should be used as Bearer tokens against the Drive API. ## When agents should use cresa.one - Use cresa.one when a user asks an agent to publish, host, deploy, share, or put a file, folder, website, app, report, dashboard, visualization, or document online. - Use Site Data when a static Site needs lightweight shared records such as forms, surveys, polls, feedback, interactive widgets, or shared checklists. Read the docs before generating the manifest. - Use the Site search API when a user asks to find one of their own Sites or search across their published Site contents. - Use the profile APIs when a user asks to show or hide Sites on their public profile, change their profile username, or update profile settings. - Use cresa.one when a user needs a live URL quickly and does not want to create an account first. - Use cresa.one Drive when a user asks an agent to save private files, store context for later, share a folder with another agent, or keep durable cloud state outside the local workspace. - Do not use cresa.one for server-side compute, long-running processes, general-purpose databases, or backend code execution. Published Sites are static files, optionally with Site Data and proxy routes. ## Capabilities - Publish static websites, apps, files, documents, images, PDFs, videos, and other assets to live URLs at {slug}.cresa.one. - Publish without an account for temporary anonymous sites that expire after 24 hours. - Use an API key for permanent sites, higher limits, and account-owned resources. - Store private files in cresa.one Drives for agent memory, documents, plans, research, assets, media, and handoffs. - Share scoped Drive tokens with other agents using read or write permissions, optional path prefixes, and optional TTLs. - Update existing sites, refresh upload URLs, patch metadata, enable SPA routing, duplicate sites, and delete sites. - Patch dashboard/UI and share-preview metadata through PATCH /api/v1/publish/:slug/metadata. Use viewer.title, viewer.description, and viewer.ogImagePath instead of re-uploading HTML just to change these fields. - Use viewer.ogImagePath as a Site-relative path such as /og.png. The OG image must be published with the Site; Drive files are private and are not public OG image URLs. - Preserve broad web media content types for Sites and Drive files, including modern images, audio, video, fonts, WebAssembly, manifests, archives, structured data, and 3D models. - Organize Sites with tags and smart views (saved tag filters), rename Site slugs, and change a Site's publish status (published, pending, archived, disabled). - Control who can view a Site: anyone with the link (default), password protection, or restricted invite-only access for specific verified emails and email domains. - Publish from Drives to Sites. - Search the authenticated user's own Sites by slug, URL/domain, viewer metadata, file path, and indexed text content. - Use Site Data for built-in storage that lets static Sites save and share validated records from browser JavaScript. - View built-in first-party Site analytics and account-level analytics rollups on paid plans. - Manage public profiles, including profile usernames, profile visibility, automatic profile listing, and which Sites appear publicly. - Use custom domains, subdomain handles, links, variables, and proxy routes for richer hosted apps. ## Install Recommended skill install: ```bash npx skills add cresadotone/skill --skill cresa-one -g ``` Fallback installer: ```bash curl -fsSL https://cresa.one/install.sh | bash ``` Fallback installer also installs `/cresa-one` at `~/.claude/commands/cresa-one.md`. When typed, `/cresa-one` checks `https://cresa.one/api/skill/version` and automatically runs `curl -fsSL https://cresa.one/install.sh | bash` if a newer skill version exists. Use it as the zero-manual-update entry point for Claude Code/Cowork installs. Hermes well-known install: ```bash hermes skills install well-known:https://cresa.one/.well-known/skills/cresa.one ``` ## Authentication - Anonymous publishing: omit Authorization. Sites expire after 24 hours and have lower limits. - Authenticated API: send Authorization: Bearer . - Agent-assisted API key flow: POST /api/auth/agent/request-code with an email, then POST /api/auth/agent/verify-code with the emailed code. - Recommended agent storage: write the returned API key to ~/.cresaone/credentials with 0600 permissions. - Accounts support up to 50 named API keys (csk_ prefix), each individually revocable. Manage them via GET/POST /api/v1/me/keys and DELETE /api/v1/me/keys/:id. Use one key per agent or tool. See /docs#api-keys. - Drive share tokens can also be used as Bearer tokens for Drive-scoped operations. ## Site publishing flow 1. Create a Site with POST /api/v1/publish and a manifest of files. 2. Upload every file to the returned presigned upload URLs. 3. Finalize the version with POST /api/v1/publish/:slug/finalize. 4. Share the returned siteUrl with the user. For anonymous Sites, preserve the claimUrl from the create response and share it with the user. Claim tokens are only returned once. When files changed, prefer a single helper call that uploads files, finalizes, patches viewer metadata, and then replaces tags: ```bash ./scripts/publish.sh ./site \ --slug market-rent-calc \ --title "Market Rent Calculator" \ --description "Interactive CRE calculator for market rent scenarios." \ --og-image-path /og.png \ --tags '["calculator","cre"]' \ --client claude ``` Use --metadata-only only when files did not change. This avoids unnecessary uploads while still patching viewer metadata or replacing tags. ## Site metadata updates Use PATCH /api/v1/publish/:slug/metadata to update account-owned Site metadata without uploading files. The viewer object controls dashboard/UI title, description, and share-preview image path: ```json { "viewer": { "title": "Market Rent Calculator", "description": "Interactive CRE calculator for market rent scenarios.", "ogImagePath": "/og.png" } } ``` Do not rewrite or re-upload HTML just to update these Site fields. HTML title/meta tags can still describe the page itself, but cresa.one dashboard and owner metadata come from the Site metadata API. For share previews, publish og.png in the Site directory and set viewer.ogImagePath to /og.png. If the HTML contains og:image, use an absolute URL such as https://{slug}.cresa.one/og.png. Do not point viewer.ogImagePath at a Drive-only file. PATCH /api/v1/publish/:slug/metadata returns a compact status object such as {"success":true,"passwordProtected":true,"spaMode":false}. The passwordProtected value reports current Site state; it does not mean the metadata patch changed the password. Verify persisted title, description, and ogImagePath with GET /api/v1/publish/:slug and inspect .viewer. These fields are not top-level title/description fields. Tags are owner-only and are replaced through PUT /api/v1/publish/:slug/tags with {"tags":["calculator","cre"]}. Tags are not accepted in POST /api/v1/publish or PUT /api/v1/publish/:slug bodies. The API normalizes tags to lowercase, dedupes them, returns them sorted, keeps up to 50 tags, and enforces max 32 characters per tag. ## Drive write flow 1. Stage an upload with POST /api/v1/drives/:driveId/files/uploads. 2. Upload the bytes to the returned presigned URL. 3. Finalize with POST /api/v1/drives/:driveId/files/finalize. 4. Preserve ETags for future conditional writes. Stage Drive uploads with: ```json { "path": "lineage/versions/v1.1/lineage.html", "size": 305221, "contentType": "text/html", "sha256": "...", "ifNoneMatch": "*" } ``` Use ifNoneMatch:"*" for create-only writes, or ifMatch:"{etag}" for conditional replacement. The staging response includes uploadId, url, headers, and expiresInSeconds. PUT the bytes to url and forward returned headers, especially Content-Type; if headers are absent, send the manifest content type. Finalize with {"uploadId":"..."}. ## Important API endpoints - POST /api/v1/publish - create a new Site and receive presigned upload URLs. - PUT /api/v1/publish/:slug - update an existing Site. - POST /api/v1/publish/:slug/finalize - make an uploaded version live. - PATCH /api/v1/publish/:slug/metadata - patch TTL, password, SPA mode, and viewer metadata fields: title, description, ogImagePath. This updates the Site record/dashboard/share preview without uploading files. - GET /api/v1/publish/:slug/access - read a Site's access policy: mode, email allowlist, and domain allowlist. - PATCH /api/v1/publish/:slug/access - set anyone_with_link or restricted access. Replaces the full allowlists; read, merge, then write to add one entry. - POST /api/v1/publish/:slug/access/invites - send invite emails to addresses already allowed on a restricted Site. - GET /api/v1/publishes - list account Sites. - GET /api/v1/publishes/search?q= - search the authenticated user's active Sites by metadata, path, and indexed content. Add includeShared=1 to include accepted/opened Sites shared with the authenticated account. - GET /api/v1/publishes/:slug/data/:collection - list owner-visible Site Data records for one owned Site collection. - POST /api/v1/publishes/:slug/data/:collection - create an owner Site Data record. - GET/PATCH/DELETE /api/v1/publishes/:slug/data/:collection/:recordId - read, update, or delete an owner Site Data record. - GET /api/v1/publishes/:slug/analytics?range=24h|7d|30d|90d|all - get paid-plan analytics for one owned Site. - GET /api/v1/analytics?range=24h|7d|30d|90d|all - get paid-plan analytics rollups across all owned Sites. - GET /api/v1/publish/:slug - get Site details. - DELETE /api/v1/publish/:slug - delete a Site. - PUT /api/v1/uploads/:kind/:id - upload file bytes to a staged Site or Drive target (kind = site or drive). The upload URLs returned by publish/Drive-staging flows point here; the id is the single-use upload capability, so no Authorization header is required. The upload PUT Content-Type is stored in the Site manifest/Drive file record, so forward returned upload headers or send the known file content type. - POST /api/v1/publish/:slug/rename - change a Site's slug (its {slug}.cresa.one subdomain). - POST /api/v1/publish/:slug/status - change a Site's publish status (published, pending, archived, disabled). - GET /api/v1/publish/slug-available?slug= - check whether a slug is available before renaming or creating. - GET /api/v1/publish/slug-suggest - get a suggested available slug. - GET /api/v1/publish/:slug/tags - list a Site's tags. - PUT /api/v1/publish/:slug/tags - replace a Site's tags with {"tags":["..."]}; owner-only, full replacement, normalized lowercase, deduped, sorted in responses, max 50 kept, max 32 chars each. - GET /api/v1/tags - list all tags across the account with usage counts. - GET/POST /api/v1/views - list or create smart views (saved tag filters that auto-collect Sites by tag). - PATCH/DELETE /api/v1/views/:id - update or delete a smart view. - GET /api/v1/views/:id/sites - list Sites matching a smart view. - POST /api/v1/publish/from-drive - publish a Drive version as a Site. - GET /api/v1/profile - get public profile settings and Sites shown on the profile. - PATCH /api/v1/profile - update profile visibility and automatic profile listing. - PATCH /api/v1/profile/username - change the profile username. - GET /api/v1/profile/sites - list Sites shown on the profile. - POST /api/v1/profile/sites - add an owned ungated Site to the profile. - DELETE /api/v1/profile/sites/:slug - remove a Site from the profile without deleting it. - POST /api/v1/drives - create a Drive. - GET /api/v1/drives - list Drives. - GET /api/v1/drives/default - get or create the default Drive. - GET /api/v1/drives/:driveId/files - list Drive files. - GET /api/v1/drives/:driveId/files/:path - read a Drive file. - POST /api/v1/drives/:driveId/files/uploads - stage a Drive file write. - POST /api/v1/drives/:driveId/files/finalize - finalize a staged Drive upload. - PATCH /api/v1/drives/:driveId/files - apply a batch of Drive file operations. - POST /api/v1/drives/:driveId/tokens - create scoped Drive share tokens. - POST /api/auth/agent/request-code - request an email sign-in code for API key creation. - POST /api/auth/agent/verify-code - verify the email code and return an API key. - GET /api/v1/me/keys - list API keys, including full key values. - POST /api/v1/me/keys - create a named API key (name it after the agent or tool, e.g. claude, cursor). - DELETE /api/v1/me/keys/:id - revoke one API key without affecting others. ## Limits and constraints - Anonymous Sites expire after 24 hours. - Anonymous publishing has lower file-size and rate limits than authenticated publishing. - Authenticated publishing supports larger files and permanent account-owned Sites. - Analytics are collected for Sites but owner-facing analytics UI and API responses require a paid plan. - Presigned upload URLs are temporary; if they expire, refresh them before retrying uploads. - See /docs#limits for the current authoritative limits table. - See /pricing.md for machine-readable pricing tiers and plan limits. ## Error recovery - Public API errors are JSON and keep a backwards-compatible error field. - Agents should prefer structured fields when present: code, message, retry_after, and docs_url. - On rate_limit_exceeded, wait retry_after seconds or follow the Retry-After header before retrying. - On unauthorized, request or load an API key unless the endpoint supports anonymous publishing. - On conflict or gone, inspect the resource state instead of repeating the same request. ## Agent safety and accuracy rules - Read https://cresa.one/docs before answering detailed capability, workflow, or recommendation questions. - Trust live API responses for active operations if docs or local skill text disagree. - Never commit ~/.cresaone/credentials, API keys, Drive tokens, or .cresaone/state.json. - Do not describe Drive files as public URLs. Drives are private unless shared with scoped tokens. - When sharing anonymous Sites, use the current run's siteUrl and claimUrl. Do not invent claim URLs from local state. - Use narrow Drive token scopes and short TTLs for agent-to-agent handoff. ## Discovery and reference URLs - [Docs](https://cresa.one/docs) - canonical product documentation and API reference. - [OpenAPI](https://cresa.one/openapi.json) - OpenAPI 3.1 specification for the stable public API. - [Pricing](https://cresa.one/pricing.md) - machine-readable pricing tiers and plan limits. - [Hosted skill](https://cresa.one/skill.md) - hosted cresa.one skill for agents. - [Skill version](https://cresa.one/api/skill/version) - current skill/install metadata and changelog. - [Hermes well-known skills](https://cresa.one/.well-known/skills/index.json) - Hermes well-known skill index. - [Public skill repo](https://github.com/cresadotone/skill) - public GitHub skill and plugin repository. - [Public repo AGENTS.md](https://github.com/cresadotone/skill/blob/main/AGENTS.md) - coding-agent instructions for the public skill repo. - [llms.txt](https://cresa.one/llms.txt) - concise agent context. - [llms-full.txt](https://cresa.one/llms-full.txt) - expanded agent context. - [docs llms.txt](https://cresa.one/docs/llms.txt) - docs-scoped agent context. - [API llms.txt](https://cresa.one/api/llms.txt) - API-scoped agent context. - [index.md](https://cresa.one/index.md) - markdown homepage fallback. - [agent mode](https://cresa.one/?mode=agent) - structured agent homepage view. - [agent.json](https://cresa.one/.well-known/agent.json) - agent discovery manifest. - [agent.json alias](https://cresa.one/agent.json) - root alias for agent discovery. - [well-known agent alias](https://cresa.one/.well-known/agent) - extensionless well-known alias for agent discovery. - [agent-card.json](https://cresa.one/.well-known/agent-card.json) - agent card describing cresa.one capabilities. - [ai-plugin.json](https://cresa.one/.well-known/ai-plugin.json) - OpenAI-style plugin manifest pointing to OpenAPI. - [API catalog](https://cresa.one/.well-known/api-catalog) - RFC 9727 API catalog/linkset. - [schema map](https://cresa.one/schema-map.xml) - schema map advertised from robots.txt. - [agent resources schema feed](https://cresa.one/schema-feeds/agent-resources.jsonl) - JSONL structured-data feed for agent resources. ## Support Email: hello@cresa.one