Forma
Forma is AI for full-stack hardware design. It turns text and images into a real-world hardware project.
This is in alpha and research-based stage focused on low-voltage maker electronics (3.3V–5V) and safe, educational projects.
What you can do
- Compile a hardware idea into structured hardware plan
- Run rule-based electrical validation (shorts, voltage mismatch, unpowered ICs, pin conflicts, overcurrent risk)
- Visualize Wiring in interactive schematic
- View a lightweight 3D mechanical layout
- Generate an optional concept image with an image model
- Persist generated projects to Supabase through the Supabase client when configured, with an automatic SQLite fallback and
FORMA_DEV_MODEfor SQLite-only local work - Trace generation runs and structured LLM calls with Langfuse when project keys are configured
- Let external agents integrate over REST long-polling, WebSocket, optional TCP JSONL sockets, or MCP-style JSON-RPC tools
How it works
Forma follows a sequential processing pipeline:
- Input: User provides a prompt and optional image
- Agent Processing: ADK-style sequential agents process the input using the configured structured LLM provider
- Hardware IR Generation: Agents produce typed Hardware IR (Pydantic models)
- Validation & Repair: Rule-based validation checks the design and repairs issues automatically
- UI Outputs: Generate interactive visualizations (product image, React Flow schematic, SVG diagrams, 3D mechanical layout) and save to database
- Persistence: Project data is stored in Supabase or SQLite
MVP scope & safety boundaries
Forma intentionally limits scope to low-voltage maker electronics:
- 3.3V–5V DC systems
- Breadboard-friendly microcontrollers, sensors, displays, and actuators
- Educational and hobbyist prototypes
It blocks or warns on high-risk domains (mains AC, medical, automotive control, weapons, high-power battery packs). See docs/validation.md.
Local setup (quick)
Detailed instructions live in docs/setup.md. The short version:
Run Everything
From the repo root:
./scripts/development/dev.sh
This starts the FastAPI backend and Next.js frontend together. Use BACKEND_PORT, FRONTEND_PORT, BACKEND_HOST, or FRONTEND_HOST to override defaults.
Python Package (PyPI)
The reusable core is published on PyPI as caid-forma-core. The distribution name is caid-forma-core; the Python import package is forma_core.
pip install caid-forma-core
import forma_core
from forma_core.generation import HardwarePipelineOrchestrator, list_workflows
from forma_core.models import HardwareIR
Docker
Build and run both images from the repo root:
docker compose up --build
The Docker setup runs the backend on port 8000, the frontend on port 3000,
Redis for project-list caching, and stores SQLite data in a named Docker volume.
Compose deliberately defaults to SQLite even if the repo .env configures a
host-side database. Set COMPOSE_DATABASE_BACKEND=supabase only with a
container-reachable SUPABASE_URL. Live model-provider variables still pass
through normally.
If you change the published backend URL, rebuild the frontend with a matching public API URL:
BACKEND_PORT=8010 NEXT_PUBLIC_API_URL=http://localhost:8010 docker compose up --build
Backend (FastAPI)
From the repo root:
python3 -m venv .venv
source .venv/bin/activate
pip install -r apps/api/requirements.txt
Optional: seed the component library The server auto-seeds the component library on startup if empty. To seed manually:
python3 apps/api/seed_db.py
Run the backend:
uvicorn apps.api.main:app --reload --port 8000
Forma Core CLI:
The core CLI runs generation, validation, and project iteration directly. It does not require the FastAPI backend.
Live CLI operations fail with a nonzero exit code when their requested provider, model, or pipeline fails; they never substitute another model or simulated project. Use --simulation only when deterministic simulated output is intentional.
forma-core workflows
forma-core namespaces
forma-core generate "plant watering monitor" --simulation --output project.json
forma-core generate "plant watering monitor" --llm openai/gpt-5.5 --output project.json
forma-core validate project.json
forma-core iterate project.json "Make the enclosure splash resistant" --namespace product.mech --output revised.json
forma-core iterate project.json "Keep the components but reshape the product as a curved handheld pod" --namespace product.mech --output reshaped.json
python -m forma_core --help
Developer utilities:
./scripts/quality/test.sh
./scripts/models/sample.py "Describe a low-voltage plant watering monitor with OLED status"
./scripts/models/sample_async.py --llm openai/gpt-5.5 --llm runpod/caid-technologies/parti-base "Describe a low-voltage plant watering monitor with OLED status"
curl -X POST http://127.0.0.1:8000/projects/<project-id>/iterate -H 'Content-Type: application/json' -d '{"instruction":"Add battery charging and make the enclosure splash resistant","namespace":"product.mech","provider":"openai","model":"gpt-5.5"}'
./scripts/models/verify-llm-providers.py --list
./scripts/models/verify-llm-providers.py
./scripts/models/verify-llm-providers.py --save
./scripts/models/run-llm-smoke-tests.py
./scripts/models/verify-llm-providers.py --llm openai/gpt-5.5
./scripts/models/verify-llm-providers.py --llm runpod/caid-technologies/parti-base --timeout-seconds 1200
./scripts/models/verify-llm-providers.py --llm baseten/deepseek-ai/DeepSeek-V4-Pro
./scripts/models/verify-llm-providers.py --llm huggingface/Qwen/Qwen2.5-Coder-3B-Instruct:nscale
./scripts/models/verify-llm-providers.py --llm cloudflare/@cf/google/gemma-4-26b-a4b-it
./scripts/models/verify-llm-providers.py --llm nvidia/nvidia/z-ai/glm-5.2
scripts/quality/test.sh runs the offline unit suite with unittest after a Python compile check. scripts/models/sample.py sends the same prompt to each configured/allowed provider-model pair and saves a comparison report under .logs/model-samples/. scripts/models/sample_async.py does the same work concurrently, running one nonblocking task per selected model up to --concurrency. verify-llm-providers.py discovers the configured runtime provider/model pairs from .env, sends a tiny structured JSON prompt, and exits non-zero if any live provider returns invalid output. Use --config-only to validate selectors without spending tokens or waiting on long Runpod jobs. Use --save or run-llm-smoke-tests.py to write timestamped reports under .logs/llm-smoke/, plus .logs/llm-smoke/latest.json. The automated runner also accepts LLM_SMOKE_LLM, LLM_SMOKE_CONFIG_ONLY, LLM_SMOKE_TIMEOUT_SECONDS, and LLM_SMOKE_OUTPUT_DIR for CI or cron-style runs.
Generation and project iteration logic lives in the reusable forma_core package, published as the caid-forma-core PyPI distribution. New code should import from forma_core.generation, forma_core.iteration, forma_core.project_objects, forma_core.models, forma_core.validation, forma_core.llm, forma_core.images, forma_core.runtime, and forma_core.selectors; the old backend modules are compatibility wrappers. Projects are represented as FormaProjectObject values with an object version plus versioned namespaces such as product.mech, product.electrical, product.validation, product.assembly, project.docs, and project.history. ProjectIterator.iterate_project(...) takes an existing HardwareIR plus a natural-language instruction, can target a namespace, returns a full revised HardwareIR, normalizes revision/history/object metadata, redacts bulky data URLs from LLM context, and reruns circuit validation before returning. A product.mech chat or CLI iteration can change shape, dimensions, placement, materials, and fabrication details while preserving the BOM and electrical connectivity. ProjectSelfCorrectionAgent builds validation-driven repair instructions and applies them through the same namespace-aware iterator.
Performance benchmarks live under evals/performance/ and save JSON reports under .logs/benchmarks/. See evals/README.md for the performance/quality distinction, shared datasets, reports, and extension guidance.
./scripts/quality/benchmark.sh
./evals/performance/benchmark_models.py --iterations 1
./evals/performance/benchmark_models.py --live --llm openai/gpt-5.5 --iterations 3 --concurrency 2
benchmark_models.py defaults to config-only mode so it can run safely without spending provider calls. Add --live when you want real LLM latency measurements. Each completed provider/model attempt is also flushed immediately to per-run JSONL and CSV files named model-job-results-*.jsonl and model-job-results-*.csv, including status, round, completion time, and duration fields.
Benchmark, output, and eval artifacts can be uploaded to a Hugging Face dataset repo:
export HF_TOKEN=...
export HF_ARTIFACT_REPO_ID=username/forma-metrics
./evals/performance/benchmark_models.py --live --iterations 3 --upload-huggingface
./evals/performance/benchmark_offline.py --upload-huggingface
./scripts/operations/upload-artifacts-to-huggingface.py --artifact-type outputs examples/results
./scripts/operations/upload-artifacts-to-huggingface.py --artifact-type evals .logs/evals
The CLI uses .venv/bin/python when present and falls back to python3. health
checks the root, component, and A2A jobs endpoints; jobs --local reads the
primary SQLite database directly when the API server is not running. Job
tables include the generation source when known: Catalog, Web Research, or
both.
To run with Google Vertex AI as the primary LLM provider:
gcloud auth application-default login
LLM_PROVIDER=vertex GOOGLE_CLOUD_PROJECT=your-project-id GOOGLE_CLOUD_LOCATION=global VERTEX_AI_MODEL=gemini-3.7-flash uvicorn apps.api.main:app --reload --port 8000
Environment variables (recommended via a repo-root .env; see .env.example):
Application, database, and authentication
LOG_LEVEL: Backend logging level, for exampleINFOorDEBUG.BACKEND_LOG_FILE: Optional log file for backend and uvicorn logs, for example./forma-backend.log.FORMA_DEBUG: Whentrue, API errors and failed job metadata include redacted traceback/context debug payloads. Intended for trusted local/dev environments.SUPABASE_URL: Supabase project API URL, for examplehttps://your-project-ref.supabase.co.SUPABASE_SERVICE_ROLE_KEY/SUPABASE_SECRET_KEY: Backend-only Supabase key for writes. Do not use anon/publishable keys.FORMA_DEV_MODE: Whentrue, forces the application database to SQLite, disables Supabase Storage writes, and keeps reference/product image data inline in the SQLite project record.NEXT_PUBLIC_FORMA_DEBUG/NEXT_PUBLIC_FORMA_DEV_MODE: Frontend-visible local/dev flags. TheKeysintegrations UI,Listening Jobs, andBackend Logsare shown only in Next development mode or when a debug/dev-mode flag is truthy. Keep these unset orfalsein public production builds.DATABASE_BACKEND: Optional override:supabaseorsqlite.FORMA_IMAGE_STORAGE_BACKEND: Optional ancillary override (supabase,s3-compatible, orlocal). By default image storage followsDATABASE_BACKEND.FORMA_WORKSPACE_INTEGRATIONS_BACKEND/FORMA_USER_INTEGRATIONS_BACKEND: Optional encrypted-settings storage overrides. By default they followDATABASE_BACKEND, so SQLite mode does not contact Supabase just because credentials are present.SQLITE_DATABASE_URL: SQLite fallback URL (default:sqlite:///./forma.db).FORMA_DEPLOYMENT: Whentrue, generation requires a deployment provider or the signed-in user's BYOK provider; users without an active provider are directed to Settings.FORMA_AUTH_MODE: Explicitlylocal(Clerk is not mounted and settings belong to the local workspace) orclerk(sign-in is required and settings belong to the Clerk user).FORMA_USER_SECRETS_KEY: Required for every backend runtime. Startup fails immediately when it is absent. Use a high-entropy server-only value; it encrypts per-user settings and is the workspace-encryption fallback.FORMA_WORKSPACE_SECRETS_KEY: Optional separate high-entropy key for local/workspace settings. SQLite-primary runtimes use an encrypted file; Supabase-primary runtimes use encryptedworkspace_integration_configsstorage.
Shared LLM configuration
The backend publishes the resolved, credential-safe client contract at GET /api/runtime/config. Its precedence is explicit request override, saved integration, environment, then provider default. The web application uses this response for provider/model choices, image behavior, workflow defaults, and BYOK prompts instead of repeating configuration logic.
LLM_PROVIDER: Live generation provider:vertex,anthropic,baseten,gemini,gmi,huggingface,cloudflare,nvidia,openai,openai-compatible,runpod,runpod-serverless, orsimulation. Userunpodfor Runpod OpenAI-compatible/vLLM endpoints andrunpod-serverlessfor queue-style/runsyncworkers.LLM_ALLOWED_PROVIDERS: Optional comma-separated allowlist for per-request provider overrides.VERTEX_AI_ALLOWED_MODELS/OPENAI_ALLOWED_MODELS/ANTHROPIC_ALLOWED_MODELS/BASETEN_ALLOWED_MODELS/GEMINI_ALLOWED_MODELS/GMI_ALLOWED_MODELS/HUGGINGFACE_ALLOWED_MODELS/CLOUDFLARE_ALLOWED_MODELS/NVIDIA_ALLOWED_MODELS/OPENAI_COMPATIBLE_ALLOWED_MODELS/RUNPOD_ALLOWED_MODELS: Optional comma-separated allowlists for per-request model overrides. Without an explicit allowlist, runtime overrides are limited to the configured default/fallback model for that provider./api/generatealso accepts optionalproviderandmodelfields for runtime switching. Each generated project records the requested provider/model and actual provider/model inassembly_metadata.- In the Keys UI, users can set Runtime Defaults → Preferred model as
provider/model(for exampleanthropic/claude-opus-5orhuggingface/Qwen/Qwen2.5-Coder-3B-Instruct:nscale). Forma derives the runtime provider, model, provider allowlist, and model allowlist from saved keys/models automatically. STRICT_LLM: Set totrue(default) to fail fast when model validation is enabled and the model is unavailable. Set tofalseto attempt fallback.LLM_API_KEY: Generic provider API key alias. For Gemini,GEMINI_API_KEYorGOOGLE_API_KEYstill work.LLM_MODEL: Model to use, for examplegemini-3.7-flashor an OpenAI/OpenAI-compatible model ID.LLM_FALLBACK_MODEL: Optional fallback model whenSTRICT_LLM=false.LLM_BASE_URL: Optional base URL for OpenAI-compatible providers.LLM_TIMEOUT_SECONDS: Generic read timeout. OpenAI-compatible endpoints default to90.LLM_REASONING_EFFORT: Optional generic reasoning effort for compatible endpoints that support it.LLM_TEMPERATURE: Optional generic sampling temperature. OpenAI-compatible endpoints default to0.2; setdefault,none, oromitto omit it.
Google Vertex AI (primary)
- Set
LLM_PROVIDER=vertex,GOOGLE_CLOUD_PROJECT(orVERTEX_AI_PROJECT), andGOOGLE_CLOUD_LOCATION(orVERTEX_AI_LOCATION, defaultglobal). VERTEX_AI_MODELselects the Gemini model and defaults togemini-3.7-flash.VERTEX_AI_FALLBACK_MODELconfigures the optional non-strict fallback.- Authentication uses Google Cloud Application Default Credentials. Run
gcloud auth application-default loginlocally; in production, attach a service account with Vertex AI access.GOOGLE_APPLICATION_CREDENTIALSmay point to a mounted credential file. - Vercel deployments can use keyless workload identity federation. Configure Vercel OIDC in a Google Workload Identity Pool, then set
GCP_PROJECT_NUMBER,GCP_SERVICE_ACCOUNT_EMAIL,GCP_WORKLOAD_IDENTITY_POOL_ID, andGCP_WORKLOAD_IDENTITY_POOL_PROVIDER_ID. Forma exchanges the request's short-lived Vercel OIDC token and does not store a service-account key.
OpenAI
OPENAI_API_KEY: API key for first-party OpenAI whenLLM_PROVIDER=openai.OPENAI_MODEL: OpenAI model ID. The default isgpt-5.6-sol.OPENAI_RESPONSE_FORMAT: OpenAI response format. Defaults tojson_schema;json_objectandnoneare also supported.OPENAI_TIMEOUT_SECONDS: First-party OpenAI read timeout. Defaults to300.OPENAI_REASONING_EFFORT: Optional reasoning effort for GPT-5/o-series models, for examplelow.OPENAI_TEMPERATURE: Optional first-party OpenAI sampling temperature. Omitted by default so models that only support their default temperature can run.OPENAI_PROJECT_ID/OPENAI_ORG_ID: Optional OpenAI project and organization routing headers.
Anthropic
ANTHROPIC_API_KEY/CLAUDE_API_KEY: Anthropic Claude API key whenLLM_PROVIDER=anthropicor a request usesprovider=anthropic.ANTHROPIC_MODEL: Claude model ID. The default isclaude-opus-5.ANTHROPIC_BASE_URL: Claude API base URL. Defaults tohttps://api.anthropic.com/v1.ANTHROPIC_JSON_SCHEMA_OUTPUT: Defaults totrueand sends Claude JSON schema output config; setfalseto fall back to prompt-only JSON instructions.
Baseten
BASETEN_API_KEY/BASETEN_BASE_URL: Baseten Model APIs configuration whenLLM_PROVIDER=basetenor a request usesprovider=baseten.BASETEN_BASE_URLdefaults tohttps://inference.baseten.co/v1.BASETEN_MODEL: Baseten model slug, for exampledeepseek-ai/DeepSeek-V4-Pro.
Gemini
GEMINI_API_KEY/GOOGLE_API_KEY: Gemini credentials whenLLM_PROVIDER=geminior a request usesprovider=gemini.GEMINI_MODEL: Gemini model ID. The default isgemini-3.7-flash.
GMI Cloud
GMI_API_KEY/GMI_BASE_URL: GMI Cloud configuration whenLLM_PROVIDER=gmior a request usesprovider=gmi.GMI_MODEL: GMI model ID.
Hugging Face
HF_TOKEN/HUGGINGFACE_API_KEY/HUGGINGFACE_HUB_TOKEN: Hugging Face Inference Providers token whenLLM_PROVIDER=huggingfaceor a request usesprovider=huggingface.HUGGINGFACE_BASE_URL: Hugging Face OpenAI-compatible router URL. Defaults tohttps://router.huggingface.co/v1.HUGGINGFACE_MODEL: Hugging Face model ID, for exampleQwen/Qwen2.5-Coder-3B-Instruct:nscale.
Cloudflare
CLOUDFLARE_API_TOKEN/CLOUDFLARE_ACCOUNT_ID: Cloudflare AI credentials whenLLM_PROVIDER=cloudflareor a request usesprovider=cloudflare. The OpenAI-compatible base URL is derived ashttps://api.cloudflare.com/client/v4/accounts/<account_id>/ai/v1;CLOUDFLARE_BASE_URLcan override it.CLOUDFLARE_MODEL: Cloudflare Workers AI model ID. Defaults to the Free-plan-compatible@cf/google/gemma-4-26b-a4b-it.CLOUDFLARE_RESPONSE_FORMAT: Cloudflare response format. Defaults tojson_schema;json_objectandnoneare also supported.CLOUDFLARE_ENABLE_THINKING: Enables Cloudflare model-native thinking for structured requests. Defaults tofalseso reasoning cannot consume the entire JSON output budget.
NVIDIA
NVIDIA_API_KEY/NVIDIA_BASE_URL: NVIDIA Build/NIM configuration whenLLM_PROVIDER=nvidiaor a request usesprovider=nvidia.NVIDIA_BASE_URLdefaults tohttps://integrate.api.nvidia.com/v1.NVIDIA_MODEL: NVIDIA model slug, for examplenvidia/z-ai/glm-5.2.
OpenAI-compatible providers
Use the shared LLM_API_KEY, LLM_MODEL, and LLM_BASE_URL variables with LLM_PROVIDER=openai-compatible. Provider-specific response format, validation, timeout, token, reasoning, and temperature variables are listed in .env.example.
Runpod
RUNPOD_API_KEY/RUNPOD_OPENAI_BASE_URL: Runpod OpenAI-compatible/vLLM configuration whenLLM_PROVIDER=runpodor a request usesprovider=runpod.RUNPOD_ENDPOINT_ID/RUNPOD_ENDPOINT_URL: Runpod Serverless queue configuration whenLLM_PROVIDER=runpod-serverlessor a request usesprovider=runpod-serverless.RUNPOD_MODEL_ENDPOINTS: Optional JSON mapping of Runpod model IDs to endpoint IDs or endpoint URLs when each model uses a different Serverless endpoint.- A plain Runpod queue URL such as
https://api.runpod.ai/v2/<endpoint-id>belongs inRUNPOD_ENDPOINT_URLwithLLM_PROVIDER=runpod-serverless;LLM_PROVIDER=runpodrequires the OpenAI-compatible base URL ending in/openai/v1. RUNPOD_TIMEOUT_SECONDS: Runpod HTTP read timeout. Defaults to1200so 10-15 minute cold starts or long generations can finish.RUNPOD_POLL_TIMEOUT_SECONDS: Runpod Serverless/statuspolling timeout. Defaults to1200.RUNPOD_EXECUTION_TIMEOUT_MS/RUNPOD_TTL_MS: Runpod Serverless job policy values. Use1200000for 20-minute generation windows.RUNPOD_PARTI_SEED_TIMEOUT_SECONDS: Optional timeout just for thecaid-technologies/parti-baseseed call. Defaults toRUNPOD_TIMEOUT_SECONDS; set lower if you prefer fast catalog repair when Parti is slow.RUNPOD_INPUT_TEMPLATE: Optional JSON payload template for Runpod workers. Use{prompt}and, for single-endpoint multi-model workers,{model}placeholders.
Observability, media, storage, and external sources
LANGFUSE_PUBLIC_KEY/LANGFUSE_SECRET_KEY: Optional Langfuse project keys. When both are set, the backend traces each generation request and structured LLM call.LANGFUSE_BASE_URL: Optional Langfuse host (defaulthttps://cloud.langfuse.com).LANGFUSE_TRACING_ENVIRONMENT/LANGFUSE_TRACING_RELEASE: Optional Langfuse trace attributes.LANGFUSE_MAX_FIELD_CHARS: Optional traced payload preview cap (default20000).LANGFUSE_ENABLED: Optional explicit on/off switch. Set tofalseto disable tracing even when keys are present.IMAGE_OUTPUT_ENABLED: Optional global default for generated product images. The UI and API can opt in per job withgenerate_image=true.IMAGE_PROVIDER: Image provider. Supportsvertex,openai,openai-compatible,gmi,together,huggingface, ornone.VERTEX_AI_IMAGE_MODEL: Vertex AI Nano Banana model ID.gemini-3.1-flash-image(Nano Banana 2) is the default.VERTEX_AI_IMAGE_RESOLUTION/VERTEX_AI_IMAGE_ASPECT_RATIO: Vertex output controls, defaulting to1Kand1:1.OPENAI_IMAGE_MODEL: OpenAI image model ID. The example default isgpt-image-2.OPENAI_IMAGE_SIZE: Generated image size, for example1024x1024.OPENAI_IMAGE_API_KEY/OPENAI_API_KEY: First-party OpenAI image credentials.IMAGE_PROVIDER=openaidoes not inheritLLM_API_KEYorLLM_BASE_URL; useIMAGE_PROVIDER=openai-compatibleplusIMAGE_BASE_URL/IMAGE_API_KEYorLLM_BASE_URL/LLM_API_KEYfor compatible image endpoints.FIREWORKS_API_KEY: Enables Video tab self-correction. Auto mode samples the saved video withffmpeg, reviews frames with the Fireworkskimi-k2p6image-input model, then applies the review throughProjectIterator.FIREWORKS_VIDEO_REVIEW_INPUT_MODE:autoby default. Auto uses the workingkimi-k2p6frame-review fallback unless native video deployment routing is configured.FIREWORKS_ACCOUNT_ID/FIREWORKS_VIDEO_REVIEW_DEPLOYMENT_ID: Optional Fireworks dedicated deployment routing for native video/audio models. With these set and no explicit frame model override, auto mode usesqwen3-omni-30b-a3b-instruct.FIREWORKS_VIDEO_REVIEW_MODEL: Fireworks review model slug or full deployment path. Defaults tokimi-k2p6for frame review. For native video, useqwen3-omni-30b-a3b-instruct,molmo2-4b,molmo2-8b, or a fullaccounts/<account>/models/<model>#accounts/<account>/deployments/<deployment>path.FIREWORKS_BASE_URL/FIREWORKS_VIDEO_REVIEW_MAX_FRAMES/FIREWORKS_VIDEO_REVIEW_MAX_SECONDS/FIREWORKS_VIDEO_REVIEW_NATIVE_FPS/FIREWORKS_VIDEO_REVIEW_NATIVE_HEIGHT/FIREWORKS_VIDEO_REVIEW_MAX_MEDIA_BYTES/FIREWORKS_TIMEOUT_SECONDS: Optional Fireworks video-review endpoint, preprocessing, and timeout overrides.SUPABASE_S3_ENDPOINT: Explicit S3-compatible image-storage endpoint. Supabase-client uploads derive their endpoint fromSUPABASE_URL; direct S3-compatible uploads require this value.SUPABASE_S3_BUCKET: Supabase Storage bucket for image uploads (default:contents).SUPABASE_S3_ACCESS_KEY_ID/SUPABASE_S3_SECRET_ACCESS_KEY: Optional S3-compatible fallback credentials. The normal backend path uploads through the Supabase client withSUPABASE_URLplus the service-role/secret key.SUPABASE_IMAGE_SIGNED_URL_SECONDS: Lifetime for refreshed Supabase Storage read URLs when projects are loaded (default:86400).HF_ARTIFACT_REPO_ID/HUGGINGFACE_ARTIFACT_REPO_ID/HF_DATASET_REPO_ID: Optional Hugging Face dataset repo for uploaded benchmark, output, and eval artifacts.HF_ARTIFACT_PATH_PREFIX: Optional path prefix inside the artifact repo. Defaults toforma.EXTERNAL_SOURCE_PROVIDER: External web/source provider forworkflow=web_research. Firecrawl is the only active provider for now; legacyautoortavilyvalues are normalized tofirecrawl.FORMA_DEFAULT_GENERATION_WORKFLOW: Initial frontend workflow, eitherweb_research(default) ordefault(Catalog). Request-level workflow selections take precedence.FIRECRAWL_API_KEY/FIRECRAWL_MCP_COMMAND: Enable Firecrawl MCP search and page extraction for the web research workflow.FIRECRAWL_SEARCH_LIMIT/FIRECRAWL_MCP_TIMEOUT_SECONDS: Firecrawl search controls for the web research workflow.
A2A jobs
- A2A jobs use the database selected by
DATABASE_BACKENDandSQLITE_DATABASE_URL; there is no separate job database. A2A_SOCKET_ENABLED: Set totrueto start the optional TCP JSONL A2A socket.A2A_SOCKET_HOST/A2A_SOCKET_PORT: Host and port for the optional TCP JSONL listener.
If no live LLM provider is configured or generation fails, the backend returns deterministic simulation outputs based on built-in example projects.
Frontend (Next.js)
cd apps/web
npm install
npm run dev
Open:
- http://localhost:3000 (UI)
- http://localhost:8000/api/docs (API docs)
Tip: load an example directly with http://localhost:3000/?example=pocket_mp3_player (or any JSON under apps/web/public/examples/).
Documentation
- Architecture
- DesignBrief contract
- Worker contracts and capability registry
- Dependency-aware worker orchestration
- Generation worker and canonical project revisions
- Validation worker and revision-bound findings
- Reverse-Engineering worker and artifact findings
- Project workflow state machine
- Conversational context gathering
- Project readiness and build initiation
- Agents
- Hardware IR
- Validation
- Database
- A2A
- Backend
- Frontend
- Setup
- Development
- Examples
- Roadmap
- Legal and policy drafts
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file caid_forma_core-0.3.3.tar.gz.
File metadata
- Download URL: caid_forma_core-0.3.3.tar.gz
- Upload date:
- Size: 368.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
556e1fc57af749d3a7dc2b61d8b77c9826074e8710c0baff1591764eff6f2902
|
|
| MD5 |
a68fa4488c18baf63fbc43bc64c5bf1d
|
|
| BLAKE2b-256 |
cb79c269edf5f0efedd75336a25d27e640e2c4bd3c39b4b47cc3600c68aab7b1
|
File details
Details for the file caid_forma_core-0.3.3-py3-none-any.whl.
File metadata
- Download URL: caid_forma_core-0.3.3-py3-none-any.whl
- Upload date:
- Size: 410.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f13c38873d28bb36e90ac867b436d899e0c322e4ba5cd7b484e01d0e49ee1c59
|
|
| MD5 |
d1b21ee6e05f5f2eef7359ea747a3def
|
|
| BLAKE2b-256 |
b060045f68253f4bca3b5d3282284086cfafb92210c17accbf6be5e38e64c6a6
|