Client Portal
Branded client portal: video approval, team chat, project requests, and progress tracking.
Portal Overview
What is the Client Portal?
The Client Portal is a separate branded interface, isolated from your workspace. Clients see only their assigned projects and videos, communicate with your team via built-in chat, and approve deliverables — without access to your studio's internal data.
The portal runs on a separate domain or subdomain for your studio and uses its own authentication system, independent of Basalt accounts.
Key Features
- Dashboard — project stats, Gantt chart, upcoming deadlines, and videos pending approval
- Projects & Videos — view assigned projects, video cards with thumbnails from S3, Yandex Disk, and Google Drive
- Approval — approve videos or request revisions with comments, approval progress bar
- Chat — real-time messaging with your team per project
- Requests — submit new project requests, discuss details, track status
- Notifications — Telegram notifications for new videos, status changes, and deadlines
- Multi-Studio — one client can work with multiple studios through a single account
"Digital Noir" Design
The portal features a unique dark theme called "Digital Noir" — pure black background, glassmorphism effects, violet accents, and animations. Visually, the portal is entirely distinct from the main Basalt interface.
Studios on branding-enabled plans can customize the primary and accent colors, upload a logo, and set a studio name — clients will see your brand instead of Basalt.
Setup & Branding
Creating Clients
Clients are created in Studio → Clients. When creating a client, specify:
- Name — the client's display name
- Telegram ID or Email — depending on the authentication method configured for your studio
- Phone (optional) — for contact information
Each client receives a unique identifier (UUID) that can be used to generate a personalized login link.
You can also create a client automatically from a contact template — all projects linked to that contact are assigned immediately.
Assigning Projects
Clients only see projects that are assigned to them. Assignment and removal are available on the client's page:
- Go to Studio → Clients
- Select a client
- Click Assign Project and choose from the list
A single project can be assigned to multiple clients. The client will see the project in the portal immediately after assignment.
Sending Videos for Review
For a client to see a video in the portal, it must be explicitly sent for review:
- Open the project in the main interface
- Go to the project's files
- Select a video file and click Send for Review
This automatically creates a public viewing link and an approval record. If the client has Telegram connected, they will receive a notification about the new video.
Custom Branding
On plans with branding support (has_portal_branding), you can customize the portal's appearance:
| Setting | Description |
|---|---|
| Primary Color | Applied to buttons, links, and accent elements throughout the portal |
| Accent Color | Secondary color for supplementary elements |
| Studio Name | Displayed in the portal header instead of "Basalt" |
| Logo | Shown in the header and on the login page |
On white-label plans, the "Powered by Basalt" attribution is also hidden — clients see only your brand.
Subdomains
Each studio can use its own subdomain for the portal:
mystudio.basaltpms.com— the subdomain automatically routes to your studio's portal- Clients don't need to select a studio — they land directly in the right place
The subdomain is determined by your company slug. Configure it in Settings → Company → Slug.
Client Login
Authentication Methods
The portal supports four login methods. Each studio selects one primary method in settings.
| Method | How It Works | When to Use |
|---|---|---|
| Personal Link | Unique URL with client UUID — one-click login | Minimal friction: send the link in a messenger and the client enters the portal instantly |
| Telegram | Telegram Login Widget or bot verification | Clients already communicate with you via Telegram |
| Magic link or 8-digit OTP code sent to email | Formal clients who prefer email | |
| Hub Login | Telegram or Email on the root domain, not tied to a studio | Clients working with multiple studios |
Personal Link
The simplest login method. Each client has a unique UUID. Generate a link like:
https://yourcompany.basaltpms.com/portal/login?client=UUID
When the client visits the link, they are authenticated instantly without additional steps. The link can be sent via any messenger or email. Access is protected by rate limiting — 5 attempts per minute per IP.
Telegram Login
Two Telegram authentication options:
Telegram Login Widget — a "Login with Telegram" button on the login page. The client confirms authorization in Telegram, the server verifies the HMAC signature and finds the client by Telegram ID.
Bot Verification — the client receives a deep-link to the Telegram bot and taps "Start" — the bot confirms their identity. The code is valid for 10 minutes. The portal checks the status every few seconds and completes login automatically.
Email Login
The client enters their email on the login page. They receive:
- Magic link — a clickable link for one-click login (valid for 10 minutes)
- OTP code — an 8-digit code that can be entered manually on the login page
Both options work simultaneously — the client uses whichever is more convenient. Request rate is limited to prevent spam.
Session Security
The portal uses its own JWT token system, separate from Basalt accounts:
- Session token — httpOnly cookie, valid for 2 hours, bound to the client and studio
- Refresh token — automatically renews the session for up to 7 days
- Reuse detection — if a revoked refresh token is replayed, all sessions for that account are immediately invalidated
Client personal data (name, email, Telegram ID, phone) is stored encrypted using envelope encryption.
Dashboard & Projects
Home Page
After logging in, the client lands on a dashboard with a personalized greeting and an overview of all assigned projects.
Stat Cards:
- Pending Approval — number of videos awaiting a decision
- In Progress — projects in active status
- Total Projects — total number of assigned projects
- Approved — number of approved videos
Quick Actions — links to the Requests and Projects sections for fast navigation.
Gantt Chart
The dashboard displays an interactive Gantt chart with all assigned projects. Features include:
- Zoom: toggle between weekly and monthly views
- Horizontal scrolling along the timeline
- Color coding by project status
- Deadline markers
- Hover tooltips with approval statistics
Bento Grid
Below the stats, a bento grid displays two cards:
- Upcoming Deadlines — projects sorted by urgency
- Pending Videos — the latest videos awaiting the client's decision
Project List
The Projects section shows all assigned projects, split into two groups:
- In Progress — active projects (at the top)
- Other Projects — completed and archived, sorted by deadline
Each project shows its name, status badge, and deadline. The header displays the total project count and number of active ones.
Project Page
Clicking a project opens a detail page with:
- Project Card — name, status, description, deadline
- Timeline Bar — visual progress bar from creation date to deadline
- Approval Progress — segmented bar: approved / revision / pending
- Video Filters — tabs: All, Pending, Approved, Revision
- Video Grid — masonry layout of video cards
- Chat — sidebar panel (desktop) or floating button (mobile)
- Activity Feed — chronological timeline of project events
Review & Approval
Video Cards
Each video sent for review is displayed as a card in a masonry grid. The card includes:
- Thumbnail — preview from S3, Yandex Disk, or Google Drive (or a placeholder if unavailable)
- File name and size
- Play button — opens the video via a public link in a new tab
- Status badge — top-right corner: pending, approved, or revision
Approving Videos
For videos with "Pending" status, two buttons are available:
- Approve (green checkmark) — the video receives "Approved" status with the approval date
- Request Revision (X mark) — opens a modal for entering revision notes
After approval or revision request, the card badge updates instantly. The studio team sees the result in their interface.
Requesting Revisions
When requesting a revision, a modal window opens where the client describes what needs to be changed. The revision notes are displayed on the video card — the team can see them in the project's approval section.
The studio can rework the video and send it for review again — the card will return to "Pending" status.
Approval Progress Bar
The project page displays a segmented progress bar showing the state of all videos:
- Green — approved videos
- Yellow — under revision
- Gray — awaiting decision
The bar fills with animation, giving the client a clear visual sense of project progress.
Activity Feed
The project sidebar displays a chronological event feed:
sent_for_review— video sent for reviewvideo_approved— video approved by the clientrevision_requested— client requested revisions
The dashboard also features a global feed of the latest 15 events across all projects.
Chat & Requests
Team Chat
Each project has its own chat for communication between the client and the studio team. Chat works in real time via Supabase Realtime.
Interface:
- On desktop — collapsible sidebar panel
- On mobile — floating action button (FAB) with unread badge
Chat Features
- Send and receive messages in real time
- Edit your own messages (hover on desktop, long-press on mobile)
- Delete your own messages
- Date separators (Today / Yesterday / date)
- Auto-scroll to new messages
- Messages marked as read when panel opens
- Unread counter — updates every 30 seconds and on window focus
Project Requests
Clients can submit requests for new projects via the Requests section in the portal. When creating a request, they specify:
- Project title and description
- Desired deadline
- Number of videos
- Budget (optional)
- Reference links (optional)
Request Statuses
Each request goes through the following statuses:
| Status | Description |
|---|---|
| Pending | Request submitted, awaiting review |
| In Review | Studio has taken the request into consideration |
| Approved | Studio accepted the request |
| Rejected | Request declined with a reason provided |
| Converted | Request has been turned into an actual project |
Clients can filter requests by status. Each request page includes a comment thread for discussing details with the studio.
Request Detail Page
The request detail page shows all information: title, description, status, priority, deadline, video count, budget, and reference links. Additionally:
- Reviewer name and review date (if processed)
- Rejection reason (if declined)
- Link to the project (if converted)
- Comment thread for back-and-forth discussion between client and studio
Client Settings
Clients can add or change their email address in the portal settings. Email is used for:
- Login via magic link / OTP
- Receiving notifications
- Identification when working with multiple studios
Email uniqueness is verified within the studio when added.
Linking Telegram
In settings, clients can link or unlink their Telegram account. Linking works via the Telegram bot:
- Client clicks Link Telegram
- A deep-link to the Telegram bot is generated
- Client opens the link and taps "Start" in the bot
- The portal automatically checks the status every 3 seconds
- After confirmation, Telegram is linked to the account
Telegram can only be unlinked if the client has an email set — at least one login method must remain.
Notifications
Notifications require a connected Telegram account. Available notification types:
| Type | Description |
|---|---|
| Video for Review | Studio sent a video for approval |
| Project Status Change | Project status has changed |
| Deadline Reminder | A project deadline is approaching |
Each type can be toggled individually. All notifications are enabled by default. A Send Test Notification button lets you verify everything works.
Multi-Studio
If a client works with multiple studios on Basalt, they receive a unified account (Portal Account) that links all their client records.
How it works:
- When logging in via the root domain (no subdomain), the system finds all of the client's studios
- If there's only one studio — the client enters it automatically
- If there are multiple studios — the Hub page opens, showing a studio selector
- On the Hub page, each studio is displayed as a card with its logo, name, color, and project count
- The client can switch between studios via Settings → Switch Studio