Skip to content

[design-doctor test] mem0-4837: Self-hosted dashboard and admin auth - #2

Open
adiraju13 wants to merge 86 commits into
bench/source-pr-base/design-doctor-feature-parity-expanded-20260610-152904Z/mem0-4837from
bench/design-doctor-dev-fresh-20260610-190958Z/mem0-1
Open

[design-doctor test] mem0-4837: Self-hosted dashboard and admin auth#2
adiraju13 wants to merge 86 commits into
bench/source-pr-base/design-doctor-feature-parity-expanded-20260610-152904Z/mem0-4837from
bench/design-doctor-dev-fresh-20260610-190958Z/mem0-1

Conversation

@adiraju13

@adiraju13 adiraju13 commented Jun 10, 2026

Copy link
Copy Markdown

Fresh clean test PR for hosted Design Doctor rerun testing.

Benchmark note: Self-hosted dashboard and admin auth.

Do not merge. This PR exists so Design Doctor can be run against a clean pull request with no prior review artifacts.

Add a production-ready dashboard and auth layer to the self-hosted
server. Forked from platform/frontend/ and stripped of Cloud-specific
code (multi-tenancy, OAuth, PostHog, billing).

Backend:
- SQLAlchemy models (User, APIKey, Invite) with Alembic migrations
- JWT + API key auth with ADMIN_API_KEY backward compat
- Auth, API key, team, and stats routers
- CORS middleware for dashboard origin

Dashboard (Next.js 15, forked from platform/frontend/):
- Same design system (tokens, fonts, shadcn/ui components)
- Email/password login with JWT via httpOnly refresh cookie
- Setup wizard (admin account, providers, API key, test)
- Pages: dashboard, memories, search, api-keys, team, config, settings
- 5 locked teaser pages (categories, graph, webhooks, analytics, export)
- Upgrade nudges with localStorage dismissal

Infrastructure:
- Docker Compose: dashboard service with health check, init-db.sh
- README three-path table (library / self-hosted / cloud)
- Library log message on local-storage instantiation
- Add PYTHONPATH to docker-compose for mem0 package resolution
- Pin bcrypt==4.0.1 (passlib compatibility with newer bcrypt)
- Add pydantic[email] for EmailStr validation
- Add Makefile with up/down/clean/logs/seed/health targets
- Add scripts/seed.sh for quick dev account creation
- Remove dead code: unused imports, reducers (memory, settings, filter),
  hooks (useMemory), constants (common, state, events), closeSidebar
- Fix type safety: replace `any` selectors with RootState, type dispatch
  as AppDispatch, remove `as any` cast
- Add require_auth dependency to eliminate repeated null-check guards
- Import ADMIN_API_KEY from auth.py instead of duplicating in main.py
- Use Literal["admin", "member"] for invite role validation
- Rename navWrapper.tsx to nav-wrapper.tsx (kebab-case consistency)
- Remove trailing slashes from router paths and api-endpoints.ts
- Replace Optional[X] with X | None in auth.py
- Remove redundant redux-thunk dependency
- Remove leftover Cloud comments (tsconfig warning, APOC comment)
- Add responsive grid breakpoint to dashboard stats
- Recreate missing lib/utils.ts, lib/auth.tsx, lib/types.ts
…ockfile

- Setup step 2 now uses api instance (sends auth header) instead of raw
  fetch, and checks response status before advancing
- Setup step 3 uses api.post instead of raw fetch with manual token
- Middleware checks /auth/setup-status for root, login, and setup routes:
  redirects to /setup if needsSetup, blocks /setup after setup complete
- Remove package-lock.json (keep yarn.lock per platform convention)
- Simplify setup wizard step indicator condition
- Remove excess comment from add_memory exception handler
- Replace verbose update_memory docstring with one-liner
- Remove dead lib/types.ts (MemoryObject unused)
- Add EmptyState component with theme-aware SVG illustrations
- Add TableSkeleton loading states to memories, api-keys, and team pages
- Add empty states to memories, api-keys, and search pages
- Add Mem0 logo and improved layout to login page
- Add step titles inside setup wizard cards
- Use semantic design tokens in locked page mockups
- Add responsive grid breakpoints to locked page previews
- Fix dark mode: replace hardcoded bg-black/5 with semantic token
- Skip internal admin routes (/auth, /stats, /api-keys, /requests,
  /configure) from RequestLog so ops_today no longer inflates on
  every dashboard refresh.
- Count total memories from the live pgvector store instead of the
  unused sqlite history DB (which was always empty in containerized
  deployments).
- Allow GET /memories without an identifier; dashboard memories page
  now lists all memories by default and exposes user_id as an
  optional filter.
- Remove Graph Memory from the sidebar and delete its route.
…r OSS

- Add src/types/api.ts with shared Memory, ApiKey, SearchResult, ApiRequestLog, DashboardStats types; remove inline duplicates across pages
- Add useApiQuery hook wrapping loading/error/toast pattern; migrate memories, api-keys, requests, configuration, useDashboardStats
- Replace any + ts-ignore with unknown + getErrorMessage in api-keys, search, copy-button
- Swap native confirm() for DeleteConfirmationModal on API key revoke
- Fix upgrade-banner hydration flash via mounted gate
- Surface silent catches in setup and configuration pages
- Wire htmlFor/id on login-form and setup form labels
- Delete unused auto-resize, autoResizeTextarea, and typo'd collabsable files
- Enable ESLint in next build with next/core-web-vitals config
…board-auth

# Conflicts:
#	README.md
#	mem0/memory/main.py
#	server/main.py
…sts the default route

Delete the dashboard overview page and its supporting code (useDashboardStats
hook, stats Redux slice, DashboardStats type, STATS_ENDPOINTS) along with the
backend /stats/overview router that exclusively served it. Middleware now
redirects /dashboard → /dashboard/requests, and login/setup flows land users
directly on the requests page.
The 'Generate API Key' step created the key and jumped straight to the
test step, leaving the unreachable key-display UI. Stop auto-advancing
so users can copy the key before continuing.
The LLM provider/model/api-key inputs on the Configure step wrote to the
process-memory-only /configure endpoint, so anything entered was lost on
container restart. The server already treats env vars as the source of
truth. Surface that clearly: show the effective provider, model, and
embedder as read-only fields with a pointer to supported-provider docs,
and drop the misleading API key input and the unused handleStep2 POST.
Wrap each step's UI in a <form onSubmit> with type='submit' buttons so
Enter advances the flow from any focused input, matching the login-form
pattern.
Aggregate distinct user_id/agent_id/run_id values across memory payloads
and expose them as entities, matching the hosted platform's Entities
concept. Adds GET /entities for listing with memory counts and
DELETE /entities/{type}/{id} which cascades through Memory.delete_all.
The dashboard page reuses the existing DataTable, EmptyState, and
DeleteConfirmationModal patterns and slots into the Activity nav group.
Self-hosted doesn't expose the search UI. Delete the search page, the
Search nav entry, the SearchResult type, and MEMORY_ENDPOINTS.SEARCH.
The backend /search endpoint is untouched since it's part of the public
Mem0 API.
@softlight

softlight Bot commented Jun 30, 2026

Copy link
Copy Markdown

Redesign

Requests: A focused metric strip and brand-consistent logs make the snapshot readable at a glance

Before · After

Requests

  • The three floaty KPI cards became one unified metric strip, and each number now carries context ("1 failed", "9 of 10 OK", "across recent traffic") instead of empty space.
  • Status and method badges now use Mem0's own colors with a clear success / client-error / server-error hierarchy, so real failures stand out while routine traffic stays calm.

Sign-in: A full-strength primary button and lifted card make the screen feel intentional

Before · After

Sign-in

  • The Sign in button no longer renders grey/disabled on load — it's a confident, full-strength primary action that validates on submit.
  • A one-line subtitle under the heading and a gently lifted card give the sign-in a grounded, trustworthy composition.
Prompt to build with AI
This is a comment left during a design review.

Goal:
Apply the Designer's pass shown in the before/after references below. Preserve product behavior, routes, data meaning, and the local design system while matching the stronger composition, hierarchy, spacing, alignment, and visual balance.

Current PR screenshots:
- Self-hosted Requests dashboard current PR: https://drive.softlight.com/a568ef2873d9d2a54c38fae916e7863b.png
- Self-hosted admin Sign-in current PR: https://drive.softlight.com/f1e1d550a24351f36b7c6acce32b0781.png

After/Designer's pass screenshots:
- Self-hosted Requests dashboard prototype: https://drive.softlight.com/9958d9b3e9c15d6e389116caeb847ff4.png
- Self-hosted admin Sign-in prototype: https://drive.softlight.com/ec648bacc097be6689d1ee38b911726c.png

Context:
The Requests page and admin Sign-in both looked half-finished: KPI numbers floated in oversized empty cards, request logs used off-brand rainbow colors, and the Sign in button rendered grey like it was disabled. This pass rebuilt the KPI row into a single metric strip that gives each number context, recolored the log badges with Mem0's own status/method colors so real failures stand out, and made the sign-in button a confident, always-clickable primary action with a one-line subtitle and a lifted card.

What the Designer's pass changed:
- Requests metrics: the three floaty stat cards became one unified strip, and each number now shows supporting context (how many failed, how many succeeded, what the latency spans) instead of sitting in empty space.
- Requests logs: status and method badges moved from raw palette colors to Mem0's semantic colors, with a clear success / client-error / server-error hierarchy so genuine failures pop while routine traffic stays calm.
- Sign-in: the primary button no longer looks disabled on load — it's a full-strength action — and a short subtitle plus a gently lifted card give the screen a grounded, trustworthy composition.

Use the before screenshots to understand the current surface and the after screenshots as the target direction. Make the smallest coherent set of source changes that gets the existing app to that visual result, then render and inspect the UI before stopping.

@rohanneilkapoor rohanneilkapoor added the softlight:review Force Softlight review label Jul 5, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@orianna-ai orianna-ai deleted a comment from softlight Bot Jul 16, 2026
@softlight

softlight Bot commented Jul 16, 2026

Copy link
Copy Markdown

Before/after suggested changes

Before · After

Sign-in button now looks ready, not broken

Before, the Sign In button was greyed out on first load, so the sign-in screen read as disabled or broken before you'd typed anything. Now it's a solid, confident button that clearly invites you to act, with validation shown only when you submit.

Prompt to fix with AI
This is a comment left during a design review.

Comment:
**Sign-in button now looks ready, not broken**
Before, the Sign In button was greyed out on first load, so the sign-in screen read as disabled or broken before you'd typed anything. Now it's a solid, confident button that clearly invites you to act, with validation shown only when you submit.

Issue:
In server/dashboard/src/app/(auth)/login/login-form.tsx the submit Button uses disabled={submitting || !emailValid || !password}, so it renders greyed-out until both fields are valid, reading as broken on first load.

Suggested fix:
Adopt the redesign: change the Button to disabled={submitting} and move field validation to submit time (add the `if (!password) { setError("Enter your password."); return; }` guard in the submit handler), so the CTA always looks active.

Screenshots:
- Before: https://drive.orianna.ai/2d17030e0604690cbc6a653afc234422.png
- After: https://drive.orianna.ai/027d9773b0b0b2e63c27684d54168334.png
Use these screenshot URLs as visual evidence if your environment can open remote images.

How can I resolve this? Keep the fix scoped to the PR-touched UI and preserve existing design-system patterns.

@softlight

softlight Bot commented Jul 16, 2026

Copy link
Copy Markdown

Before/after suggested changes

Before · After

Compact metric strip with more useful detail

Before, the three stat cards were large and mostly empty, showing just a single number each. Now they're a tight metric strip where each figure carries a helpful second line — successful count, failed count in red, and peak latency — so you learn more at a glance without the wasted space.

Prompt to fix with AI
This is a comment left during a design review.

Comment:
**Compact metric strip with more useful detail**
Before, the three stat cards were large and mostly empty, showing just a single number each. Now they're a tight metric strip where each figure carries a helpful second line — successful count, failed count in red, and peak latency — so you learn more at a glance without the wasted space.

Issue:
In server/dashboard/src/app/(root)/dashboard/requests/page.tsx the stats are three separate Cards in a grid, each with only a label and value, leaving large empty areas.

Suggested fix:
Adopt the redesign: collapse the three Cards into one bordered Card with a grid-cols-3 divide-x strip, and add the secondary hint line to each metric (successful count, failed count with danger tone, peak latency), computing peakLatency = Math.max(...logs.map(l => l.latencyMs)).

Screenshots:
- Before: https://drive.orianna.ai/da2159a75a3bb3a8424f98de82add463.png
- After: https://drive.orianna.ai/9a50ecf73202a9415299dab232e43775.png
Use these screenshot URLs as visual evidence if your environment can open remote images.

How can I resolve this? Keep the fix scoped to the PR-touched UI and preserve existing design-system patterns.

@softlight

softlight Bot commented Jul 16, 2026

Copy link
Copy Markdown

Before/after suggested changes

Before · After

Method pills use consistent, on-brand colors

Before, the method pills used generic colors that didn't match the rest of the app. Now they use the product's own request colors so green, blue, amber, and red carry consistent meaning across the log and the wider product.

Prompt to fix with AI
This is a comment left during a design review.

Comment:
**Method pills use consistent, on-brand colors**
Before, the method pills used generic colors that didn't match the rest of the app. Now they use the product's own request colors so green, blue, amber, and red carry consistent meaning across the log and the wider product.

Issue:
getMethodClassName in server/dashboard/src/app/(root)/dashboard/requests/page.tsx maps methods to raw palette values (sky/amber/rose) and has no explicit GET case, so GET falls through to a grey default.

Suggested fix:
Adopt the redesign: map methods to the semantic request tokens (POST → surface-event-add, GET → surface-event-search, PUT/PATCH → memGold, DELETE → surface-event-delete) as in the diff.

Screenshots:
- Before: https://drive.orianna.ai/29e90fbe9141992ef0d6ab110f8d6d34.png
- After: https://drive.orianna.ai/080be4556f246e3125138d214368f2a5.png
Use these screenshot URLs as visual evidence if your environment can open remote images.

How can I resolve this? Keep the fix scoped to the PR-touched UI and preserve existing design-system patterns.

@softlight

softlight Bot commented Jul 16, 2026

Copy link
Copy Markdown

Before/after suggested changes

Before · After

Latency values are easier to scan and compare

Before, latency numbers were plain text and large values like 1240 ms ran together. After, they use a monospaced, aligned format with a thousands separator (1,240 ms), so the column reads cleanly and slow requests are easy to spot at a glance.

Prompt to fix with AI
This is a comment left during a design review.

Comment:
**Latency values are easier to scan and compare**
Before, latency numbers were plain text and large values like 1240 ms ran together. After, they use a monospaced, aligned format with a thousands separator (1,240 ms), so the column reads cleanly and slow requests are easy to spot at a glance.

Issue:
In server/dashboard/src/app/(root)/dashboard/requests/page.tsx the Latency column renders `<span>{value} ms</span>` with default proportional font and no digit grouping.

Suggested fix:
Adopt the redesign's Latency render: `<span className="font-mono text-xs tabular-nums text-onSurface-default-secondary">{value.toLocaleString()} ms</span>` so digits align and large values get a thousands separator.

Screenshots:
- Before: https://drive.orianna.ai/697e0db3b857a63fad9b964ee947cd17.png
- After: https://drive.orianna.ai/b1e3676739bd08c5787af7ca5222928e.png
Use these screenshot URLs as visual evidence if your environment can open remote images.

How can I resolve this? Keep the fix scoped to the PR-touched UI and preserve existing design-system patterns.

@softlight

softlight Bot commented Jul 16, 2026

Copy link
Copy Markdown

Before/after suggested changes

Before · After

Sign-in now explains what you're signing into

Before, the sign-in card jumped straight from the title to the email field with no context. After, a one-line subtitle under 'Sign in to Mem0' tells you what the dashboard is for, so the screen feels finished and intentional rather than bare.

Prompt to fix with AI
This is a comment left during a design review.

Comment:
**Sign-in now explains what you're signing into**
Before, the sign-in card jumped straight from the title to the email field with no context. After, a one-line subtitle under 'Sign in to Mem0' tells you what the dashboard is for, so the screen feels finished and intentional rather than bare.

Issue:
In server/dashboard/src/app/(auth)/login/login-form.tsx the heading is followed immediately by the form card with no supporting copy.

Suggested fix:
Add the redesign's subtitle beneath the heading: `<p className="text-sm text-onSurface-default-secondary text-center mt-1.5 mb-6">Manage memories, keys, and requests on your self-hosted instance.</p>` and remove the heading's `mb-6` so spacing stays tight.

Screenshots:
- Before: https://drive.orianna.ai/8837570b3ef68f114c5f17d0a1518c88.png
- After: https://drive.orianna.ai/6dfd104cb17af88dc2c2892f5dd1ddd1.png
Use these screenshot URLs as visual evidence if your environment can open remote images.

How can I resolve this? Keep the fix scoped to the PR-touched UI and preserve existing design-system patterns.

@rohanneilkapoor

Copy link
Copy Markdown

@softlight take another look

return "border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-900/40 dark:bg-amber-950/40 dark:text-amber-300";
}

return "border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-900/40 dark:bg-emerald-950/40 dark:text-emerald-300";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Status badges use raw palette colors instead of the dashboard's status colors

These request-status badges are painted with generic Tailwind palette colors (emerald, rose, amber), so on screen the greens and reds are a different hue from every other success/error color in the dashboard and won't track the theme. The dashboard already has semantic status colors for exactly this — positive (surface-positive-primary / onSurface-positive-primary), danger (surface-danger-primary / onSurface-danger-primary), and gold (memGold) — which the login error banner, toasts, and this page's own default branch already use.

Prompt to fix with AI
This is a comment left during a design-system review.

Comment:
**Status badges use raw palette colors instead of the dashboard's status colors**
These request-status badges are painted with generic Tailwind palette colors (`emerald`, `rose`, `amber`), so on screen the greens and reds are a different hue from every other success/error color in the dashboard and won't track the theme. The dashboard already has semantic status colors for exactly this — positive (`surface-positive-primary` / `onSurface-positive-primary`), danger (`surface-danger-primary` / `onSurface-danger-primary`), and gold (`memGold`) — which the login error banner, toasts, and this page's own default branch already use.

Issue:
getStatusClassName returns hardcoded Tailwind palette classes (border-rose-200/bg-rose-50/text-rose-700, border-amber-200/bg-amber-50/text-amber-700, border-emerald-200/bg-emerald-50/text-emerald-700 plus dark variants) for 5xx/4xx/2xx status badges.

Suggested fix:
Map status to the semantic color tokens defined in server/dashboard/tailwind.config.ts and used app-wide: danger (surface-danger-primary / onSurface-danger-primary), positive (surface-positive-primary / onSurface-positive-primary), and memGold-* for warnings — matching login-form.tsx (bg-surface-danger-primary text-onSurface-danger-primary) and sonner.tsx (surface-positive-primary / surface-danger-primary).

Where:
server/dashboard/src/app/(root)/dashboard/requests/page.tsx (getStatusClassName)

How can I resolve this? Keep the fix scoped to the PR-touched UI and preserve existing design-system patterns.

const getMethodClassName = (method: string) => {
switch (method.toUpperCase()) {
case "POST":
return "border-sky-200 bg-sky-50 text-sky-700 dark:border-sky-900/40 dark:bg-sky-950/40 dark:text-sky-300";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HTTP method badges use raw palette colors instead of the dashboard's semantic colors

The POST/PUT/DELETE method badges are colored with generic Tailwind palette values (sky, amber, rose), so they render as a different blue/red than the rest of the app and won't follow the theme — while the default branch right below them correctly uses the product tokens (surface-default-secondary). Use the same semantic color tokens as that default branch: info (surface-info-primary / onSurface-info-primary), danger (surface-danger-primary / onSurface-danger-primary), and gold (memGold).

Prompt to fix with AI
This is a comment left during a design-system review.

Comment:
**HTTP method badges use raw palette colors instead of the dashboard's semantic colors**
The POST/PUT/DELETE method badges are colored with generic Tailwind palette values (`sky`, `amber`, `rose`), so they render as a different blue/red than the rest of the app and won't follow the theme — while the default branch right below them correctly uses the product tokens (`surface-default-secondary`). Use the same semantic color tokens as that default branch: info (`surface-info-primary` / `onSurface-info-primary`), danger (`surface-danger-primary` / `onSurface-danger-primary`), and gold (`memGold`).

Issue:
getMethodClassName returns hardcoded Tailwind palette classes (sky-*, amber-*, rose-* plus dark variants) for POST/PUT/PATCH/DELETE, while its own default branch uses semantic tokens (border-memBorder-primary bg-surface-default-secondary text-onSurface-default-secondary).

Suggested fix:
Use the semantic color tokens from server/dashboard/tailwind.config.ts for the colored methods too: info (surface-info-primary / onSurface-info-primary) for POST, memGold-* for PUT/PATCH, danger (surface-danger-primary / onSurface-danger-primary) for DELETE — consistent with the default branch and with login-form.tsx / sonner.tsx.

Where:
server/dashboard/src/app/(root)/dashboard/requests/page.tsx (getMethodClassName)

How can I resolve this? Keep the fix scoped to the PR-touched UI and preserve existing design-system patterns.

@softlight

softlight Bot commented Jul 20, 2026

Copy link
Copy Markdown

Before/after suggested changes

Before · After

Status codes now make real failures stand out

Before, every non-200 status shared loud warning colors, so a routine 404 looked as alarming as a 500. Now success reads calm green, client errors sit quietly, and only true server failures show bold red — so real problems jump out while scanning the log.

Prompt to fix with AI
This is a comment left during a design review.

Comment:
**Status codes now make real failures stand out**
Before, every non-200 status shared loud warning colors, so a routine 404 looked as alarming as a 500. Now success reads calm green, client errors sit quietly, and only true server failures show bold red — so real problems jump out while scanning the log.

Issue:
In server/dashboard/src/app/(root)/dashboard/requests/page.tsx, getStatusClassName colors 4xx with amber (border-amber-200 bg-amber-50 text-amber-700 ...) and 5xx with rose, giving every error a similar loud treatment regardless of severity.

Suggested fix:
Adopt the redesign's getStatusClassName: 5xx -> border-transparent bg-surface-danger-primary text-onSurface-danger-primary (bold red), 4xx -> border-memBorder-primary bg-surface-default-secondary text-onSurface-danger-primary (quiet), 2xx/3xx -> border-transparent bg-surface-positive-primary text-onSurface-positive-primary (green), so only real server errors draw the eye.

Screenshots:
- Before: https://drive.orianna.ai/4fe9424df015a8c0ccf1e2759616ef49.png
- After: https://drive.orianna.ai/f28ea12cd4ff6851183569ac9b7f512e.png
Use these screenshot URLs as visual evidence if your environment can open remote images.

How can I resolve this? Keep the fix scoped to the PR-touched UI and preserve existing design-system patterns.

@softlight

softlight Bot commented Aug 14, 2026

Copy link
Copy Markdown

Softlight Overview

Current PR UI

To run Softlight again, comment @softlight.

UX Score: 3/5

Suggested fixes

  • Status badges use raw palette colors instead of the dashboard's status colors
  • HTTP method badges use raw palette colors instead of the dashboard's semantic colors

Redesign

The self-hosted dashboard read as unfinished — floaty stat cards, off-brand log colors, and a sign-in button that looked disabled — so this pass tightened the hierarchy and made both screens feel intentional.

  • Requests: three sparse KPI cards became one clean metric strip where each number carries context, and request/status badges now use Mem0's own colors.
  • Sign-in: the primary button is now full-strength with a grounding subtitle and a gently lifted card.

@softlight

softlight Bot commented Aug 14, 2026

Copy link
Copy Markdown

Product recordings

Sign in to the self-hosted dashboard
Watch the recording

Review the request logs on the Requests dashboard
Watch the recording

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

softlight:review Force Softlight review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants