Your app, live on aprivate URL, with abackend attached.
Drop in a folder and it's online at /you/project/ — or claim /go/your-thing. Already behind Microsoft sign-in, already holding a database, file uploads, keyed API calls and AI. No server to run. No key to leak.
Static sites — HTML, or a built React / Vue / Vite / Astro / SvelteKit / Angular app. Nothing here is ever public.
🗄 database📎 file uploads✨ Opti.ai()
“Build a coming-soon page for the Q3 launch and deploy it as q3-launch”“Add a feedback form to this page and save the responses”“Make my pricing page private — only Alice and Bob”“What did I deploy this week?”“Share the onboarding app with my onboarding group”“Update the headline and redeploy”“Give my survey the link /go/q3-survey”“Show my open Jira tickets on this page”Add a button that summarises the feedback into three themes
0
API keys in your page
the portal holds every credential
1 GB
per deploy
drag a folder — or a .zip, up to 250 MB
10
versions kept
roll back any of them yourself
5
ways to deploy
idea, folder, chat, repo, or curl
You already know how this normally goes.
An internal tool is rarely hard to build. It is hard to get somewhere — a place to host it, a login in front of it, somewhere to put the data, a key nobody can steal. That is the part this removes.
The usual route8 steps · 3 teams
1Write the app
2Raise an infra ticket
3Wait
4Get a host
5Wire up SSO
6Provision a database
7Store a secret somewhere
8Finally share a link
Here2 steps · you
1
No files needed
Don't have anything to upload? Describe it instead.
Optimizely Site Builder writes the app for you, then publishes it straight into this portal — with the same live URL, the same versions, and the same backend attached.
1Site Builder
Describe the app
“A form that collects launch feedback, with a results page only I can see.”
2Site Builder
It builds it — you refine by asking
No files to edit. Change your mind in a sentence and it rewrites the app.
What comes attached
Six things you'd otherwise need a backend for.
None of these need a server, a signup, a budget line, or a key. They are already running — you just call them.
A database
No schema · no migrations · no key
Surveys, sign-ups, feedback, a shared list, a poll. Put one attribute on a form and it saves itself — every entry stamped with the colleague who submitted it, because the page is already behind sign-in. Sharing outside Optimizely? An external link can collect too, from people with no account at all.
Read it back in the project’s Data tab, export CSV, or get each new entry pushed to Teams.
Call an API that needs a key
The key never reaches the browser
Save the credential once in your project’s API connections, then call it by name. You choose the base URL and which methods are allowed — read-only by default — so a page can only ever do what you permitted.
Assistants
Give it your handbook. Every page can answer from it.
An assistant is a short brief plus your own files, saved under a name. Write it once in Settings, switch it on for the projects that should use it, and any page you deploy can ask it — no vector database, no backend, no keys.
1
Add your files
handbook.pdfquotedq3-numbers.xlsxcomputed
Handbooks, notes, PDFs, price lists, spreadsheets. One picker — we work out what each one is for.
2
Write one brief
“You are triaging renewals feedback. Prefer numbers to adjectives.”
How it works
A page that can't keep a secret, and never has to.
Everyone who opens your page can read its source — so we never gave it anything worth stealing. Your page calls things by name. The portal holds the credential and makes the real call from the server.
Your page
HTML, React, whatever you built
Opti.collection(…)save & read data
Opti.call('jira', …)another API
Opti.ai(…)ask a model
Opti.me()who is viewing
No key. No token. No config. The page is served behind sign-in, so the call already knows who is making it.
Five ways in · one outcome
Bring an idea, a folder, or a repo.
They all land in the same place, with the same URL rules: re-deploy under the same name and the link never changes.
Optimizely Site Builder
No files needed
Describe the app you want and it builds it — then you refine it by asking, not by editing files. Publishes straight into your namespace here, with versions. Already deployed something? Reopen it with Builder on its card.
Name it, then drag on a single index.html, a built folder (dist/, out/, build/) or a .zip. Or drag on a .md and it becomes a themed, shareable page — the quickest way to publish something an AI wrote. Your link appears immediately.
No tickets, no approvals
You own it end to end.
Every switch on this page belongs to whoever deployed the page. There is no queue to join and no admin to convince — including for the things that would normally be somebody else's job entirely.
The only thing an admin controls is how many projects you can have at once. Everyone starts with five, and you can ask for more from your own dashboard.
Decide who can open it — in one click
Everyone at Optimizely, a few people you name, a group you keep, or only you. Change it whenever — the link never changes when the audience does.
Hide it while it’s half-built
“Only me” is a lock, not a setting: it suspends your sharing rather than overwriting it, so unlocking gives back exactly what you had. It outranks everything — even the data stays hidden.
Bottom-right of every page
Ask OptiX instead of reading the manual.
It knows this portal, it sees exactly what you see, and it answers in a sentence rather than sending you off to a documentation page. Ask it as much as you like — unlike AI inside your own pages, OptiX has no monthly budget.
It sees what you see
Every lookup runs as you. It cannot read a private project you can't open, or a credential, ever.
It drafts. You decide
You get a confirmation card — what happens, who it reaches, how many get emailed. Nothing moves until you press it.
It can't deploy, rename or delete a project, add editors, or create a connection or channel — those hold a secret, and a secret is typed in by a person.
X
Before you start
The honest limits.
Worth thirty seconds now rather than a confusing failure later.
Nothing is ever public
Every link is gated by Microsoft sign-in. There is no setting that makes a page reachable from the open internet — “public” here means everyone at Optimizely.
Static sites only
Plain HTML, or a built React / Vue / Vite / Next.js export / Astro / SvelteKit / Angular / Gatsby app. No SSR and no Express — but your app can still store and read data, so a form or a survey needs no backend.
Up to 250 MB
Per deploy, from the dashboard. Big or multi-file builds go there rather than through a chat — some chat sandboxes can’t upload at all.
🔑 Opti.call('jira')
deploy.optimizely.com/dashboard
Drop a folder, or a .zipq3-launch/
Live · version 1deploy.optimizely.com/you/q3-launch/
Drop
Upload
Live
Share
No build server, no ticket, no waiting for a deploy slot.
“
”
“Hide my new dashboard until I’m done with it”
“Build a coming-soon page for the Q3 launch and deploy it as q3-launch”“Add a feedback form to this page and save the responses”“Make my pricing page private — only Alice and Bob”“What did I deploy this week?”“Share the onboarding app with my onboarding group”“Update the headline and redeploy”“Give my survey the link /go/q3-survey”“Show my open Jira tickets on this page”“Add a button that summarises the feedback into three themes”“Hide my new dashboard until I’m done with it”
Write the app
→
2Drop the folder here
→
Live, signed-in, with a database
The six steps in the middle didn't get skipped — they were done once, for everyone. Sign-in, hosting, versioning, the data store and the secret vault are already standing. Your app just arrives and uses them.
3Publish
It hands the app over
One click. The finished build is sent straight to this portal, into your namespace — privately first, so you can try it against your real database and your real sign-in before anyone else can see it.
4Deploy Portal
Live, with the backend attached
Your own URL, behind sign-in, with versions and a database — exactly like any other deploy.
Two products, one handover
Site Builder is a separate tool on its own address — you're already signed in, nothing to set up. It hands the finished app to this portal to publish, which is why everything on this page applies to what it makes: the database, file uploads, keyed API calls and AI.
Already deployed something? Hit Builder on its card and it reopens there, keeping the same project and URL. How Site Builder works →
const me = await Opti.call('jira', {
path: '/myself'
})
A connection belongs to you, not to one project — any page you deploy can name it.
Ask AI
No setup · searches the web · runs code
Summarise answers, sort feedback into themes, extract fields — one line, nothing to set up. It searches the web for live facts and runs code for real arithmetic. The portal holds the credential, so nothing secret goes near your page.
const themes = await Opti.ai(
'Group these into 3-5 themes',
{ input: text }
)
The one thing here that costs money per call — so it stays off until you switch it on, and the project page shows what you’ve used.
Answer from your own documents
Assistants · your handbook, your numbers
Give an assistant your handbook, your price list, last quarter’s numbers — then any page you deploy can ask it. Spreadsheets are computed rather than guessed at. Written once, switched on per project.
How it fits together is right below — files in, one brief, every page.
Or no page at all
A backend on its own
Sometimes there is nothing to visit — you want somewhere for another system to send data, a query that runs every morning, or a weekly summary in a channel. Make a project with a name and no files, and it does all three without a front end.
POST https://…/api/ingest/…/tickets
{ "title": "Laptop request",
"priority": "P1" }
Give the link to a Zendesk trigger, a CI job or a colleague’s script — it can only ever ADD entries — and update or remove its own, if you tick the box — but never READ. Deploy files to it later and it becomes an ordinary project, keeping everything it collected.
Know who’s looking
Nothing to ask, nothing to store
Greet them by name, pre-fill a form, show one team a different view. You never built a login, so there is no password to reset and no personal data of theirs to hold.
const me = Opti.me() // { name, email }
if (me) hello.textContent = 'Hi, ' + me.name
For display. The authoritative stamp on what someone writes is set server-side, so it can’t be faked from the page.
Work a team keeps
It outlives whoever made it
Deploy into a workspace and the WORKSPACE owns it — not you. When somebody changes team or leaves, nothing has to be handed over, because it was never theirs to hand over. The link, the data and the settings stay exactly where they are.
deploy.optimizely.com/growth-lab/experiment-tracker/
└─ the workspace, not a person
Anyone can make one — no approval to wait for. Admins manage it, Creators add work, and everyone in it can open everything.
Plus automations — on a clock or the moment an entry arrives: post a digest to Teams, call an API on a timer and park the answer so your page opens already fresh, or send the result on to another system so it raises the ticket rather than only mentioning it. See it all in the guide →
What it is for, in a sentence or two. Change it here and it changes everywhere it is on.
3
Any page can ask
await Opti.ai('What is our
refund policy?', {
assistant: 'handbook',
})
Tick it on per project, the way you would an API connection. One assistant, as many pages as you like.
It reads your documents
Answers are quoted from the files you gave it, not from what a model happens to remember — so “what does our policy say” has one right answer and it is yours.
It doesn’t guess at numbers
Give it a spreadsheet and it runs code over it. Ask a model to total a column without that and it adds up in its head — confidently, and wrongly.
It looks things up
It can search the web when a question needs a fact it does not have. On by default for a plain Opti.ai() call; per assistant after that.
Everyone who can open a project it is on can ask about its files — so an assistant on a page shared with everyone at Optimizely shares its files with them too. Settings shows which projects each one is on.
the browser stops here
The portal, server-side
Holds every credential. Never ships one.
Database
Schemaless. Every entry stamped with who submitted it.
File uploads
Attachments on a form, no extra code.
Your API keys
Saved once, called by name, read-only by default.
AI
Summarise, classify, extract. Searches the web, runs code, and answers from documents — via an assistant you write once and switch on per project.
Turn on Caller identity and each outbound call also carries a short-lived signed token naming the signed-in viewer — so the system on the far end can serve theirdata, not one shared account's.
“Build a coming-soon page for the Q3 launch and deploy it as q3-launch.” Then “update the headline and redeploy” — same URL, version bumps. It shows you a preview and asks before touching a real project. The portal speaks MCP, so the same server is already on Optimizely’s Opal — and can be added to any Opal instance.
One deploy token, one workflow file, and every push to main redeploys. The dashboard generates it filled in with your name, branch and build command. On Jenkins, GitLab or Azure DevOps instead? It’s a curl.
No Claude, no GitHub — a token and a POST. Claude Code registers the connector once with claude mcp add; anything else just posts a folder to the deploy endpoint.
Roll back a bad version, change who can see it, claim a short link, hand a colleague the keys while you’re on leave, or lock it to just you while you build. Nobody has to approve any of it.
No page at all? A data project gives you the database, the inbound link and the automations with nothing to build — for when you want somewhere to receive data, not something to show.
Share with a team, not a list
Make a group once, then add the new joiner to it and they get every project it’s on — including ones you shared before they arrived. Remove them and it’s gone everywhere, immediately.
Roll back a bad deploy yourself
Your recent versions are kept, each with its own shareable link. Set any of them live again. Nobody needs to be paged, and the URL people already have keeps working throughout.
Hand someone the keys while you’re away
Add a colleague as an editor and they deploy new versions at the same link, from their own account. They can’t rename it, delete it or add more editors — that stays with you.
Claim a link people can actually say out loud
deploy.optimizely.com/go/your-thing. It’s an alias, never a rename — the original keeps working forever, and the short one survives re-deploys.
See who actually opened it
Visits over time, how many people, and which colleagues — on the project’s own Analytics tab. Useful for the conversation about whether the thing you built is being used.
OptiX
always on
who can open this, and why can’t Sam?
It’s shared with the Onboarding group. Sam isn’t in it — want me to add them?
what has my form collected?
38 entries, 12 this week. Latest is 20 minutes ago.
has anyone built this already?
Your link never breaks
Re-deploy under the same name and the URL stays identical while the version bumps. There is no second link to hand round, ever.
No secrets in your code
Anyone signed in can read your page’s source, so we scan for hardcoded keys and warn you before publishing. Real credentials belong in API connections, server-side.
5 projects to start
The one limit an admin sets. Ask for more from your dashboard in a click — and delete an old demo any time to free a slot.
The thing you keep meaning to buildis an afternoon.
No infrastructure request. No backend. No key to keep safe. Pick a door.