Build stylish, Typeform-like multi-step forms and surveys using the Rebyte Forms library (Composer API). Outputs standalone HTML files. Triggers include "create a form", "build a survey", "make a questionnaire", "feedback form", "contact form", "signup form", "onboarding flow", "multi-step form", "typeform-style", "data collection form". Do NOT use for simple single-field inputs or backend form processing.
Published by rebyteai
Runs in the cloud
No local installation
Dependencies pre-installed
Ready to run instantly
Secure VM environment
Isolated per task
Works on any device
Desktop, tablet, or phone
Build production-ready, Typeform-style forms using the Composer API.
IMPORTANT: This skill is designed for non-technical users.
npm run dev: Don't start dev servers and show the output. Export/build instead.A form task is NOT complete until:
index.htmlrebyte-app-builder skill to deploy the formNEVER tell the user the form is "done" without completing ALL steps.
IMPORTANT: All API requests require authentication. Get your auth token and API URL by running:
AUTH_TOKEN=$(/home/user/.local/bin/rebyte-auth)
API_URL=$(python3 -c "import json; print(json.load(open('/home/user/.rebyte.ai/auth.json'))['sandbox']['relay_url'])")
Include the token in all API requests as a Bearer token, and use $API_URL as the base for all API endpoints.
If this skill produces output files (PDFs, images, exports, etc.), you MUST upload them to the artifact store. Without this, users cannot access the files - they only exist inside the VM.
Upload whenever you generate:
curl -X PUT "$API_URL/api/artifacts" \
-H "Authorization: Bearer $AUTH_TOKEN" \
-F "files=@/path/to/file.pdf"
Multiple files:
curl -X PUT "$API_URL/api/artifacts" \
-H "Authorization: Bearer $AUTH_TOKEN" \
-F "files=@file1.png" \
-F "files=@file2.png"
Allowed file types:
.pdf, .doc(x), .xls(x), .ppt(x), .csv, .tsv, .rtf, .epub, .html.zip, .tar, .gz, .tgz.png, .jpg, .gif, .webp, .svg, .tiff, .bmp, .avif.mp4, .webm, .mov, .avi, .mkv.mp3, .wav, .ogg, .aac, .flac, .m4aNot allowed: Source code, config files, or development files.
<!DOCTYPE html>
<html lang="en" spellcheck="false" class="fmd-root" data-fmd-color-scheme="light">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{TITLE}}</title>
<link rel="stylesheet" type="text/css" href="https://unpkg.com/rebyte-forms@1.0.1/dist/css/formsmd.min.css">
</head>
<body class="fmd-body">
<noscript>Please turn on JavaScript to see this page.</noscript>
<div class="fmd-main">
<div class="fmd-main-container">
<div class="fmd-loader-container">
<div class="fmd-loader-spinner" role="status" aria-label="Loading"></div>
</div>
</div>
</div>
<script src="https://unpkg.com/rebyte-forms@1.0.1/dist/js/composer.bundle.min.js"></script>
<script src="https://unpkg.com/rebyte-forms@1.0.1/dist/js/formsmd.bundle.min.js"></script>
<script>
const composer = new Composer({
title: "{{TITLE}}",
colorScheme: "light",
accent: "#6366f1",
accentForeground: "#ffffff",
backgroundColor: "#fafafa",
color: "#18181b",
fontFamily: "Inter, sans-serif",
pageProgress: "show",
});
// Start slide
composer.startSlide({ buttonText: "Get Started" });
composer.h1("Welcome");
composer.p("Introduction text here.");
// Form slides go here...
// End slide
composer.endSlide();
composer.h1("Thank you!");
composer.p("Your response has been recorded.");
// Initialize
const formsmd = new Formsmd(composer.template, document, { isFullPage: true });
formsmd.init();
</script>
</body>
</html>
| Setting | Type | Description |
|---|---|---|
title |
string | Page title |
colorScheme |
"light" | "dark" |
Default color scheme |
accent |
string | Primary color (hex) for buttons, fields |
accentForeground |
string | Text color on accent background |
backgroundColor |
string | Page background color |
color |
string | Text color |
backgroundImage |
string | CSS background-image (gradient or url) |
backdropOpacity |
string | Overlay opacity on background image (e.g., "0.4") |
fontFamily |
string | Font family |
fontSize |
"sm" | "lg" |
Font size |
rounded |
"none" | "pill" |
Button/UI rounding |
pageProgress |
"hide" | "show" | "decorative" |
Progress bar style |
formStyle |
"classic" |
Classic form field appearance |
postUrl |
string | URL to POST form responses |
composer.textInput("fieldName", {
question: "What's your name?",
placeholder: "John Doe",
required: true,
description: "Optional helper text",
multiline: true, // for textarea
maxlength: 500,
autofocus: true,
subfield: true, // smaller label (for grouping)
});
composer.emailInput("email", {
question: "Your email address?",
placeholder: "you@example.com",
required: true,
});
composer.telInput("phone", {
question: "Phone Number",
country: "US", // default country code
required: true,
});
composer.urlInput("website", {
question: "Your website",
placeholder: "https://example.com",
});
composer.numberInput("salary", {
question: "Expected salary (USD)",
placeholder: "100000",
unit: "$",
min: 50000,
max: 500000,
});
// Simple choices
composer.choiceInput("role", {
question: "What's your role?",
choices: ["Developer", "Designer", "Manager", "Other"],
required: true,
});
// With custom values
composer.choiceInput("ticket", {
question: "Select ticket type",
choices: [
{ label: "General - $99", value: "general" },
{ label: "VIP - $299", value: "vip" },
],
required: true,
});
// Multiple selection
composer.choiceInput("skills", {
question: "Select your skills",
description: "Choose all that apply",
choices: ["JavaScript", "Python", "Go", "Rust"],
multiple: true,
});
// Horizontal layout
composer.choiceInput("size", {
question: "T-Shirt Size",
choices: ["S", "M", "L", "XL"],
horizontal: true,
});
composer.selectBox("country", {
question: "Select your country",
placeholder: "Choose one",
options: ["USA", "Canada", "UK", "Germany", "Other"],
});
composer.ratingInput("satisfaction", {
question: "How satisfied are you?",
outOf: 5,
icon: "star",
required: true,
});
composer.opinionScale("nps", {
question: "How likely are you to recommend us?",
startAt: 0,
outOf: 10,
labelStart: "Not likely",
labelEnd: "Very likely",
required: true,
});
composer.fileInput("resume", {
question: "Upload your resume",
description: "PDF format, max 10MB",
sizeLimit: 10,
required: true,
});
composer.dateInput("startDate", { question: "Start date" });
composer.timeInput("preferredTime", { question: "Preferred time" });
composer.datetimeInput("appointment", { question: "Select date and time" });
// Start slide (intro)
composer.startSlide({ buttonText: "Begin" });
composer.h1("Title");
composer.p("Description");
// Regular slide
composer.slide();
composer.textInput("name", { question: "Your name?", required: true });
// Another slide with multiple fields
composer.slide();
composer.h2("Contact Details");
composer.emailInput("email", { question: "Email", required: true });
composer.telInput("phone", { question: "Phone", subfield: true });
// End slide
composer.endSlide();
composer.h1("Thanks!");
Show a field only when a condition is met:
composer.choiceInput("wantFollowUp", {
question: "Can we follow up?",
choices: [
{ label: "Yes", value: "yes" },
{ label: "No", value: "no" },
],
});
composer.emailInput("followUpEmail", {
question: "Your email for follow-up",
displayCondition: {
dependencies: ["wantFollowUp"],
condition: "wantFollowUp == 'yes'",
},
});
const composer = new Composer({
colorScheme: "light",
accent: "#18181b",
accentForeground: "#fafafa",
backgroundColor: "#fafafa",
color: "#18181b",
fontFamily: "DM Sans, sans-serif",
formStyle: "classic",
pageProgress: "show",
});
const composer = new Composer({
colorScheme: "dark",
accent: "#a855f7",
accentForeground: "#ffffff",
backgroundColor: "#0f0a1e",
color: "#e2e8f0",
backgroundImage: "linear-gradient(135deg, #1a0a2e 0%, #16213e 50%, #0f0a1e 100%)",
fontFamily: "Space Grotesk, sans-serif",
rounded: "pill",
pageProgress: "show",
});
const composer = new Composer({
colorScheme: "light",
accent: "#f97316",
accentForeground: "#ffffff",
backgroundColor: "#fffbeb",
color: "#451a03",
backgroundImage: "linear-gradient(180deg, #fef3c7 0%, #fffbeb 50%, #fff7ed 100%)",
fontFamily: "Outfit, sans-serif",
fontSize: "lg",
pageProgress: "show",
});
const composer = new Composer({
colorScheme: "dark",
accent: "#f472b6",
accentForeground: "#ffffff",
backgroundColor: "#1e1b4b",
color: "#f8fafc",
backgroundImage: "url('https://images.unsplash.com/photo-xxx?w=1920&q=80')",
backdropOpacity: "0.4",
fontFamily: "Plus Jakarta Sans, sans-serif",
rounded: "pill",
});
To collect responses, you need to:
postUrl to your HTML formindex.htmlrebyte-app-builder skill to deployCall the Forms API to create a backend that stores submissions:
curl -X POST "$API_URL/api/forms/create" \
-H "Authorization: Bearer $AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "My Survey",
"fields": ["name", "email", "rating", "feedback"]
}'
IMPORTANT: The fields array must contain the exact field names you use in your form (e.g., composer.textInput("name", ...) means "name" goes in fields).
Response:
{
"formId": "abc123def456",
"submitUrl": "https://.../api/forms/submit/abc123def456",
"adminUrl": "https://.../forms/abc123def456",
"fields": ["name", "email", "rating", "feedback"]
}
Save these URLs:
submitUrl: Where form data is POSTed (use as postUrl in Composer)adminUrl: Spreadsheet UI to view all submissions (share with form creator)Add the submitUrl as postUrl in your Composer settings:
const composer = new Composer({
title: "My Survey",
postUrl: "<submitUrl from API response>",
// ... other settings
});
index.htmlrebyte-app-builder skill to deploy itAfter deployment, you'll have:
rebyte-app-builder skill output - Share with respondentsAdmin UI (Recommended): Open adminUrl in a browser to view responses in a spreadsheet interface with CSV/JSON export.
API Endpoints (for programmatic access):
GET $API_URL/api/forms/results/{formId}GET $API_URL/api/forms/results/{formId}/csvWhen you finish building and deploying a form, you MUST tell the user both URLs:
rebyte-app-builder skill outputNever forget the Admin URL - without it, the user cannot see their form submissions!
Everyone else asks you to install skills locally. On Rebyte, just click Run. Works from any device — even your phone. No CLI, no terminal, no configuration.
Claude Code
Gemini CLI
Codex
Cursor, Windsurf, Amp
Generate images from text prompts or edit existing images using Google Nano Banana 2 (Gemini 3.1 Flash image generation) via Rebyte data API. Supports multi-size output (512px–4K), improved text rendering, and multi-image input. Use for text-to-image generation or image-to-image editing/enhancement. Triggers include "generate image", "create image", "make a picture", "draw", "illustrate", "image of", "picture of", "edit image", "modify image", "enhance image", "style transfer", "nano banana".
Generate stylized presentation slide images using Nano Banana AI. Converts article content to ASCII framework then generates AI images for each slide. Triggers include "nanoppt", "stylized slides", "AI slide images", "presentation images", "Doraemon style slides", "anime presentation". Do NOT use for regular presentations (use slide-builder instead).
Create presentations using Slidev (Markdown-based slides). Triggers include "create presentation", "make slides", "build slides", "slide deck", "tech talk", "conference slides", "pitch deck". Handles the full workflow from content planning to deployment at rebyte.pro.
Conduct enterprise-grade research with multi-source synthesis, citation tracking, and verification. Use when user needs comprehensive analysis requiring 10+ sources, verified claims, or comparison of approaches. Triggers include "deep research", "comprehensive analysis", "research report", "compare X vs Y", or "analyze trends". Do NOT use for simple lookups, debugging, or questions answerable with 1-2 searches.
rebyte.ai — The only platform where you can run AI agent skills directly in the cloud
No downloads. No configuration. Just sign in and start using AI skills immediately.
Use this skill in Agent Computer — your shared cloud desktop with all skills pre-installed. Join Moltbook to connect with other teams.