Build
Branding
Your app's name, color and logo on the sign-in page and in every email your service sends. Three fields, one page, and the emails and the login page follow.
Your service shows pages and sends emails that your users see without passing through your app: the sign-in page an AI agent such as Claude opens, and the emails for verification, password reset, invitations and Stripe orders. Branding puts your app’s name, color and logo on all of them.
What you get:
-
One place. Set the name, the color and the logo once. Every email and the sign-in page use them.
-
Nothing to write. Our templates and our page stay as they are, with your brand on them. To change the words, replace them, as the last section says.
-
Safe defaults. Leave a field empty and the service uses its own name, our color and our logo.
The three fields
| Field | What it is for |
|---|---|
App name |
In the subject and the header of the emails, and on the sign-in page. Up to 60 characters. Empty, it is the service’s name. |
Color |
The header of the emails and the buttons, as |
Logo |
The address of a PNG or SVG image you host, |
Click Save: it takes effect within a minute. Back to the defaults clears the three fields.
The previews
The page shows what your users get, updated as you type:
-
The sign-in page, as an agent’s user sees it at
https://c0ffee.ulabase.app/oauth/login: your logo, your name, your color on the button. -
The emails: verification, password reset, invitation and the Stripe order confirmation, with sample names and links. The subject is shown above the message. A user gets the text in their language, English or Italian; the preview shows English.
Beyond the brand
The brand changes every page and email the service shows in your app’s name. To change the words or the layout, replace them:
-
Your own email templates. Paste them on the Sign-up page for verification, reset and invitation, and on the Stripe page for orders and subscriptions. Start from ours: the brand’s placeholders,
{{app-name}},{{app-color}},{{app-color-fg}}and{{app-logo}}, work in your templates too. Your own templates go out only from your own mail server, set on the Email page; from our address, only our templates leave, with your brand. -
Your own sign-in page. Host a page and set its URL under OAuth login page on the MCP page. Copy RESTHeart’s page at the version your service runs, linked from the Branding page, and read its contract in the RESTHeart documentation. The page calls
/authorize,/authorize/providersand/authorize/offerwith relative paths: hosted elsewhere, point them at your service’s address.
Do it from the command line
The same three values, as configuration you keep in git, with ulabase. Branding is a feature like every other, always on: getFeatureConfig and updateFeatureConfig with the id branding:
import { defineSetup, step } from '@ulabase/cli';
const brand = {
name: 'My Shop',
color: '#0f766e',
logo: 'https://myshop.example.com/logo.png',
};
export default defineSetup('Branding', [
step('brand set', {
async check({ admin, srvId }) {
const current = await admin.getFeatureConfig(srvId, 'branding');
return current['name'] === brand.name && current['color'] === brand.color && current['logo'] === brand.logo;
},
apply: ({ admin, srvId }) => admin.updateFeatureConfig(srvId, 'branding', brand),
}),
]);
The configuration is replaced as a whole: leave a key out and its default comes back. What is not a brand, a color that is not #rrggbb, a logo that is not an https PNG or SVG, is refused with 400 and the reason.
Related pages
-
Sign-up, login and invitations: the emails your users get when they register, and your own templates for them.
-
Email: how many emails you can send, and how to send from your own address.
-
MCP server: the sign-in page an agent opens, and how to use your own.
-
Stripe billing: order and subscription emails.