VocaLoop

Building Projects

A project in VocaLoop is the thing you send to people: its fields, layout, branding and link-expiry rules all hang off it. This page covers creating a project, generating its UI with the AI builder, and every setting on the project detail page.

The default project

Every account starts with an active project created at signup (it gets a random name like any other). It is only where a new account lands first — API keys are created inside a project, so the Secure Link Loop API always targets the key's project — and it can be deleted like any other project.

Creating a project

  1. On the dashboard (Projects in the sidebar), click Add Project.

  2. Give it a name (max 200 characters) and an optional description (max 1000 characters).

  3. The project is created with status Inactive — it can't receive fill requests until you save a preview and activate it.

Deleting a project deletes everything under it: its preview, templates, submissions, and API keys. The default project is the one exception — it can't be deleted.

The AI project builder

Open a project and describe what you want in the instructions box — for example "a job application project: full name, email, phone, position (dropdown: Engineer / Designer / PM), resume upload, and a cover-letter text area".

  • Generate — produces the project UI and renders a live, fillable preview.

  • Save — persists the preview. Only a saved preview counts; generating alone changes nothing.

Generation requires OPENAI_API_KEY in the root .env (see Getting Started).

Under the hood the builder writes OpenUI-lang, a small Python-like DSL that compiles to the project's UI spec. You can regenerate at any time; the new preview replaces the old one when saved. Requests that were already sent keep a snapshot of the UI they were sent with, so editing a project never breaks links that are already in someone's inbox.

Supported field types

TypeRenders asNotes
textSingle-line input
textareaMulti-line input
numberNumeric input
emailEmail inputValidated format
phonePhone input
dateDate picker
selectDropdownNeeds a list of options
radioRadio groupNeeds a list of options
checkboxCheckbox
fileFile uploadPer-field size cap (max_size_mb); uploads go to S3, 10 MB hard limit

Every field has a label, a name (the key it gets in submission data), and optional placeholder, required flag, and default value. Layout elements — headings, text blocks, cards, stacks, dividers, and images — let the builder arrange fields into sections.

Testing a preview

The full walkthrough of the Playground — drafts, publishing, dictation and sending yourself a test message — is in Playground & Test Sends.

The rendered preview is fillable. Submitting it records a real submission row with channel preview, so you can verify the data shape (and your account webhook) before sending anything to real people. Preview submissions appear on the Responses page alongside the rest.

Project settings

On the project detail page:

SettingDefaultWhat it does
StatusInactiveOnly Active projects accept fill requests and public fills. Activation requires a saved preview
Link expiryEmpty (links never expire)How long a sent fill link stays usable. Empty = links never expire. A resend restarts the window

Project branding

Branding cascades: project setting → account setting (Branding page) → built-in defaults. Anything you set on the project overrides your account default for that project only.

  • Logo and cover image — uploaded to S3 (S3 credentials required in .env); shown on the public fill page.

  • Colors — primary (buttons/accents), project background, and page background, as hex values.

  • Custom CSS — free-project CSS (up to 20,000 characters) injected into the fill page for full control.

The fill page

Every fill page lives at /fill/<request_id> — no login required; the unguessable request id in the link is the credential, and every link accepts exactly one response. A request comes from one of two places:

  • A sent loop — created when you send the project to someone through the Secure Link Loop API or a voice agent; the link goes out in the message.

  • Create fill link on the project's Responses page — mints a new request with no delivery and copies its link for you to share by hand (one link per person; the response is recorded with channel link).

Both kinds are subject to the project's expiry window and die once submitted. There is no project-wide link: a project id is never a fill link.

How links are sent, tracked, and expired is covered in Sending & Tracking.