- prioritize scannability over dense raw output
- show normalized insights first and raw evidence second
- design pages to work well on desktop and mobile
- load first data server-side and layer in live updates progressively
- keep scan completion state tied to persisted records, not optimistic UI
Public landing and sign-in surface.
The page renders the product hero and LoginStage. Authenticated users are redirected to /dashboard, or to /change-password when a temporary password must be replaced. If first-run bootstrap is open, unauthenticated users are redirected to /setup.
- product hero
- GitHub link
- local-development setup link when dev actor preview is enabled
- email/password sign-in form
- sign in with email/password
- enter demo mode when demo mode is enabled
- continue to
/dashboardafter signing in
First-run administrator bootstrap.
- renders the first-admin setup form while bootstrap is open
- redirects demo deployments to
/dashboard - redirects completed authenticated users to
/dashboard - redirects unauthenticated users back to
/after bootstrap has closed - allows a local development preview when
STACKRAY_ENABLE_DEV_ACTOR=true
Compatibility redirect.
Redirects to /; the root page owns the active sign-in UI.
Request a password reset email when email delivery is configured.
- request password reset email
- show the admin-managed temporary password fallback when email is disabled
Complete a Better Auth password reset using the reset token in the query string.
Force a user to replace a temporary password before entering the product.
- redirects unauthenticated users to
/ - redirects users without
requiresPasswordChangeto/dashboard
Authenticated account security settings.
- change the current user's password
- optionally sign out other active sessions after changing the password
Authenticated home base for active work.
- quick scan command bar
- overview metrics
- recent scan sequence
- active scan polling for analyzing scans
- submit scan
- open recent scan
- load more recent scans
Dedicated scan configuration form.
- target URL or domain
- initial target from the
targetquery parameter - scan options supported by the scan contract
On submit, redirect to /scans/[scanId].
Live and historical scan detail page.
- scan header and overview band
- live client for SSE-driven updates
- technologies
- delivery, redirects, and scan information
- DNS infrastructure and network intelligence
- TLS certificate and fingerprints
- domain information and robots.txt
- subdomains
- screenshot and content signals
- target history
- raw evidence, including nuclei details
- require an authenticated app session
- load scan record, detail payload, authoritative result, target history, and subdomains server-side
- subscribe to persisted scan events if the scan is still changing
- return not found for scans the actor cannot access
Authenticated scan-detail prototype page with static sample data.
This route is not part of primary navigation. Treat it as an internal design/prototype surface unless it is removed or promoted.
Global scan runs.
This page is scan-run-centric, not target-centric.
- text search
- normalized status
- actor source (
ui,cli,api,system)
- submitted at
- targets
- status
- source
- created by
- duration
- phase progress
- top technologies
Target inventory over stored scan results.
Shows the latest result per canonical target. Expanding a target reveals recent historical runs for that canonical target.
- free text
- technology filter
- CDN filter
- server filter
- WordPress plugin filter
- WordPress theme filter
- CPE filter
- status code filter
- date range
- target
- latest title and favicon
- latest technologies
- screenshot preview when available
- last scanned at
- latest scan link
- target history
Compare targets that share selected technologies and export a shareable visual.
- technology multi-select
- suggested technology combinations
- site filter
- export target selection
- export style
- brand visibility toggle
- copy or download image
Uses /api/v1/targets/technology-comparison and /api/v1/targets/technology-options.
Manage recurring scan schedules.
- create daily, weekly, or monthly schedules
- enter one or more targets
- choose local time and timezone
- edit schedule definitions
- pause or resume schedules
- delete schedules
Schedule dispatch is handled by Graphile Worker through the schedule_due_scans task. Demo mode disables schedule creation and hides account controls.
Manage API keys for scripts, CI jobs, scheduled workers, and other API clients.
- hidden in demo mode
- shows a disabled state when the user's API key access is off
- supports create, one-time API key reveal, list, and revoke
- includes a link to the API quickstart guide at
/settings/api-docs
Authenticated API quickstart and reference documentation.
- authentication modes
- base URL
- scan workflow examples
- runs and target lookup
- schedules
- API key management notes
- error handling reference
- linked from
/settings/api-keys - not a primary sidebar destination
Admin-only user management surface.
- create user
- assign role (
admin,user,viewer) - manage API key access for non-admin users
- issue temporary password
- trigger password reset email when configured
- delete user
- hidden in demo mode
- redirects non-admin authenticated users to
/dashboard
app/(public)/...organizes/,/sign-in, and password flowsapp/(authenticated)/...organizes signed-in product pagesapp/setup/page.tsxis outside both route groups because first-run bootstrap can be reached before a session exists- route-group folder names are implementation-only and do not appear in the visible URL
Dedicated authenticated sidebar destinations:
/dashboard/targets/runs/technology-compare/schedules/settings/api-keyswhen API key access is enabled/settings/usersfor admins only
Non-sidebar drill-down or task pages:
/scans/new/scans/[scanId]/scans/redesign/settings/api-docs
- use server-side fetches for initial page data
- keep large raw response payloads behind explicit expand actions
- use sticky filter bars on runs and targets pages
- poll or subscribe only while active scans need updates
- use optimistic UI only for non-critical actions like local scan-list insertion, not for scan completion states