Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 106 additions & 32 deletions apps/website/src/lib/roadmap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ export interface RoadmapItem {
title: string
description: string
status: 'available' | 'planned' | 'exploring'
link?: string
milestone?: string
}

export interface RoadmapColumn {
Expand All @@ -11,6 +13,8 @@ export interface RoadmapColumn {
items: RoadmapItem[]
}

const issue = (number: number) => `https://github.com/ferriskey/ferriskey/issues/${number}`

export const roadmapColumns: RoadmapColumn[] = [
{
key: 'now',
Expand All @@ -21,16 +25,31 @@ export const roadmapColumns: RoadmapColumn[] = [
title: 'Realms and IAM objects',
description: 'Manage realms, clients, users, roles, organizations, client scopes, and protocol mappers from the IAM surface.',
status: 'available',
link: issue(851),
},
{
title: 'Identity federation',
description: 'Support OIDC, LDAP, and external identity providers for federated authentication scenarios.',
description: 'Act as an OIDC and SAML 2.0 identity provider, and federate with OIDC, LDAP, and social identity providers.',
status: 'available',
link: issue(1260),
},
{
title: 'Authentication methods',
description: 'Cover Magic Link, Passkeys, reset password, TOTP, and core grant types including password, client credentials, and refresh token.',
description: 'Cover Magic Link, Passkeys, reset password, TOTP, and the password, client credentials, refresh token, and Token Exchange (RFC 8693) grant types.',
status: 'available',
link: issue(1050),
},
{
title: 'Sessions and SSO',
description: 'Keep a login alive across applications with SSO sessions, and list or revoke active sessions through the session management API.',
status: 'available',
link: issue(1143),
},
{
title: 'Account security',
description: 'Lock accounts after repeated failed logins, and let users manage their own password, TOTP, and passkeys.',
status: 'available',
link: issue(1479),
},
{
title: 'Mail and token controls',
Expand All @@ -39,8 +58,9 @@ export const roadmapColumns: RoadmapColumn[] = [
},
{
title: 'Cloud-native deployment',
description: 'Ship with Helm, Docker, and Kubernetes support for platform-oriented deployments.',
description: 'Ship with Helm, Docker, and Kubernetes support, plus a maintenance mode for planned downtime.',
status: 'available',
link: issue(927),
},
{
title: 'Audit and debugging modules',
Expand All @@ -49,8 +69,15 @@ export const roadmapColumns: RoadmapColumn[] = [
},
{
title: 'Events and permissions',
description: 'Expose webhooks and bitwise permissions for event-driven integrations and fine-grained IAM administration rights.',
description: 'Expose durable webhooks with a persistent outbox, retries, and delivery history, and bitwise permissions for fine-grained IAM administration rights.',
status: 'available',
link: issue(1332),
},
{
title: 'Localized admin console',
description: 'Store a locale per realm and per user, and serve the admin console in English, French, and Simplified Chinese.',
status: 'available',
link: issue(1351),
},
],
},
Expand All @@ -59,6 +86,39 @@ export const roadmapColumns: RoadmapColumn[] = [
title: 'Next steps',
description: 'The next product areas being shaped to make Ferriskey more complete and easier to operate.',
items: [
{
title: 'Server-side listings',
description: 'Paginate, sort, and filter every listing on the server so large realms stay fast in the console and the API.',
status: 'planned',
link: issue(1531),
milestone: 'v0.10',
},
{
title: 'GDPR self-service',
description: 'Give users /me endpoints, personal data export, account deletion with a grace period, and consent management.',
status: 'planned',
link: issue(992),
milestone: 'v0.10',
},
{
title: 'Account chooser',
description: 'Let a user pick between signed-in accounts on the login page, honouring prompt=select_account and login_hint.',
status: 'planned',
link: issue(671),
milestone: 'v0.10',
},
{
title: 'Pooled realms',
description: 'Host many tenants as realms on one instance, with quotas and stronger tenant isolation semantics.',
status: 'planned',
link: issue(1610),
},
{
title: 'Device authorization grant',
description: 'Support RFC 8628 so CLIs, TVs, and devices without a browser can sign in.',
status: 'planned',
link: issue(1020),
},
{
title: 'Portal builder and auth flow',
description: 'Build a configurable portal experience and a clearer way to define authentication journeys.',
Expand All @@ -69,31 +129,21 @@ export const roadmapColumns: RoadmapColumn[] = [
description: 'Define and specify the dedicated authorization service before turning it into a stable product surface.',
status: 'planned',
},
{
title: 'Organizations and sessions',
description: 'Add organization groups and a session management API for better administration of tenants, users, and active access.',
status: 'planned',
},
{
title: 'Security hardening',
description: 'Introduce brute-force protection, rate limiting, OAuth 2.1 compliance, and Token Exchange support based on RFC 8693.',
description: 'Introduce rate limiting and OAuth 2.1 compliance.',
status: 'planned',
},
{
title: 'Account and client operations',
description: 'Deliver user self-service accounts, client evaluation tooling, and a CLI for operators and developers.',
title: 'Client operations',
description: 'Deliver client evaluation tooling and a CLI for operators and developers.',
status: 'planned',
},
{
title: 'Migration strategies',
description: 'Document and support migration paths from Supabase, Keycloak, Auth0, and other existing identity stacks.',
status: 'planned',
},
{
title: 'Native multi-tenancy',
description: 'Move toward first-class multi-tenancy with quotas and stronger tenant isolation semantics.',
status: 'planned',
},
{
title: 'Passwordless-first security',
description: 'Explore device trust and device binding as first-class building blocks for passwordless authentication.',
Expand Down Expand Up @@ -152,34 +202,66 @@ export const roadmapTranslations = {
},
{
title: "Fédération d'identité",
description: "Prendre en charge OIDC, LDAP et les identity providers externes pour les scénarios d'authentification fédérée.",
description: "Agir comme identity provider OIDC et SAML 2.0, et se fédérer avec des identity providers OIDC, LDAP et sociaux.",
},
{
title: "Méthodes d'authentification",
description: 'Couvrir Magic Link, Passkeys, reset password, TOTP et les grant types password, client credentials et refresh token.',
description: 'Couvrir Magic Link, Passkeys, reset password, TOTP et les grant types password, client credentials, refresh token et Token Exchange (RFC 8693).',
},
{
title: 'Sessions et SSO',
description: "Garder une connexion active entre applications avec les sessions SSO, et lister ou révoquer les sessions actives via l'API de session management.",
},
{
title: 'Sécurité des comptes',
description: 'Verrouiller un compte après des échecs de connexion répétés, et laisser les users gérer eux-mêmes leur mot de passe, TOTP et passkeys.',
},
{
title: 'Mails et contrôle des tokens',
description: "Configurer les templates mail, les lifetimes des tokens et les communications liées à l'authentification.",
},
{
title: 'Déploiement cloud-native',
description: 'Fournir le support Helm, Docker et Kubernetes pour les déploiements orientés plateforme.',
description: 'Fournir le support Helm, Docker et Kubernetes, ainsi qu\'un mode maintenance pour les interruptions planifiées.',
},
{
title: "Audit et modules de debug",
description: "Utiliser Compass et SeaWatch pour auditer les flows d'authentification, debugger les comportements et inspecter les logs d'événements IAM.",
},
{
title: 'Événements et permissions',
description: "Exposer des webhooks et des permissions bitwise pour les intégrations événementielles et la gestion fine des droits d'administration IAM.",
description: "Exposer des webhooks durables avec outbox persistante, retries et historique de livraison, et des permissions bitwise pour la gestion fine des droits d'administration IAM.",
},
{
title: 'Console admin localisée',
description: 'Stocker une locale par realm et par user, et servir la console admin en anglais, français et chinois simplifié.',
},
],
},
next: {
title: 'Prochaines étapes',
description: 'Les prochaines zones produit à construire pour rendre Ferriskey plus complet et plus simple à opérer.',
items: [
{
title: 'Listes côté serveur',
description: "Paginer, trier et filtrer chaque liste côté serveur pour que les gros realms restent rapides dans la console et l'API.",
},
{
title: 'Self-service RGPD',
description: "Donner aux users des endpoints /me, l'export de leurs données personnelles, la suppression de compte avec délai de grâce et la gestion des consentements.",
},
{
title: 'Sélecteur de compte',
description: 'Laisser un user choisir entre ses comptes connectés sur la page de login, en respectant prompt=select_account et login_hint.',
},
{
title: 'Pooled realms',
description: 'Héberger de nombreux tenants comme realms sur une seule instance, avec quotas et une isolation plus explicite des tenants.',
},
{
title: 'Device authorization grant',
description: 'Supporter la RFC 8628 pour que les CLI, TV et appareils sans navigateur puissent se connecter.',
},
{
title: 'Portal builder et auth flow',
description: "Construire une expérience portail configurable et une manière plus claire de définir les parcours d'authentification.",
Expand All @@ -188,26 +270,18 @@ export const roadmapTranslations = {
title: "Service d'autorisation",
description: "Définir et spécifier le service d'autorisation dédié avant d'en faire une surface produit stable.",
},
{
title: 'Organisations et sessions',
description: "Ajouter les organization groups et une API de session management pour mieux administrer les tenants, users et accès actifs.",
},
{
title: 'Durcissement sécurité',
description: 'Introduire la brute-force protection, le rate limiting, la compliance OAuth 2.1 et Token Exchange selon la RFC 8693.',
description: 'Introduire le rate limiting et la compliance OAuth 2.1.',
},
{
title: 'Opérations compte et client',
description: 'Livrer un portail self-service user, un outil Evaluate client et une CLI pour les opérateurs et développeurs.',
title: 'Opérations client',
description: 'Livrer un outil Evaluate client et une CLI pour les opérateurs et développeurs.',
},
{
title: 'Stratégies de migration',
description: 'Documenter et supporter les chemins de migration depuis Supabase, Keycloak, Auth0 et autres stacks identity existantes.',
},
{
title: 'Multi-tenancy natif',
description: 'Aller vers un multi-tenancy de premier niveau avec quotas et une isolation plus explicite des tenants.',
},
{
title: 'Sécurité passwordless-first',
description: "Explorer Device Trust et Device Binding comme briques centrales de l'authentification passwordless.",
Expand Down
18 changes: 15 additions & 3 deletions apps/website/src/pages/roadmap.astro
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,23 @@ const columnAccent = {
<article class="rounded-xl border border-border/60 bg-muted/10 p-4">
<div class="flex items-start justify-between gap-3">
<h2 class="text-sm font-semibold text-foreground" data-roadmap-key={column.key} data-roadmap-item={itemIndex} data-roadmap-field="title">{item.title}</h2>
<span class={`shrink-0 rounded-full border px-2 py-0.5 text-[9px] font-semibold uppercase tracking-[0.16em] ${statusClass[item.status]}`} data-t={`roadmap.status.${item.status}`}>
{item.status}
</span>
<div class="flex shrink-0 items-center gap-1.5">
{item.milestone && (
<span class="rounded-full border border-border/70 bg-muted/20 px-2 py-0.5 text-[9px] font-semibold tracking-[0.16em] text-muted-foreground">
{item.milestone}
</span>
)}
<span class={`rounded-full border px-2 py-0.5 text-[9px] font-semibold uppercase tracking-[0.16em] ${statusClass[item.status]}`} data-t={`roadmap.status.${item.status}`}>
{item.status}
</span>
</div>
</div>
<p class="mt-2 text-xs leading-relaxed text-muted-foreground" data-roadmap-key={column.key} data-roadmap-item={itemIndex} data-roadmap-field="description">{item.description}</p>
{item.link && (
<a href={item.link} target="_blank" rel="noopener noreferrer" class="mt-2 inline-flex items-center gap-1 text-xs font-medium text-sky-400 hover:underline">
#{item.link.split('/').pop()}
</a>
)}
</article>
))}
</div>
Expand Down
Loading