Pages that remember
Templates
Start from a working page: a guestbook, a poll, a sign-up form or a link page on your own domain. Try it, publish your own copy in one click, change the words, share the link.
A wall where guests leave their name and a message. Saves each guest's name and message; everyone reads the wall.
Basic templates
Your links on your own domain, plus a newsletter sign-up saved for you.
More templates
How it works
- Try it. Each template is a real working page. Open it, enter something, see it saved.
- Publish my copy. One click gives you your own copy at a private link. It starts empty.
- Make it yours. Change the words: ask your AI assistant with your page's link, or update it with the management link.
- Share and read. Share the link. You read what visitors enter in the page's Data tab, or download it as CSV.
What you get after publishing
- A private link. Only people with the link open your copy; it gets its own address.
- A Data tab. Every entry visitors save, newest first. Download it as CSV or remove any entry.
- A management link. Change or delete your page later. Keep it private.
- Your profile, if you sign in. Your pages on any device, kept up to 90 days, and free custom domains.
Your visitors read: “What you enter is saved on BrewPage and can be read by this page's author.” What they save is tied to their browser: clearing cookies or switching device starts fresh. Page data is kept as long as the page; download it before the page expires.
Guestbook
TemplatePage dataA wall where guests leave their name and a message. Saves each guest's name and message; everyone reads the wall. Each visitor can leave up to 5 messages.
Publish it another way
Press Publish my copy above or on the template page. Nothing to install, no account needed. You get your page link and its management link.
Read the clean source, then publish it with its settings in one request. The answer holds your page link, your management link and an owner token for later updates; keep the management link and the token private.
curl -s https://brewpage.app/templates/guestbook/source > page.html
jq -n --rawfile content page.html \
--argjson state '{"collections":{"guestbook":{"mode":"shared","maxDocsPerVisitor":5}}}' \
'{content: $content, format: "html", state: $state}' \
| curl -s https://brewpage.app/api/html -H 'Content-Type: application/json' --data-binary @-Ask an AI assistant: one connected to BrewPage (remote MCP server https://brewpage.app/mcp, no install) or any assistant that can send web requests. Paste this:
Publish my own copy of this BrewPage template: https://brewpage.app/templates/guestbookIt publishes your copy and gives you two links: your page and its management link. Keep the management link private: anyone who has it can change or delete the page and read its data.
Make your own page save the same way: include the script, call it from your page script, and declare the list when you publish.
1. In your page's HTML
<script src="https://brewpage.app/js/state.js"></script>2. Your page script
const wall = document.getElementById("wall");
let book = null;
async function start() {
const s = await bp.state();
if (!s) return; // saving is off here; the page keeps working
book = s.col("guestbook");
const docs = await book.list({ order: "-createdAt", limit: 20 });
for (const d of docs) {
const li = document.createElement("li");
li.append(bp.text(d.value.name + ": " + d.value.text));
wall.append(li);
}
}
async function sign(name, text) {
if (book) await book.add({ name, text });
}
start();3. Publish body (POST /api/html)
{
"content": "<your page>",
"format": "html",
"state": {"collections":{"guestbook":{"mode":"shared","maxDocsPerVisitor":5}}}
}Poll
TemplatePage dataOne question, a few choices, live totals for everyone. Saves one vote per visitor; everyone sees the totals, and a visitor can change their vote.
Publish it another way
Press Publish my copy above or on the template page. Nothing to install, no account needed. You get your page link and its management link.
Read the clean source, then publish it with its settings in one request. The answer holds your page link, your management link and an owner token for later updates; keep the management link and the token private.
curl -s https://brewpage.app/templates/poll/source > page.html
jq -n --rawfile content page.html \
--argjson state '{"collections":{"votes":{"mode":"private","choices":{"choice":["pizza","ramen","salad"]}}}}' \
'{content: $content, format: "html", state: $state}' \
| curl -s https://brewpage.app/api/html -H 'Content-Type: application/json' --data-binary @-Ask an AI assistant: one connected to BrewPage (remote MCP server https://brewpage.app/mcp, no install) or any assistant that can send web requests. Paste this:
Publish my own copy of this BrewPage template: https://brewpage.app/templates/pollIt publishes your copy and gives you two links: your page and its management link. Keep the management link private: anyone who has it can change or delete the page and read its data.
Make your own page save the same way: include the script, call it from your page script, and declare the list when you publish.
1. In your page's HTML
<script src="https://brewpage.app/js/state.js"></script>2. Your page script
const result = document.getElementById("result");
let votes = null;
async function start() {
const s = await bp.state();
if (!s) return; // saving is off here; the page keeps working
votes = s.col("votes");
const totals = await votes.stats({ countBy: "choice" });
result.textContent = JSON.stringify(totals.by);
const mine = await votes.get("me"); // this visitor's vote, or null
}
async function vote(choice) {
if (votes) await votes.set("me", { choice });
}
start();3. Publish body (POST /api/html)
{
"content": "<your page>",
"format": "html",
"state": {"collections":{"votes":{"mode":"private","choices":{"choice":["pizza","ramen","salad"]}}}}
}Sign-up form
TemplatePage dataAPIA form people fill in; you get a table of every reply. Saves each reply privately; only you read them all, in the Data tab, as CSV or with the API. A visitor can change their reply later in the same browser.
Publish it another way
Press Publish my copy above or on the template page. Nothing to install, no account needed. You get your page link and its management link.
Read the clean source, then publish it with its settings in one request. The answer holds your page link, your management link and an owner token for later updates; keep the management link and the token private. Your code reads every reply later with the same owner token.
curl -s https://brewpage.app/templates/lead-form/source > page.html
jq -n --rawfile content page.html \
--argjson state '{"collections":{"signups":{"mode":"private"}}}' \
'{content: $content, format: "html", state: $state}' \
| curl -s https://brewpage.app/api/html -H 'Content-Type: application/json' --data-binary @-Ask an AI assistant: one connected to BrewPage (remote MCP server https://brewpage.app/mcp, no install) or any assistant that can send web requests. Paste this:
Publish my own copy of this BrewPage template: https://brewpage.app/templates/lead-formIt publishes your copy and gives you two links: your page and its management link. Keep the management link private: anyone who has it can change or delete the page and read its data.
Make your own page save the same way: include the script, call it from your page script, and declare the list when you publish.
1. In your page's HTML
<script src="https://brewpage.app/js/state.js"></script>2. Your page script
let signups = null;
async function start() {
const s = await bp.state();
if (!s) return; // saving is off here; the page keeps working
signups = s.col("signups");
const mine = await signups.get("me"); // this visitor's reply, or null
}
async function signUp(name, email, session) {
if (signups) await signups.set("me", { name, email, session });
}
start();3. Publish body (POST /api/html)
{
"content": "<your page>",
"format": "html",
"state": {"collections":{"signups":{"mode":"private"}}}
}Link page on your domain
TemplateCustom domainPage dataYour links on one page, on an address you own. Plus a newsletter sign-up: each address is saved for you, on your domain and on the BrewPage link alike.
Publish it another way
Press Publish my copy above or on the template page. Nothing to install, no account needed. You get your page link and its management link. Then connect your domain in Manage: add a TXT and a CNAME record at your DNS provider, and BrewPage sets up HTTPS. Custom domains are free with a profile, up to 5.
Help: publish in 3 steps · Help: custom domain · Help: profile
Read the clean source, then publish it with its settings in one request. The answer holds your page link, your management link and an owner token for later updates; keep the management link and the token private.
curl -s https://brewpage.app/templates/link-page/source > page.html
jq -n --rawfile content page.html \
--argjson state '{"collections":{"subscribers":{"mode":"private"}}}' \
'{content: $content, format: "html", state: $state}' \
| curl -s https://brewpage.app/api/html -H 'Content-Type: application/json' --data-binary @-Then connect your domain with a profile token, or with the page's owner token added to a profile. The answer lists the DNS records to add.
curl -s -X PUT "https://brewpage.app/api/publications/html/$NS/$ID/domain" \
-H "X-Owner-Token: $BREWPAGE_TOKEN" -H 'Content-Type: application/json' \
-d '{"hostname": "links.example.com"}'Ask an AI assistant: one connected to BrewPage (remote MCP server https://brewpage.app/mcp, no install) or any assistant that can send web requests. Paste this:
Publish my own copy of this BrewPage template: https://brewpage.app/templates/link-pageIt publishes your copy and gives you two links: your page and its management link. Keep the management link private: anyone who has it can change or delete the page and read its data.
Make your own page save the same way: include the script, call it from your page script, and declare the list when you publish. Saving works on your connected domain too.
1. In your page's HTML
<script src="https://brewpage.app/js/state.js"></script>2. Your page script
let subscribers = null;
async function start() {
const s = await bp.state();
if (!s) return; // saving is off here; the page keeps working
subscribers = s.col("subscribers");
const mine = await subscribers.get("me"); // this visitor's address, or null
}
async function join(email) {
if (subscribers) await subscribers.set("me", { email });
}
start();3. Publish body (POST /api/html)
{
"content": "<your page>",
"format": "html",
"state": {"collections":{"subscribers":{"mode":"private"}}}
}Quiz with answers
TemplatePage dataFive questions; each visitor gets their answers back. Saves each visitor's answers; you read them all in Data. Coming back in the same browser restores the answers.
Publish it another way
Press Publish my copy above or on the template page. Nothing to install, no account needed. You get your page link and its management link.
Read the clean source, then publish it with its settings in one request. The answer holds your page link, your management link and an owner token for later updates; keep the management link and the token private.
curl -s https://brewpage.app/templates/quiz/source > page.html
jq -n --rawfile content page.html \
--argjson state '{"collections":{"answers":{"mode":"private"}}}' \
'{content: $content, format: "html", state: $state}' \
| curl -s https://brewpage.app/api/html -H 'Content-Type: application/json' --data-binary @-Ask an AI assistant: one connected to BrewPage (remote MCP server https://brewpage.app/mcp, no install) or any assistant that can send web requests. Paste this:
Publish my own copy of this BrewPage template: https://brewpage.app/templates/quizIt publishes your copy and gives you two links: your page and its management link. Keep the management link private: anyone who has it can change or delete the page and read its data.
Make your own page save the same way: include the script, call it from your page script, and declare the list when you publish.
1. In your page's HTML
<script src="https://brewpage.app/js/state.js"></script>2. Your page script
let answers = null;
async function start() {
const s = await bp.state();
if (!s) return; // saving is off here; the page keeps working
answers = s.col("answers");
const mine = await answers.get("me"); // this visitor's answers, or null
}
async function send(reply) {
// reply: { name, q1, q2, q3, q4, q5, score }
if (answers) await answers.set("me", reply);
}
start();3. Publish body (POST /api/html)
{
"content": "<your page>",
"format": "html",
"state": {"collections":{"answers":{"mode":"private"}}}
}Clicker game with save
TemplatePage dataTap, dig, level up; each player's progress is kept. Saves each player's level and coins for their next visit; you see every save.
Publish it another way
Press Publish my copy above or on the template page. Nothing to install, no account needed. You get your page link and its management link.
Read the clean source, then publish it with its settings in one request. The answer holds your page link, your management link and an owner token for later updates; keep the management link and the token private.
curl -s https://brewpage.app/templates/coin-cave/source > page.html
jq -n --rawfile content page.html \
--argjson state '{"collections":{"saves":{"mode":"private"}}}' \
'{content: $content, format: "html", state: $state}' \
| curl -s https://brewpage.app/api/html -H 'Content-Type: application/json' --data-binary @-Ask an AI assistant: one connected to BrewPage (remote MCP server https://brewpage.app/mcp, no install) or any assistant that can send web requests. Paste this:
Publish my own copy of this BrewPage template: https://brewpage.app/templates/coin-caveIt publishes your copy and gives you two links: your page and its management link. Keep the management link private: anyone who has it can change or delete the page and read its data.
Make your own page save the same way: include the script, call it from your page script, and declare the list when you publish.
1. In your page's HTML
<script src="https://brewpage.app/js/state.js"></script>2. Your page script
let saves = null;
let game = { level: 1, coins: 0 };
async function start() {
const s = await bp.state();
if (!s) return; // saving is off here; the page keeps working
saves = s.col("saves");
game = (await saves.get("slot1")) || game;
}
async function save() {
if (saves) await saves.set("slot1", game);
}
start();3. Publish body (POST /api/html)
{
"content": "<your page>",
"format": "html",
"state": {"collections":{"saves":{"mode":"private"}}}
}Learn more
- Help: save data from your page
- Help: publish in 3 steps · management link · profile · custom domain
- API: page data · AI agents and MCP · llms.txt
- Use cases: what else you can publish