-
Sortable columns in All Approvals table (click headers to toggle asc/desc)
-
Click any User/Device/Network/Status cell to populate search and filter
-
Restore Access option for suspended memberships via assign endpoint
Add a celebratory experience when users join or create an organization:
- Add canvas-confetti dependency for visual effects
- Store organization name in localStorage after successful join/create
- Display celebration dialog with confetti animation on ProfilePage
- Clear the celebration flag after showing to prevent repeat displays
Add localStorage persistence for the currently selected organization.
This ensures the user's organization selection is remembered across
browser sessions, improving user experience by maintaining context
after page reloads or revisiting the application.
Add validation in OrganizationService to check if the member being
removed is the last owner of an organization. If so, raise a ValueError
to prevent accidental loss of ownership. The API layer catches this
exception and returns a 403 error with appropriate message.
- Add CreateOrgDialog component with name/slug form and auto-slug generation
- Add "New Organisation" button in TopBar org dropdown (limited to 10 orgs)
- Fix admin check in AppSidebar to use currently selected org role
instead of global isOrgAdmin flag for proper org-scoped permissions
Extract social login buttons (Passkey, Google, GitHub, Microsoft) from
LoginPage into a dedicated SocialLoginButtons component. This enables
reuse in OIDCLoginPage and improves code maintainability.
- Add contact API endpoint for demo requests and sales enquiries
- Implement functional contact forms on Demo and Pricing pages with honeypot spam protection
- Update footer layout: remove Company section, add contact email
- Update self-hosted FAQ to mention open source with GitHub links
- Add vitest and testing-library dependencies
- Add tests for MarketingLayout and PricingPage components
- Remove placeholder external-auth test file
Extract user management functionality from MembersPage drawer into a
dedicated UserManagementPage at /org/members/:userId. The new page
provides a full-page interface with tabs for user details, security
settings (MFA methods), and access management (OAuth accounts, SSH keys).
This improves code organization by separating concerns and provides
better UX for user administration tasks.
Replace remaining SECUIRD_API reference with config.api.baseUrl in
LoginPage.tsx. This fixes the 'SECUIRD_API is not defined' error
when accessing /login?cli_token=... during CLI authentication flow.
Replace inline SECUIRD_API constant definitions with imported config
module across all auth pages. This consolidates API URL configuration
into a single source of truth.
Simplify OAuth login and account linking by removing the redirect_uri
parameter from initiateLogin and initiateLink functions. The backend
now handles callback URL construction internally.
Add comprehensive marketing content for ZeroTier Network Governance feature
including a dedicated landing page, navigation updates, and feature highlights
across the homepage and features page.
- Add new ZeroTierPage with feature documentation and use cases
- Add ZeroTier to navigation in MarketingLayout header and footer
- Update HomePage hero headline and add ZeroTier feature section
- Add ZeroTier features section to FeaturesPage
- Add ScrollToTop component for better navigation UX
- Move ApiDevTools to AuthenticatedLayout (dev mode only)
- Add SSR tests for marketing pages
- Update SSHCertificatesPage comparison table for clarity
- Add documentation link to MarketingLayout footer
Add signUrl property to config for CLI sign URL without /api/v1 suffix.
Update CLIGuidePage to use config.signUrl instead of hardcoded URL.
Update .env.example and add .swarm/ to .gitignore.
Add containerization support for production deployment:
- Multi-stage Dockerfile using Bun for build and nginx for serving
- docker-compose.yml for container orchestration
- nginx.conf with gzip compression, caching headers, and security headers