Oriel
Give your product a voice
Website
·
Issues
About Oriel
Oriel is a voice assistant for your website or app. You add it with one script tag. Visitors click a button and talk to it, or type if they prefer.
It answers questions about your product, takes people to the page they need, and does things for them, like updating their billing. When someone gets stuck, it writes that down for your team.
You can use the hosted version at useoriel.com, or run it yourself for free with every feature included.
Features
- Voice calls. People talk to it like they would to your support team, in one of ten languages. They can interrupt it, and every call is saved as a transcript.
- Chat. The same assistant for people who'd rather type. It knows the same things and can do the same things.
- Learns your product. Give it your website, your docs, or files like PDFs and Word documents. It re-reads your pages so its answers stay current.
- Shows people around. It knows which page the visitor is on. It can take them to another page and point at the button they need.
- Takes action. It can call your API, run functions in your app, and look up or change things in Stripe. You decide which actions need a "yes" from the visitor first.
- Knows who's signed in. Your server tells it who the visitor is, so it only touches that person's account.
- Feedback for your team. Bugs, feature requests, complaints and people about to cancel get written up for you. Visitors can also ask for someone to get back to them.
- Integrations. Post to Slack, open tickets in Zendesk, Salesforce or HubSpot, save leads, and book meetings with Cal.com or Calendly.
- Your choice of model. Claude, Gemini or GPT, with a backup model in case the first one fails.
- Workspaces. Invite your team. Agencies can keep one workspace per client.
How it works
- Teach it. Add your website, docs and files, and list the pages it can send people to.
- Give it actions. Turn on Stripe, describe your API endpoints in a form, or register functions from your app.
- Add it to your site. Paste the script tag from your assistant's Install page:
<script src="https://useoriel.com/embed.js" data-agent-id="your-assistant-id" async></script>
To let it act on a signed-in user's account, sign a token (a JWT) on your server with the assistant's identity secret, and pass it in with Oriel("identify", { token }).
On a call, Gemini turns the visitor's speech into text, the assistant's model writes a reply, and ElevenLabs speaks it. Chat and calls run through the same code, so they share knowledge, actions and history.
Built with
- Next.js, React and Tailwind CSS
- Supabase (Postgres with pgvector, and sign-in)
- Claude, Gemini and GPT through the Vercel AI SDK
- Gemini and ElevenLabs for speech
- Stripe, Resend and Upstash
Run it yourself
A self-hosted install has every feature, with no plans or limits. You bring your own database and API keys.
Local setup
You need Node 22 or newer, Docker and the Supabase CLI.
npm install
supabase start # starts a local database
cp .env.example .env.local # then add your keys
npm run dev # http://localhost:3010
- Locally, sign-in codes go to Mailpit at http://127.0.0.1:55424 instead of your inbox.
- Your first sign-in creates a workspace. Create an assistant and open its Playground to talk to it.
npm run app-assistantadds the help assistant that answers questions inside the dashboard.npm run db:resetwipes your local data and rebuilds the database.- Google sign-in is optional. Put a Google OAuth client's ID and secret in
.env(not.env.local), addhttp://127.0.0.1:55421/auth/v1/callbackas a redirect URI, and restart Supabase.
Environment
.env.example explains every setting. To start, you only need:
NEXT_PUBLIC_APP_URL: where the app runs.- The Supabase URL and keys, from
supabase status. GOOGLE_API_KEY: Gemini, for search, summaries and understanding speech on calls.WIDGET_SESSION_SECRETandENCRYPTION_KEY: two random strings, for example fromopenssl rand -hex 32. Don't changeENCRYPTION_KEYlater, or saved keys can't be read.
Add these when you need them:
ELEVENLABS_API_KEYfor voice calls. Without it, assistants are text only.ANTHROPIC_API_KEYfor Claude Haiku, the default model. Without it, assistants use Gemini.OPENAI_API_KEYfor GPT.RESEND_API_KEYfor emails like invitations and follow-ups.
Leave NEXT_PUBLIC_EDITION unset. Setting it to cloud turns on the plans, billing and marketing site we use for useoriel.com.
Deploying
It's a standard Next.js app. We run it on Vercel with a hosted Supabase project.
- Set
NEXT_PUBLIC_APP_URLbefore you build. It's written into the embed script. - Apply the migrations in
supabase/migrationsto your Supabase project, for example withsupabase db push. - Set
CRON_SECRET. The scheduled jobs invercel.jsonuse it to refresh knowledge every day. - Sign-in codes are sent by Supabase, so set up email (SMTP) in your Supabase project.
Integrations
Each assistant connects its own services on its Integrations page. Every service gives the assistant a job to do:
| Job | Services |
|---|---|
| Tell the team when to step in | Slack |
| Open a ticket | Zendesk, Salesforce, HubSpot |
| Save a lead | Salesforce, HubSpot |
| Book a meeting | Cal.com, Calendly |
| Look up and change billing | Stripe |
Setting up each service
Services connect with OAuth, a key, or both. For OAuth, register <NEXT_PUBLIC_APP_URL>/api/integrations/<service>/callback as the redirect URL. If a service's keys are missing, its card in the dashboard says so.
- Stripe: customers can paste a restricted key, or install our Stripe App. To publish the app, upload it to your live Stripe account with
stripe apps upload integrations/stripe-app --live, then setSTRIPE_APP_INSTALL_URLto its install link. So that uninstalling the app in Stripe disconnects it here too, add<NEXT_PUBLIC_APP_URL>/api/integrations/stripe/webhookas a webhook endpoint for events on connected accounts, withapps.install.deletedandaccount.application.deauthorized, in your live account and in the app's managed sandbox. Then setSTRIPE_APP_WEBHOOK_SECRETandSTRIPE_APP_SANDBOX_WEBHOOK_SECRETto their signing secrets. Stripe has to review the app before other accounts can install it. - Slack: create an app from
integrations/slack-app-manifest.yml, then setSLACK_CLIENT_IDandSLACK_CLIENT_SECRET. Slack only accepts https redirect URLs, so locally runnpm run dev:httpswithNEXT_PUBLIC_APP_URL=https://localhost:3010. Turn on public distribution so other Slack workspaces can install it. - Zendesk: nothing to set up. Each customer creates an OAuth client in their own Zendesk, and the dashboard walks them through it.
- Salesforce: customers create their own app in Salesforce, and the dashboard walks them through it. For a one-click button, package your own app and set
SALESFORCE_CLIENT_IDandSALESFORCE_CLIENT_SECRET. - HubSpot: customers can paste a service key. For a Connect button, create a HubSpot app and set
HUBSPOT_CLIENT_IDandHUBSPOT_CLIENT_SECRET. It works in up to 25 accounts until it's listed on HubSpot's marketplace. - Cal.com: customers can paste an API key, which also works with self-hosted Cal.com. For a Connect button, create an OAuth client with the scopes
PROFILE_READ,EVENT_TYPE_READ,BOOKING_READandBOOKING_WRITE, then setCALCOM_CLIENT_IDandCALCOM_CLIENT_SECRET. - Calendly: customers can paste a personal access token. For a Connect button, create an OAuth app with the scopes
users:read,event_types:readandscheduled_events:write, then setCALENDLY_CLIENT_IDandCALENDLY_CLIENT_SECRET. Booking needs a paid Calendly plan. On a free plan, the assistant sends a booking link with the visitor's details filled in.
Contributing
Pull requests are welcome. Read CONTRIBUTING.md first. On your first pull request you'll be asked to sign our CLA, once.
Found a security issue? Please report it privately. See SECURITY.md.
License
Copyright © 2026 Accelerated Ideas OÜ. Oriel is open source under the AGPL-3.0 license, including the hosted service's billing and the marketing site.
If you run a changed version of Oriel as a service for other people, you have to share your source code with them. For a commercial license without these terms, email hello@useoriel.com.
The Oriel name and logo aren't covered by the license. See TRADEMARKS.md.