27 KiB
Changelog — FlowDeck
v4.11.0 (2026-09-05) — Agent IA : clés API par utilisateur & chargement dynamique des modèles
Suite de v4.10.1 : migre la config LLM d'un global admin vers des credentials par utilisateur. Chacun peut enregistrer plusieurs provider + clé API dans son profil, les modèles disponibles sont chargés automatiquement depuis le fournisseur, et le provider/modèle actif d'une conversation se pilote directement dans le chat via des commandes slash.
Added
- Clés par utilisateur : table
user_llm_keys(UNIQUE(user_id, provider)) + serviceapp/services/llm_config.py:get_user_llm_key,list_user_llm_keys(masqué),upsert_user_llm_key,delete_user_llm_key. Une clé vide conserve l'existante. - Chargement dynamique des modèles :
fetch_provider_models()(httpx) — GET{base}/modelspour OpenAI-compatible (Bearer), headersx-api-key/anthropic-version(Anthropic),x-goog-api-key(Gemini) ; stockés dansmodels_jsonet fusionnés dansGET /providers. - Endpoints API (tout utilisateur authentifié) :
GET /api/agent/keys,PUT/DELETE /api/agent/keys/{provider},POST /api/agent/keys/{provider}/models(fallback sur la clé stockée, pas de fuite de clé),PATCH /api/agent/conversations/{id}(title / provider / model — commande slash).
POST /run: utilise la clé API de l'utilisateur pour le provider de la conversation (sinon config globale /.env/ offline mock).- UI Settings → Agent & IA (visible pour tous, plus seulement admin) : carte par provider (clé API masquée, URL API, « Charger les modèles » en live, modèle par défaut, Enregistrer / Supprimer). La config globale reste admin sous « Configuration globale ».
- Commandes slash dans le panel agent :
/help,/providers,/keys,/provider <nom>,/model <nom>— menu de suggestions live, appliquées viaPATCHet sans appel LLM.
Infra
VERSION→ 4.11.0 ; migration idempotente (création tableuser_llm_keys+ index).
Tests
- 239 tests verts (+7 : CRUD clés + masquage des secrets, isolation par utilisateur,
provider invalide, fetch modèles (clé stockée / body gagnant / erreur), PATCH conversation,
/runutilise la clé de l'utilisateur).
Comble le trou UX de v4.10.0 : l'utilisateur pouvait discuter avec l'agent mais ne pouvait configurer ni provider ni modèle. Ajout d'un sélecteur provider/modèle dans le panneau, d'une config runtime persistée en base (table
llm_config) et d'un écran admin avec test de connexion.
Added
- Sélecteur provider/modèle dans le panneau agent (
agent_panel.html) : deux<select>(provider + modèles connus par provider) dans l'en-tête du chat, branchés surPOST /runet persistés par conversation (colonnesprovider/modelsuragent_conversations, migrées automatiquement). Bouton ⚙️ pointant vers la config admin. - Endpoints API :
GET /api/agent/providersenrichi : liste complète des providers avec modèles connus,requires_key,api_baseethas_api_key.PATCH /api/agent/providers(admin) : persiste provider/modèle/clé/base en runtime.POST /api/agent/providers/test(admin) : test de connexion sans fallback mock (méthodeLLMClient.ping()) ; le providerofflinerépond sans réseau.
- Table
llm_config(1 ligne, id=1) + serviceapp/services/llm_config.py: précédence base (runtime) >.env, créée seulement au premier enregistrement. - Écran admin : nouvelle section Agent & IA dans Settings (onglet Admin) : provider, modèle, clé API (masquée / réaffichable), URL API optionnelle, boutons Save configuration et Test connection avec retour d'état inline.
Fixed
LLMClient.__init__: le modèle par défaut suit maintenant la config runtime (DB >.env) au lieu d'être toujoursgpt-4o;PROVIDER_MODELSdocumente les modèles connus par provider.
Infra
VERSION→ 4.10.1 ; migration idempotente des colonnesagent_conversations.provider/model.
Tests
- 232 tests verts (+6 : providers enrichi, PATCH config (admin + 403 non-admin), test connexion offline, test connexion clé manquante, persistance provider/modèle par conversation).
v4.10.0 (2026-09-05) — FlowDeck Agent : agent IA natif conversationnel
Implémentation complète du pilier « Agent IA » : un agent ReAct intégré qui agit sur le workspace (pas seulement répond) — panneau de chat, boucle raisonnement→action, streaming SSE, 18 outils avec snapshots rollback, permissions par rôle, contexte automatique, custom agents, déclencheurs planifiés, skills réutilisables et multi-LLM (offline mock + 8 providers).
Added
- Interface conversationnelle : panneau agent dans le sidebar (🤖 Agents) piloté par Alpine.js + streaming SSE ; FAB ouvrant le chat ; historique de conversations.
- Boucle ReAct (
app/services/agent_engine.py) : raisonnement → action → observation, max 12 itérations, budget de tokens, timeout, journal d'audit + fonctionundo_action()(rollback). - Streaming SSE : endpoint
/api/agent/conversations/{id}/runqui émetreasoning,actionetfinalen temps réel. - 18 outils (
app/services/tool_registry.py) :search_workspace,read_collection,read_page,create_collection,create_view,add_property,create_page,update_page,write_blocks,add_relation,create_sub_item,add_dependency,apply_template,delete_page,delete_collection,read_gitea_issues,sync_gitea,create_gitea_issue— chacun avecToolResult+ snapshot d'undo réversible. - Permissions (
app/services/permission_manager.py) : même ACL que l'utilisateur par rôle workspace (viewer/editor/admin/owner) + gating des outils. - Contexte automatique (
app/services/context_builder.py) : snapshot du workspace actif, collections, pages, mentions@, fichiers uploadés injectés dans le prompt système. - Multi-LLM (
app/services/llm_client.py) : OpenAI, Anthropic, Google, Ollama, DeepSeek, QwenCloud, NVIDIA, OpenRouter + offline mock (planner déterministe, aucune clé requise). - Custom agents, skills, déclencheurs : CRUD agents + conversations,
agent_*tables (agents,agent_conversations,agent_messages,agent_actions,agent_skills,agent_triggers), skills (/api/agent/skills, apply), scheduler de fond pour triggers planifiés.
Infra
VERSION→ 4.10.0 ; config LLM (LLM_PROVIDER/MODEL/API_KEY/API_BASE,AGENT_MAX_*) ; exclusions CSRF/api/agent; routeur agent + tâche scheduler dans le lifespan deapp/main.py.
Tests
- 226 tests verts (+18 v4.10.0 : schéma DB, mock LLM, permissions, outils+undo, engine ReAct + audit + rollback, CRUD agents/conversations, streaming SSE, skills, tools, providers).
v4.9.0 (2026-09-04) — Collaboration : commentaires inline, mentions @, notifications
Implémentation complète du pilier « Collaboration » — basée sur la revue des docs Notion (
docs/Guide_Complet_Notion_sharing_collaborartion.md) : commentaires avec ancres inline, mentions@avec autocomplétion, centre de notifications in-app et emails SMTP.
Added
- Commentaires inline sur les pages : sélection d'un texte dans l'éditeur → bouton flottant
« 💬 Comment » → commentaire ancré (
block_id+ offsets). Tablecommentsétendue (target_type,target_id,anchor_block_id,anchor_start,anchor_end) et migrée de son FKcollection_pagesvers un schéma générique (aucune perte de données, idempotente). - Panneau de commentaires dans l'éditeur : liste, résolution (✔/↪), suppression, compteur dans la topbar.
- Mentions
@: autocomplétion en temps réel (recherche d'utilisateurs), insertion de@logindans un bloc ou un commentaire → notification ciblée à l'utilisateur mentionné. - Centre de notifications in-app : cloche dans la topbar (badge non-lus, polling 30s),
panneau déroulant, « mark as read » / « mark all read ». Table
notifications. - Emails de notification : service SMTP (
app/services/mailer.py) + templates HTML ; préférences email par utilisateur (comments/mentions) réglables dans Settings → Notifications. Sans SMTP configuré, seules les notifications in-app sont émises (aucune erreur). - API :
GET/POST /api/notifications,/api/notifications/read|read-all|prefs,/api/notifications/users/search,GET/POST /api/pages/{id}/comments,PUT/DELETE /api/comments/{id},POST /api/pages/{id}/mentions. - Config SMTP (
SMTP_HOST/PORT/USER/PASSWORD/FROM/USE_TLS,APP_BASE_URL) dans.env.example.
Infra
VERSION→ 4.9.0 ;app/main.py(log +version=) ; routernotifications+collaborationenregistrés ; exclusions CSRF (/api/notifications,/api/comments) ; leRateLimitMiddlewarerespecte désormaissettings.rate_limit_enabled.
Tests
- 208 tests verts (+9 v4.9.0 : table notifications, commentaires inline + mentions, centre de notifications, préférences, recherche utilisateurs, résolution/suppression, mentions de page).
Fixed
- Bouton « + Row » (bas du tableau) inopérant — le code passait la nouvelle ligne en argument
deleteCountdeArray.spliceau lieu d'utilisersplice(index, 0, ligne): aucune ligne n'était jamais insérée. Corrigé ; les insertions de lignes (menu contextuel aussi) fonctionnent. - Coloration/handles alignés sur l'en-tête.
Added
- Bouton « + » à droite du tableau (sur toute la hauteur) → ajoute une colonne à la droite (équivalent d'un « Add column » comme « Add Row »).
- Redimensionnement des colonnes à la souris : au survol d'une bordure de colonne (en-tête) le curseur devient
col-resize; glisser ajuste la largeur. Les largeurs sont persistées dans le bloc (colsW) → conservées au rechargement, à l'ajout/suppression et dans l'auto-save.
Infra
VERSION→ 4.8.1 ; cache CSSapp.css?v=4.8.1.
v4.8.0 (2026-09-03) — Bloc Tableau simple (mode édition Notion)
Insertion via
/table, cellules éditables au clic, ajout/suppression/modification de lignes et colonnes comme dans Notion.
Added
- Bloc
tabledans l'éditeur de page. Nouvelles commandes slash/table(menu « BASIC ») → tableau 3×3 avec en-tête ; première ligne stylée en en-tête, cellulescontenteditableéditées au clic, auto-sauvegarde (format de bloc conservé :{type:'table', rows:[...]}). - Gestion des colonnes : bouton de poignée (⋮⋮) au-dessus de chaque colonne → menu contextuel Insert left / Insert right / Duplicate / Clear contents / Delete column / Delete table.
- Gestion des lignes : bouton « + Row » sous le tableau (clic = ajouter une ligne) + menu contextuel (clic droit sur une cellule de corps) → Insert above / Insert below / Duplicate / Clear row / Delete row / Delete table.
- Import Markdown (GFM) :
md2bdétecte les tableaux pipe (| a | b |+ ligne de séparateurs) et produit un bloctableéditable au lieu de paragraphes aplatis (pages.md/markdown). - Roundtrip Markdown :
blocksToMarkdown(JS) et l'export Python reconstruisent un tableau pipe valide depuis les blocs. - Export : les pages contenant un bloc
tablesortent correctement en Markdown / HTML / PDF (géré côté serveur). - UX : cliquer sous un tableau en fin de page ajoute un paragraphe pour continuer la rédaction.
Infra
VERSION→ 4.8.0 ;app/main.py(log +version=) ; cache CSSapp.css?v=4.8.0; ROADMAP renuméroté (v4.8.0 Bloc Tableau, Collaboration → v4.9.0, Agent → v4.10.0).
Tests
- Suite pytest verte (199) ; vérification syntaxe JS du template via
node --check.
v4.7.3 (2026-09-03) — Fix export PDF/HTML : tableaux + émojis
Fixed
- Tableaux Markdown rendus comme du texte brut dans les exports HTML/PDF (les lignes
| a | b |ressortaient en paragraphes). Ajout d'un parseur GFM de tableaux (_md_to_blocks→ bloctable) et d'un rendu en vrai<table>(en-tête<th>, corps<td>, alignement gauche/centre/droite, bordures fines via.ftable). Le format Markdown reconstruit un tableau pipe valide. - Émojis en « carrés noirs » dans le PDF. Cause : le moteur
xhtml2pdf(reportlab) n'embarque que des polices de base sans glyphes Unicode/émojis. Le moteur PDF passe à WeasyPrint (vraies tables CSS + émojis couleur via Pango +fonts-noto-color-emoji, installés dans l'image Docker). Repli automatique surxhtml2pdfsi WeasyPrint n'a pas ses libs natives (ex. poste de dev Windows) — le contenu s'exporte quand même.
Infra
Dockerfile: ajout des libs WeasyPrint (pango/harfbuzz/gdk-pixbuf/shared-mime-info) + policesfonts-dejavu-coreetfonts-noto-color-emoji.requirements.txt: +weasyprint==69.0(xhtml2pdf conservé en repli).
Tests
- 199 tests (4 nouveaux) : parse table →
<table>HTML réel + alignements ; standalone HTML embarque.ftable; roundtrip table → markdown pipe ; PDF d'une page avec table = PDF valide. - Vérifié en réel sur
README.md: PDF avec tableau structuré + émojis en couleur (pixels colorés confirmés), HTML avec tableau bordé.
v4.7.2 (2026-09-03) — Fix export : le contenu des documents était absent
Fixed
- Export Markdown / HTML / PDF : seuls le nom de page et le titre étaient inclus, jamais le contenu. Cause : le service d'export ne lisait que les pages en
content_format='blocks'. Or les documents peuvent être stockés autrement :content_format='file'(fichiers.md/code uploadés) : lecontentde la page n'est que des métadonnées JSON — le vrai texte est un fichier sur disque (/data/uploads/workspace_*). L'export n'allait jamais le lire → uniquement le titre.content_format='markdown': le HTML/PDF se contentait d'envelopper chaque ligne en<p>(titres et listes aplatis).
- Le service résout désormais la vraie source pour les 3 formats : lit le fichier sur disque pour les pages
file, rend les pagesmarkdown/fichiers.mden blocs (headings, listes, code…), et traite les fichiers texte non-markdown comme bloc de code. Les fichiers binaires (PDF/images) sont laissés de côté (rien d'exploitable). - Chemin des uploads rendu configurable pour les tests via
FLOWDECK_DATA_DIR(défaut/data, identique àdashboard.py).
Tests
- 195 tests au total (5 nouveaux v4.7.2) : page markdown → corps exporté ; page markdown → HTML avec headings/listes ; fichier
.mduploadé → contenu réel dans Markdown/HTML/PDF ; fichier code → exporté ; fichier binaire → non déversé. - Vérifié en réel sur
/data(pageREADME.mdet arborescence « Base de Connaissances » → fichiers.md) : le corps complet est maintenant présent dans les 3 formats.
v4.7.1 (2026-09-03) — Fix UI éditeur : menus Share / More invisibles
Fixed
- Boutons « Share » et « ⋯ » (More) sans réaction visible dans l'éditeur de page — les popovers (share-dialog, more-menu, activity-popover, move-dialog), enfants de
.page-editor-wrapper(conteneur àoverflow-y:auto), étaient ancrés enabsolute; top:100%→ rendus SOUS le viewport, donc invisibles. Repositionnés enposition:fixedsous la topbar (scoped.page-editor-wrapper > …pour ne pas casser les.more-menudes pages library/local_workspace) + variantes mobile dans le media query < 768px. - Sous-menu Export se refermait — l'itém « ↗ Export » faisait
moreOpen=falseavant d'ouvrirexportOpen: les 4 formats restaient inaccessibles au clic. Devient un toggle (exportOpen = !exportOpen), le menu More reste ouvert. - Cache CSS — version du query string
app.cssbumpée (v=3.0.0→v=4.7.1) pour invalider le cache navigateur.
Vérifié
- Playwright headless (desktop 1280×800) : Share, More, sous-menu Export, popover Activity et menu More après scroll = tous visibles dans le viewport ; téléchargement Markdown + toast « Exported as Markdown » OK ; zéro pageerror.
- 190/190 tests pytest passent.
v4.7.0 (2026-09-03) — Export
Added
- Export Markdown — conversion serveur complète de tous les blocs (headings, listes, to-do, quote, code, math, toggle, colonnes, callout, image), images incluses
- Export Markdown récursif — les sous-pages sont incluses automatiquement
- Export PDF — via
xhtml2pdf(pur Python, aucun lib système), rendu print-friendly - Export HTML — document autonome self-contained (styles inline)
- Export Site — site statique multi-pages en
.zip(index.html + une page HTML par sous-page) - 4 endpoints serveur :
/api/export/markdown|html|pdf|site/{page_id} - UI : menu « More › Export » dans l'éditeur (Markdown, HTML, PDF, Site .zip)
Améliorations
- Nouveau service
app/services/export.py(conversion blocs → Markdown / HTML / PDF réutilisable) - Nouveau routeur
app/routers/export.py - Téléchargements via
Content-Disposition(avec nom de fichier encodé UTF-8)
Tests
- 190 tests au total (6 nouveaux tests v4.7.0) : Markdown, sous-pages, HTML, PDF, Site zip, 404
v4.6.0 (2026-09-02) — Content Blocks Enrichis
Added
- Callout blocks — boîtes colorées avec sélecteur d'emoji/icône cliquable
- Table of contents — bloc auto-généré depuis les headings, avec ancres de navigation
- Math equations — bloc LaTeX/KaTeX avec aperçu en temps réel (édition inline)
table_of_contentsetmath— nouveaux types dans le slash menu (éditeur)- Multi-colonnes — bloc
columnsavec layout flexible, bouton "+ Add column" / retrait - Toggle lists enrichis — contenu expandable/collapsible avec blocs enfants imbriqués
Améliorations
- Intégration KaTeX 0.16.11 self-hosté (
/static/js/katex.min.js,/static/css/katex.min.css,/static/fonts/) — aucun CDN externe - Rendu des nouveaux blocs dans les pages publiques (
/p/<slug>): TOC ancré, KaTeX, colonnes flex, toggle<details> - Export Markdown étendu aux nouveaux types de blocs
- Correction d'un bug pré-existant :
public_page.htmln'importait pas la macrofd_icon→ erreur de rendu des pages publiées
Tests
- 183 tests au total (5 nouveaux tests v4.6.0) couvrant le rendu public TOC/math/colonnes/toggle et la persistance
children
v2.7.1 (2026-07-13) — Private Pages Gitea
Added
- Table
gitea_private_pages: pages FlowDeck locales liées à un projet Gitea (user_id, owner, repo) - API CRUD: GET/POST/PUT/DELETE
/api/gitea/projects/{owner}/{repo}/private-pages - UI: liste des pages privées + éditeur titre/contenu dans le workspace Gitea
- Sidebar: lien "Private Pages" dans l'arborescence du workspace
- Persistance: les pages survivent au changement de workspace / session
Fixed
get_user_repos(limit=100)—bruno/flowdeckétait tronqué à la page 2 (30 repos par défaut)
v2.7.0 (2026-07-13) — Intégration Gitea Phase 1
Added
- OAuth2 Provider: Gitea comme fournisseur OAuth2 pour FlowDeck (Client ID/Secret dans
.env) - Redirect URI dynamique: basé sur le header
Host— fonctionne depuislocalhostet192.168.x.x - Workspace listing: 2 sections — My Workspaces + Gitea Projects (groupés par organisation)
- Tabs par org: All | user | org1 | org2 avec compteurs de projets
- Barre de recherche: filtrage live par nom/description dans Gitea Projects
- Lazy tree: arborescence chargée un dossier à la fois (API Gitea
GET /repos/{o}/{r}/contents) - File viewer: lecture fichiers Gitea avec décodage base64
- Éditeur + commit: modifier un fichier et commiter dans Gitea avec message personnalisé
- Delete fichier: suppression avec confirmation + commit
- Arborescence dans le sidebar: comme un workspace local, avec lazy-load des sous-dossiers
- Settings › Integrations: connecter/déconnecter Gitea (
GET /api/gitea/status,DELETE /api/gitea/disconnect) - Fallback token admin: opérations GET utilisent le token serveur si pas de token OAuth utilisateur
- Write ops protégées: commit et delete exigent un token OAuth utilisateur
- Routes API:
/api/gitea/orgs,/api/gitea/projects,/api/gitea/projects/{o}/{r}/tree,/api/gitea/projects/{o}/{r}/file,/api/gitea/projects/{o}/{r}/labels
Fixed
- Bouton "Register with Gitea" ne crée plus de session admin fantôme (fallback retiré)
_sidebar_datagère le cookiegitea:owner:repopour l'arborescence
v2.6.0 (2026-07-13) — My Account & Auth Locale
Added
- Section My Account: modifier username, full name, email, mot de passe
- Toggle mot de passe: bouton voir/cacher dans les formulaires login/register
- Label "Email or username": login accepte les deux formats
- Refresh cookie session: après modification du compte, le cookie est mis à jour
- Register avec Gitea: boutons dynamiques "Login/Register with Gitea" selon l'onglet actif
Fixed
- Session cookie non rafraîchi après
PUT /api/settings/account(création nouvelle session) - Input login
type="email"→type="text"(accepte usernames non-email)
v2.5.0 (2026-07-13) — Administration Avancée
Added
- Premier compte = admin automatique:
is_admin=1pour le premier utilisateur créé - Panneau Admin dans Settings: visible uniquement pour les admins
- Users & Roles: créer/modifier/supprimer utilisateurs, changer rôles
- Table
login_history: audit des connexions (IP, user_agent, timestamp) - Statistiques par utilisateur: workspaces, pages, dernière connexion
- API
/api/admin/*: users, stats, audit — protégées paradmin_required - CSRF fix: token CSRF dans toutes les requêtes admin (
adminFetch)
v2.4.0 (2026-07-13) — Tags Personnalisés par Utilisateur
Added
- Tags isolés par
user_id: chaque utilisateur voit uniquement ses propres tags UNIQUE(name, user_id): remplaceUNIQUE(name)dans la tabletags- Migration: tags existants assignés au premier utilisateur
- Filtrage transparent: l'API retourne les tags filtrés par
user_id(session cookie)
Fixed
- Affichage des tags dans le menu contextuel workspace (sync Alpine.js)
- Création de tag avec couleur persistée
- Fermeture auto du menu contextuel après ajout de tag
- Filtrage par tags:
toggleTagFilter()appelledoFilter() - Pastilles tags: fond = couleur du tag, sans rond séparé
v2.3.0 (2026-07-12) — Multi-Vues Workspace & Preview Panel
Added
- Sélecteur de vue: Tree, List, Details, Title, Content — 5 modes d'affichage
- Vue List: liste compacte avec Name, Type, Size, Modified
- Vue Details: table complète avec Path, Author, Tags
- Vue Title: grille de cartes avec icônes et métadonnées
- Vue Content: liste avec aperçu inline (taille ou nombre d'items)
- Preview Panel: panneau latéral droit avec contenu du fichier sélectionné
- Header avec icône + titre + bouton fermer
- Métadonnées (type, taille, date)
- Tags affichés en chips
- Corps avec rendu du contenu (blocks JSON → HTML, texte brut)
- Actions: Open, Rename, Delete
- Animation slide-in/out
- Tri par date: options Oldest/Newest dans le selecteur de tri
v2.2.0 (2026-07-12) — Tags & Recherche Avancée
Added
- Tags: système complet de tags avec tables
tags+page_tags, CRUD API - API Tags:
GET/POST/DELETE /api/local-workspace/items/{id}/tags,GET /api/local-workspace/tags - Vue Table enrichie: colonnes Name, Path, Size, Modified, Type, Author, Tags
- Filtrage par tags: barre de chips avec compteurs, clic pour filtrer
- Ajout/retrait tags inline: bouton + dans la table, chips avec × pour retirer
- Tree endpoint enrichi: chaque nœud retourne
size,size_display,created_at,updated_at,author,tags - Filtre "Dossiers": nouveau chip Folders dans la barre de filtres
- Auto-switch table: quand recherche/filtre actif, passe en vue table automatiquement
v2.1.1 (2026-07-12) — Fix Arborescence Workspace
Fixed
- Arborescence: création fichier/dossier dans un sous-dossier met à jour l'arbre sans rechargement
- parentFolder: corrigé le bug où
parentFolderétait nullifié avant l'insertion dans l'arbre JS - displayTree: nouvelle référence array après chaque mutation pour forcer le re-render Alpine.js
- doSort/doFilter: gèrent maintenant le cas où un filtre/tri est actif après création
v2.1.0 (2026-07-10) — Intégrations Avancées
Added
- API publique:
/api/v1(collections, pages, my-tasks) avec token auth - Token generation:
POST /api/v1/token - Webhooks sortants:
GET/POST/DELETE /workspace/webhooks+ dispatcher - PWA:
GET /manifest.json - CSRF:
/api/v1exempté
Tests
- 73/73 passent (+6 tests v2.1)
v2.0.0 (2026-07-10) — Multi-User Workspaces & Editor Complete
Added
- Workspaces: tables
workspaces+workspace_members, CRUD API, roles admin/editor/commenter/viewer - Comments: table
commentsavec thread (parent_id), resolved - Page History: table
page_history, snapshot JSON - Favorites: table
favorites, add/remove/list - Templates:
database_templates+page_templates, apply API - CSV Import/Export:
POST .../import/csv,GET .../export/csv - Public Sharing:
GET /workspace/public/{id}(read-only, no auth)
Tests
- 67/67 passent (+7 tests v2.0)
v1.9.0 (2026-07-10) — My Tasks Dashboard
Added
- My Tasks:
GET /my-tasks(HTML),GET /my-tasks/api(JSON) - Agrégation cross-collection, vues All/Today/Overdue/Next 7 days
v1.8.0 (2026-07-10) — Sub-items & Dependencies
Added
- Sub-items: parent_id auto-référence, GET/POST sub-items
- Status aggregate:
GET .../status-aggregate - Dependencies:
POST .../dependencies,POST .../check-deps
v1.7.0 (2026-07-10) — Vues Améliorées
Added
- View config:
PUT /db/views/{id}/config(group_by, card_size, cover, visible) - Save view as:
POST /db/{id}/views/save-as - List views:
GET /db/{id}/views/api
v1.6.0 (2026-07-10) — Vues Manquantes
Added
- Calendar: grid mensuel, navigation mois
- Gallery: cartes visuelles, card_size configurable
- List: vue compacte avec preview
- Timeline: barres horizontales Gantt
- Table: rendu SSR avec colonnes properties
- View tabs: navigation Table/Board/Calendar/Gallery/List/Timeline
v1.5.0 (2026-07-10) — Relations & Rollups
Added
- FormulaEngine: 19 fonctions (prop, if, concat, round, now, today, dateAdd, replace, ...)
- RollupEngine: 12 agrégations (count, sum, avg, min, max, range, unique, percent_checked)
- Relation: lien bidirectionnel, API create/link
v1.4.0 (2026-07-10) — Propriétés Avancées
Added
- Table
collection_properties: 21 types Notion - Service
property_types.py: validation, formatage, auto-values
v1.3.0 (2026-07-10) — Database Concept
Added
- Tables:
collections,collection_pages,collection_views - Router
/db: CRUD collections + pages (16 endpoints) - GiteaBoardCompat: adaptateur boards legacy → Collections
v1.0.0 (2026-07-08) — Production
Added
- FastAPI lifespan, 28 tests, CI/CD Gitea Actions, CSS 31KB, 10 templates
- 5 vues: Kanban, Table, Status Overview, Team Load, Detailed Board
- Filtres cumulables AND, tri multi-critères
- Card detail modal, checklists, commentaires Gitea
- Propriétés custom, AI keywords, sync API