Skip to main content

Caraer CLI

Standalone developer CLI for Caraer app lifecycle management.

Install and use this package independently of the Caraer backend. It talks to the Caraer API as a thin client — no GCP credentials are required on your machine.

Requirements

  • Python 3.10+
  • A Caraer account with access to a company that can create apps

Install

From PyPI

pipx install caraer-cli
# or: uv tool install caraer-cli
# or: pip install caraer-cli

Publishing (maintainers): tag v* runs .github/workflows/publish.yml. Add a PyPI API token as the API_TOKEN secret on the GitHub pypi environment (or as a repository secret with the same name).

From source (development)

git clone <this-repo> caraer-cli
cd caraer-cli
python3 -m venv .venv
source .venv/bin/activate
./scripts/install.sh                 # pip install + shell tab completion
# or: ./scripts/install.sh --shell zsh
caraer --help

If install fails with requires a different Python, create the venv with python3.10 / python3.11 / python3.12 explicitly.

Tab completion is installed by scripts/install.sh. Restart the terminal afterward.

AI IDEs (Cursor skill)

Ship an Agent Skill so Cursor (and similar IDEs) can scaffold and validate Caraer apps correctly:

caraer skill install              # ~/.cursor/skills/caraer-apps
caraer skill install --project    # ./.cursor/skills/caraer-apps
caraer skill list

Source of truth: skills/caraer-apps. After install, start a new agent chat and ask it to create or edit a Caraer app.

Quick start

caraer auth login
# or password/CI: caraer auth login --email you@example.com
caraer company list
caraer company select <company-uuid>
caraer apps list
caraer apps select <app-uuid>   # pulls the full app folder locally

Create a new local app and push everything in one step:

caraer apps init --label "My App"
caraer apps init --private --label "Internal Tool" --auth-method API_KEY
cd my_app
# edit src/app/app.caraer.yaml, src/app/functions/, src/app/webhooks/
caraer apps push --deploy       # prompts for version (> previous) + release notes
caraer apps release version     # live semver + recent builds
caraer apps status
caraer apps local logs          # uses the only local function (or prompts)
caraer apps local logs --all    # V2 app container logs
caraer apps local dev           # local server: POST /functions/<name>
caraer apps local test --record <uuid>
caraer apps state get
caraer apps secrets list
caraer apps release rollback    # redeploy prior READY build

New apps default to workspace platformVersion: 2026.2 (App platform V2: one async container runtime per app). Use caraer apps init --platform 2026.1 only for the legacy per-function Cloud Functions model. See docs/platform_versioning.md.

apps push syncs the full app: marketplace or private-app manifest (including settings), functions, webhooks, schedules, inbound routes, and external OAuth providers. There is no separate upload command. Use --private on apps init (or caraer.json privateApp: true) so create/update go to /api/v2/apps/private*. Public apps still use /api/v2/apps/public*. Private apps are auto-installed for the creating company and cannot be submitted with caraer publish.

Add local scaffolds inside an app folder:

caraer apps add function my-action
caraer apps add options-function list-items   # LOAD_SETTING_OPTIONS loader
caraer apps add webhook --topic record.candidate.created --function my-action
caraer apps add schedule renew-watch --function my-action --cron "0 0 */6 * * *"
caraer apps add schedule         # wizard → cron presets / custom + function picker
caraer apps add inbound gmail-push --function my-action --auth SHARED_SECRET
caraer apps add setting          # wizard → appends to app.caraer.yaml
caraer apps add lifecycle-hook   # wizard → lifecycle/*.json + function
caraer apps add webhook --topic app.bar.triggered --mode HTTP --url https://example.com/hook

add schedule prompts for cron (presets or custom Spring 5–6 field expression), function, description, and enabled when run interactively without those flags. add setting writes into app.caraer.yaml by default (use --modular for a separate JSON file under settings/). add options-function (or add function --template options) scaffolds a dynamic select options loader; wire via optionsSource.serverlessFunctionName and optional optionsSource.dependsOn. add setting also asks for conditional visibility, or takes --visible-when 'other_field:EQUALS:true'; see Conditional settings. apps init does not create empty settings/ folders. Lifecycle hooks stay under src/app/lifecycle/ because they pair with function folders.

Lifecycle hooks (install / uninstall / rotate / update) and matching functions/on-* folders are created automatically by caraer apps init.

Settings sections

Optional settingsSections groups the flat settingsSchema into multiple installer cards (title, subtitle, field names). Caraer lays the cards out left-to-right, top-to-bottom, max 3 across — do not define a grid yourself.

settingsSections:
  - title: Candidate
    subtitle: Map CV fields and parsing behavior
    settings:
      - candidate_mapping
      - parse_on_cv_change

Modular files also work: src/app/settings-sections/01-candidate.json. Apps without settingsSections keep a single Settings card.

Conditional settings

A settings field can declare visibleWhen; it is shown, required and submitted only while all of its conditions hold:

settingsSchema:
  - name: custom_mapping
    label: Custom mapping for work experience
    type: SWITCH
    defaultValue: false
  - name: work_experience_mapping
    type: MAPPING
    visibleWhen:
      - field: custom_mapping
        operator: EQUALS      # default when omitted
        value: true

Operators: EQUALS, NOT_EQUALS, IN, NOT_IN (list value), IS_SET, IS_NOT_SET (no value).

visibleWhen controls presentation and validation; optionsSource.dependsOn controls when option lists reload. Hidden fields are not required, their values are dropped, and their options loader is not called.

Payload types (Node / Python)

Import serverless payload helpers from the published clients:

import type { LifecyclePayload, WebhookPayload } from "@caraer/client";
from caraer_client import LifecyclePayload, WebhookPayload

Node scaffolds add @caraer/client as a devDependency.

Only the app creator company (or super-admin) can push builds for an app.

Platform versions

CLI platformVersion App platform Notes
2026.2 (default) V2 One container per app; async deploy; poll runtimeStatus
2026.1 V1 One Cloud Function per serverless function (legacy)

Existing V1 apps are migrated to V2 via the backend Neo4j migration apps-platform-v2 (run-migration apps-platform-v2 up). New private apps and CLI scaffolds (2026.2) already use the V2 runtime. After a backend migration, set local caraer.json to platformVersion: 2026.2 (and matching runtime) before the next caraer apps push.

Command groups

  • auth / company / profile — session and profiles
  • apps — local folder lifecycle + full sync (pull / push), builds, logs, local dev
  • webhooks — formats, events, and test helpers
  • publish — submit / status for marketplace review
  • sandbox — clone the company Neo4j DB (same company; X-Caraer-Sandbox-Uuid overrides databaseid)

Local app layout

my_app/
  caraer.json                 # workspace metadata (platformVersion, appUuid, …)
  src/app/
    app.caraer.yaml           # identity, auth, OAuth, settings, app bars
    lifecycle/*.json          # install|uninstall|rotate|update hooks
    functions/<name>/         # function.caraer.json + entry source
    webhooks/*.json           # one webhook definition per file
    schedules/*.json          # cron → function (integration runtime)
    inbound/*.json            # public inbound routes → function

add setting appends to app.caraer.yaml by default. Optional modular JSON files (settings/) still merge on push when present (--modular). apps init always creates all four lifecycle hooks + on-* functions. See docs/app_lifecycle.md.

See examples/webhook-inbox for a minimal sample (inbound route, settings, lifecycle, app bar).

Profiles

Config lives in the user config dir (config.toml). Defaults include dev, staging, and prod.

caraer profile list
caraer profile use staging
caraer profile set --base-url https://api.caraer.com --output json

Override the active profile for a single command with --profile <name>.

For local API development against a running backend:

caraer profile set --base-url http://localhost:8080

Developer sandboxes

Create a Neo4j DB clone of the selected company, then activate it per request. Company identity stays the same; only the Neo4j databaseid is overridden:

caraer company select <owner-company-uuid>
caraer sandbox create --name my-test
caraer sandbox list
caraer sandbox use <sandbox-uuid>   # same company; sends X-Caraer-Sandbox-Uuid
# … test against the clone DB …
caraer sandbox clear                # back to the company production database

Each company may have at most 3 active sandboxes. After a backend deploy that changed the sandbox model, recreate sandboxes (old clone-company sandboxes are invalid).

Sandboxes isolate Neo4j data only — function runtime code is still shared with production. Prefer caraer apps push --dry-run to preview changes, and treat --target sandbox as a data sandbox, not a separate code environment.

Documentation

Related

Development / CI

./scripts/ci.sh

GitHub Actions workflow: .github/workflows/ci.yml

License

Proprietary — see LICENSE.

Release files for caraer-cli 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for caraer-cli 0.1.3
File Size Uploaded
caraer_cli-0.1.3.tar.gz 202.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for caraer-cli 0.1.3
File Interpreter ABI Platform
caraer_cli-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 410.1 kB

Release files / caraer_cli-0.1.3.tar.gz

Download URL caraer_cli-0.1.3.tar.gz
Size 202.0 kB
Tags Source
SHA-256 checksum
How to use checksums
3136c686b6ba223465d5bd8a6ea8e58bc1c637fb503c8a05f291ca8815624b63
BLAKE2b-256 checksum
How to use checksums
bf8c22b1a7f482279883a951ccef7fd2a90345b419f0518510270523cdb3d3bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / caraer_cli-0.1.3-py3-none-any.whl

Download URL caraer_cli-0.1.3-py3-none-any.whl
Size 208.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3a6499f9b4f78db9ddc4a19994ea88daff04ba6ee8881763f990a92c334da53b
BLAKE2b-256 checksum
How to use checksums
aa0d8654fe2525ee976d60fc6392784da81ea53810a3acaa4decf78ab38ebb94
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page