Free community edition

Collection infrastructure you control.

Likerts stores survey definitions, issues collection credentials, validates answers, and accepts idempotent responses. It does not distribute survey links or send messages.

MIT licensed. Likerts has no response credits, paid plans, checkout flow, or application-level response quota. Your infrastructure costs and safety settings remain yours.

Run it locally.

You need Git, Rust stable, Node.js 22 or newer, Bash, and jq. This disposable loop uses the in-memory store; stopping the API clears its data. Durable deployments use PostgreSQL.

Terminal 1 · start the API
git clone https://github.com/crosstabs/likerts.git
cd likerts
source scripts/dev-env.sh
export LIKERTS_DEV_TOKENS='{"local-demo-management-token":"demo"}'
export LIKERTS_ALLOW_MEMORY=1
export LIKERTS_ADMISSION_MODE=disabled
cargo run --manifest-path backend/Cargo.toml --locked

The API listens on http://127.0.0.1:8080. Use the local token only for this disposable environment and generate new secrets before exposing a deployment.

Create, publish, collect.

The resource flow is survey draft → immutable published version → collection → accepted response. A collection binds one version to a placement and returns a restricted credential for the embedded client.

Keep the API running. In a second terminal, open the cloned repository and run this complete example. The script builds the CLI, creates and publishes a survey, creates a collection, submits an answer twice with the same key, and verifies that exactly one response was stored.

Terminal 2 · from the repository root
export LIKERTS_API_URL=http://127.0.0.1:8080
export LIKERTS_TOKEN=local-demo-management-token
bash scripts/first-response.sh

A successful run prints accepted: true, idempotentRetry: true, and retrievedResponses: 1, plus the response and collection IDs. Read the script to see the complete request payloads and credential handoff.

For operations that accept an idempotency key, preserve the key and complete payload when retrying an ambiguous failure. An identical retry returns the original resource or receipt; changing content under the same key returns a conflict. Check each operation in the API reference before automating retries.

Operate the whole platform from an agent.

The API, MCP server, and Rust CLI expose the same capability registry. Use them to author surveys, publish versions, manage collections, retrieve responses, and create exports.

Install the CLI from source

shell · from the repository root
cargo install --locked --path tools/cli
export LIKERTS_API_URL=http://127.0.0.1:8080
export LIKERTS_TOKEN=local-demo-management-token
likerts capabilities
likerts call usage_get

These credentials match the disposable local API above. For a hosted workspace, use its API origin and a scoped service credential from your workspace. Management calls use LIKERTS_TOKEN; collection reads and submissions use the separate LIKERTS_COLLECTION_TOKEN. Credentials belong in the process environment, never in input JSON.

Connect a remote MCP server

Install Codex, set LIKERTS_WORKSPACE_ID to your workspace ID, and supply its service credential as LIKERTS_TOKEN to the Codex process. Replace YOUR_MCP_HOST with your deployed MCP host. The optional hosted service uses likerts-mcp.onrender.com.

shell · Codex
codex mcp add likerts \
  --url "https://YOUR_MCP_HOST/mcp/$LIKERTS_WORKSPACE_ID" \
  --bearer-token-env-var LIKERTS_TOKEN

For Claude Code, local stdio setup, token rotation, and self-hosting, follow the management integration guide. Tool discovery lists the registry; the API checks the credential's scopes for every operation. Only grant an agent the access its task needs.

Embed the collection experience.

Renderer and transport SDK source is included for Web, React Native, iOS, Android, and Flutter. The host app owns placement, eligibility, consent, localization, and retry timing. Optional encrypted offline queues flush only when the host asks them to.

PlatformRendererIntegration guide
Web / TypeScriptmountSurveyWeb SDK
React NativeSurveyHostReact Native SDK
iOS / SwiftUISurveyViewiOS SDK
Android / ComposeLikertsSurveyAndroid SDK
FlutterLikertsSurveyFlutter SDK

Build from the current source checkout using the platform guides. Package-registry publication has not occurred. Older frozen release archives are historical; use current source for the free community edition.

Mount a survey on the web

Build and pack the Web SDK from your checkout, then install the resulting tarball into your app.

shell · from the repository root
npm ci --prefix sdks/web
npm run build --prefix sdks/web
cd sdks/web
npm pack

In your app directory, run npm install /absolute/path/to/likerts/sdks/web/likerts-web-0.0.3.tgz. Add a <div id="feedback"></div> where feedback should appear, then bundle this code with your application:

TypeScript · in your application
import { LikertsClient, mountSurvey } from '@likerts/web';

// Your backend supplies the collection ID and its restricted credential.
const client = new LikertsClient(apiOrigin, collectionToken);
const collection = await client.collection(collectionId);
const container = document.querySelector<HTMLElement>('#feedback');
if (!container) throw new Error('Feedback container is missing');

const cleanup = mountSurvey(container, collection, client, receipt => {
  console.log('Accepted response:', receipt.responseId);
}, { screen: 'checkout' });

// Call cleanup() when the host dismisses the survey or navigates away.

Use a same-origin proxy or configure exact HTTPS origins with collections_security_update for browser access. Declare every installed SDK group's capability record when publishing a survey and creating its collection. Browser and mobile apps receive only collection credentials; keep management credentials on trusted systems.

Explore all nine question types in the interactive SDK demo. The demo runs locally in the browser and sends no responses.

Nine bounded question types.

TypeAnswer shape
ScaleInteger within configured bounds, with optional Likert or NPS labels.
Single choiceOne option ID, with optional structured Other text.
Multiple choiceUnique option IDs within configured selection bounds.
TextBounded string.
NumberNumber within configured bounds.
DateCalendar date.
RankingComplete option-ID permutation.
MatrixRow IDs mapped to one or more column IDs.
Constant sumNonnegative integer allocation matching the configured total.

Conditional visibility and bounded page branching are part of the shared schema contract. Hidden answers are pruned before submission.

Isolation is enforced at every boundary.

Workspace identity is derived from the verified credential and carried through API authorization and database access. Collection credentials cannot perform management actions. Exports and webhook delivery use separate restricted paths.

Read SECURITY.md before an internet-facing deployment. Rate limits, payload bounds, queue sizes, storage capacity, backups, encryption keys, and monitoring are operator responsibilities.