@libredb/studio 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/.claude/settings.local.json +127 -0
  2. package/.cursorrules +426 -0
  3. package/.devin/wiki.json +143 -0
  4. package/.dockerignore +80 -0
  5. package/.env.example +159 -0
  6. package/.github/ISSUE_TEMPLATE/bug_report.md +49 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.md +29 -0
  8. package/.github/PULL_REQUEST_TEMPLATE.md +57 -0
  9. package/.github/workflows/ci.yml +185 -0
  10. package/.github/workflows/codeql.yml +57 -0
  11. package/.github/workflows/docker-build-push.yml +118 -0
  12. package/.github/workflows/helm-release.yml +113 -0
  13. package/CLAUDE.md +265 -0
  14. package/CODE_OF_CONDUCT.md +124 -0
  15. package/CONTRIBUTING.md +154 -0
  16. package/Dockerfile +73 -0
  17. package/LICENSE +21 -0
  18. package/README.md +614 -0
  19. package/SECURITY.md +107 -0
  20. package/artifacthub-repo.yml +4 -0
  21. package/bun.lock +1714 -0
  22. package/bunfig.toml +3 -0
  23. package/charts/libredb-studio/.helmignore +11 -0
  24. package/charts/libredb-studio/Chart.lock +6 -0
  25. package/charts/libredb-studio/Chart.yaml +50 -0
  26. package/charts/libredb-studio/README.md +206 -0
  27. package/charts/libredb-studio/templates/NOTES.txt +59 -0
  28. package/charts/libredb-studio/templates/_helpers.tpl +135 -0
  29. package/charts/libredb-studio/templates/configmap.yaml +37 -0
  30. package/charts/libredb-studio/templates/deployment.yaml +184 -0
  31. package/charts/libredb-studio/templates/hpa.yaml +32 -0
  32. package/charts/libredb-studio/templates/ingress.yaml +41 -0
  33. package/charts/libredb-studio/templates/networkpolicy.yaml +50 -0
  34. package/charts/libredb-studio/templates/pdb.yaml +18 -0
  35. package/charts/libredb-studio/templates/pvc.yaml +23 -0
  36. package/charts/libredb-studio/templates/secret.yaml +30 -0
  37. package/charts/libredb-studio/templates/seed-configmap.yaml +11 -0
  38. package/charts/libredb-studio/templates/service.yaml +22 -0
  39. package/charts/libredb-studio/templates/serviceaccount.yaml +13 -0
  40. package/charts/libredb-studio/values.schema.json +246 -0
  41. package/charts/libredb-studio/values.yaml +286 -0
  42. package/components.json +22 -0
  43. package/conductor/code_styleguides/typescript.md +43 -0
  44. package/conductor/product-guidelines.md +43 -0
  45. package/conductor/product.md +3 -0
  46. package/conductor/setup_state.json +1 -0
  47. package/conductor/tech-stack.md +39 -0
  48. package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +8 -0
  49. package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +44 -0
  50. package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +31 -0
  51. package/conductor/tracks.md +8 -0
  52. package/conductor/workflow.md +333 -0
  53. package/database-compose.yml +55 -0
  54. package/docker/postgres-init/01-extensions.sql +10 -0
  55. package/docker/postgres-init/02-sample-data.sql +585 -0
  56. package/docker/postgres.yml +68 -0
  57. package/docker-compose.yml +38 -0
  58. package/docs/AI_PLAN.md +74 -0
  59. package/docs/API_DOCS.md +875 -0
  60. package/docs/ARCHITECTURE.md +218 -0
  61. package/docs/DATABASE_PROVIDERS.md +358 -0
  62. package/docs/FEATURES.md +116 -0
  63. package/docs/HELM_CHART.md +252 -0
  64. package/docs/LOGIN_PAGE.md +178 -0
  65. package/docs/MONACO_EDITOR_PERFORMANCE.md +315 -0
  66. package/docs/OIDC_ARCH.md +681 -0
  67. package/docs/OIDC_SETUP.md +322 -0
  68. package/docs/POSTGRES_METRICS.md +516 -0
  69. package/docs/QUERY_OPTIMIZATION.md +370 -0
  70. package/docs/SEED_CONNECTIONS.md +468 -0
  71. package/docs/SQL_ALIAS_COMPLETION.md +190 -0
  72. package/docs/STORAGE_ARCHITECTURE.md +565 -0
  73. package/docs/STORAGE_QUICK_SETUP.md +419 -0
  74. package/docs/TECHNICAL_PLAN.md +36 -0
  75. package/docs/THEMING.md +345 -0
  76. package/docs/adding-a-new-database-provider.md +642 -0
  77. package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +360 -0
  78. package/docs/backlogs/001-INLINE_DATA_EDITING.md +118 -0
  79. package/docs/backlogs/002-DATA_IMPORT.md +215 -0
  80. package/docs/backlogs/003-QUERY_TIME_MACHINE.md +183 -0
  81. package/docs/backlogs/004-AI_DATA_STORYTELLER.md +292 -0
  82. package/docs/backlogs/005-QUERY_PLAYGROUND.md +352 -0
  83. package/docs/backlogs/006-DATA_MASKING.md +418 -0
  84. package/docs/enterprise-features.md +718 -0
  85. package/docs/kubernetes-helm-chart-artifacthub-plan.md +803 -0
  86. package/docs/medium-koyeb-article-en.md +215 -0
  87. package/docs/plans/test-plans.md +445 -0
  88. package/docs/releases/RELEASE.V0.3.0.md +22 -0
  89. package/docs/releases/RELEASE.V0.4.0.md +154 -0
  90. package/docs/releases/RELEASE.V0.5.0.md +252 -0
  91. package/docs/releases/RELEASE_v0.5.6.md +145 -0
  92. package/docs/releases/RELEASE_v0.6.1.md +303 -0
  93. package/docs/releases/RELEASE_v0.6.7.md +292 -0
  94. package/docs/releases/RELEASE_v0.7.0.md +332 -0
  95. package/docs/releases/RELEASE_v0.8.0.md +521 -0
  96. package/docs/sampledb/titanic.sql +1379 -0
  97. package/docs/superpowers/plans/2026-03-25-seed-connections.md +1362 -0
  98. package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +590 -0
  99. package/e2e/admin-dashboard.spec.ts +64 -0
  100. package/e2e/connection-management.spec.ts +58 -0
  101. package/e2e/export.spec.ts +34 -0
  102. package/e2e/login.spec.ts +85 -0
  103. package/e2e/query-execution.spec.ts +35 -0
  104. package/e2e/tab-management.spec.ts +64 -0
  105. package/eslint.config.mjs +28 -0
  106. package/fly.toml +43 -0
  107. package/next.config.ts +32 -0
  108. package/package.json +130 -0
  109. package/playwright.config.ts +34 -0
  110. package/postcss.config.mjs +7 -0
  111. package/public/favicon-32x32.png +0 -0
  112. package/public/favicon.ico +0 -0
  113. package/public/file.svg +1 -0
  114. package/public/globe.svg +1 -0
  115. package/public/logo.svg +32 -0
  116. package/public/next.svg +1 -0
  117. package/public/screenshots/code-generator.png +0 -0
  118. package/public/screenshots/connection-modal.png +0 -0
  119. package/public/screenshots/data-profiler.png +0 -0
  120. package/public/screenshots/erd-diagram.png +0 -0
  121. package/public/screenshots/hero-editor.png +0 -0
  122. package/public/screenshots/nl2sql.png +0 -0
  123. package/public/vercel.svg +1 -0
  124. package/public/window.svg +1 -0
  125. package/render.yaml +58 -0
  126. package/scripts/merge-lcov.mjs +239 -0
  127. package/sonar-project.properties +16 -0
  128. package/src/app/admin/error.tsx +46 -0
  129. package/src/app/admin/page.tsx +10 -0
  130. package/src/app/api/admin/audit/route.ts +52 -0
  131. package/src/app/api/admin/fleet-health/route.ts +81 -0
  132. package/src/app/api/ai/autopilot/route.ts +105 -0
  133. package/src/app/api/ai/chat/route.ts +132 -0
  134. package/src/app/api/ai/describe-schema/route.ts +52 -0
  135. package/src/app/api/ai/explain/route.ts +86 -0
  136. package/src/app/api/ai/impact/route.ts +97 -0
  137. package/src/app/api/ai/index-advisor/route.ts +98 -0
  138. package/src/app/api/ai/nl2sql/route.ts +87 -0
  139. package/src/app/api/ai/query-safety/route.ts +87 -0
  140. package/src/app/api/auth/login/route.ts +62 -0
  141. package/src/app/api/auth/logout/route.ts +25 -0
  142. package/src/app/api/auth/me/route.ts +10 -0
  143. package/src/app/api/auth/oidc/callback/route.ts +82 -0
  144. package/src/app/api/auth/oidc/login/route.ts +43 -0
  145. package/src/app/api/connections/managed/route.ts +35 -0
  146. package/src/app/api/db/cancel/route.ts +42 -0
  147. package/src/app/api/db/disconnect/route.ts +28 -0
  148. package/src/app/api/db/health/route.ts +49 -0
  149. package/src/app/api/db/maintenance/route.ts +72 -0
  150. package/src/app/api/db/monitoring/route.ts +62 -0
  151. package/src/app/api/db/multi-query/route.ts +116 -0
  152. package/src/app/api/db/pool-stats/route.ts +37 -0
  153. package/src/app/api/db/profile/route.ts +144 -0
  154. package/src/app/api/db/provider-meta/route.ts +49 -0
  155. package/src/app/api/db/query/route.ts +50 -0
  156. package/src/app/api/db/schema/route.ts +47 -0
  157. package/src/app/api/db/schema-snapshot/route.ts +42 -0
  158. package/src/app/api/db/test-connection/route.ts +55 -0
  159. package/src/app/api/db/transaction/route.ts +111 -0
  160. package/src/app/api/storage/[collection]/route.ts +67 -0
  161. package/src/app/api/storage/config/route.ts +17 -0
  162. package/src/app/api/storage/migrate/route.ts +45 -0
  163. package/src/app/api/storage/route.ts +32 -0
  164. package/src/app/error.tsx +49 -0
  165. package/src/app/global-error.tsx +55 -0
  166. package/src/app/globals.css +146 -0
  167. package/src/app/icon.svg +42 -0
  168. package/src/app/layout.tsx +34 -0
  169. package/src/app/login/login-form.tsx +301 -0
  170. package/src/app/login/page.tsx +11 -0
  171. package/src/app/monitoring/page.tsx +8 -0
  172. package/src/app/not-found.tsx +29 -0
  173. package/src/app/page.tsx +5 -0
  174. package/src/components/AIAutopilotPanel.tsx +238 -0
  175. package/src/components/CodeGenerator.tsx +271 -0
  176. package/src/components/CommandPalette.tsx +227 -0
  177. package/src/components/ConnectionModal.tsx +759 -0
  178. package/src/components/CreateTableModal.tsx +281 -0
  179. package/src/components/DataCharts.tsx +962 -0
  180. package/src/components/DataImportModal.tsx +582 -0
  181. package/src/components/DataProfiler.tsx +335 -0
  182. package/src/components/DatabaseDocs.tsx +251 -0
  183. package/src/components/MaskingSettings.tsx +414 -0
  184. package/src/components/MobileNav.tsx +50 -0
  185. package/src/components/NL2SQLPanel.tsx +281 -0
  186. package/src/components/PivotTable.tsx +257 -0
  187. package/src/components/QueryEditor.tsx +760 -0
  188. package/src/components/QueryHistory.tsx +344 -0
  189. package/src/components/QuerySafetyDialog.tsx +290 -0
  190. package/src/components/ResultsGrid.tsx +644 -0
  191. package/src/components/SaveQueryModal.tsx +104 -0
  192. package/src/components/SavedQueries.tsx +128 -0
  193. package/src/components/SchemaDiagram.tsx +473 -0
  194. package/src/components/SchemaDiff.tsx +473 -0
  195. package/src/components/SnapshotTimeline.tsx +116 -0
  196. package/src/components/Studio.tsx +639 -0
  197. package/src/components/TestDataGenerator.tsx +261 -0
  198. package/src/components/VisualExplain.tsx +820 -0
  199. package/src/components/admin/AdminDashboard.tsx +163 -0
  200. package/src/components/admin/tabs/AuditTab.tsx +531 -0
  201. package/src/components/admin/tabs/MonitoringEmbed.tsx +11 -0
  202. package/src/components/admin/tabs/OperationsTab.tsx +646 -0
  203. package/src/components/admin/tabs/OverviewTab.tsx +1328 -0
  204. package/src/components/admin/tabs/SecurityTab.tsx +284 -0
  205. package/src/components/community-section.tsx +92 -0
  206. package/src/components/icons/db-icons.tsx +84 -0
  207. package/src/components/libredb-logo.tsx +61 -0
  208. package/src/components/monitoring/MonitoringDashboard.tsx +345 -0
  209. package/src/components/monitoring/tabs/MetricChart.tsx +82 -0
  210. package/src/components/monitoring/tabs/OverviewTab.tsx +263 -0
  211. package/src/components/monitoring/tabs/PerformanceTab.tsx +254 -0
  212. package/src/components/monitoring/tabs/PoolTab.tsx +174 -0
  213. package/src/components/monitoring/tabs/QueriesTab.tsx +287 -0
  214. package/src/components/monitoring/tabs/SessionsTab.tsx +316 -0
  215. package/src/components/monitoring/tabs/StorageTab.tsx +335 -0
  216. package/src/components/monitoring/tabs/TablesTab.tsx +300 -0
  217. package/src/components/results-grid/ResultCard.tsx +111 -0
  218. package/src/components/results-grid/RowDetailSheet.tsx +178 -0
  219. package/src/components/results-grid/StatsBar.tsx +201 -0
  220. package/src/components/results-grid/index.ts +1 -0
  221. package/src/components/results-grid/utils.ts +23 -0
  222. package/src/components/schema-explorer/ColumnList.tsx +53 -0
  223. package/src/components/schema-explorer/SchemaExplorer.tsx +182 -0
  224. package/src/components/schema-explorer/TableItem.tsx +210 -0
  225. package/src/components/schema-explorer/index.ts +1 -0
  226. package/src/components/sidebar/ConnectionItem.tsx +105 -0
  227. package/src/components/sidebar/ConnectionsList.tsx +62 -0
  228. package/src/components/sidebar/Sidebar.tsx +130 -0
  229. package/src/components/sidebar/index.ts +2 -0
  230. package/src/components/studio/BottomPanel.tsx +286 -0
  231. package/src/components/studio/QueryToolbar.tsx +180 -0
  232. package/src/components/studio/StudioDesktopHeader.tsx +114 -0
  233. package/src/components/studio/StudioMobileHeader.tsx +340 -0
  234. package/src/components/studio/StudioTabBar.tsx +82 -0
  235. package/src/components/studio/index.ts +5 -0
  236. package/src/components/ui/accordion.tsx +66 -0
  237. package/src/components/ui/alert-dialog.tsx +157 -0
  238. package/src/components/ui/alert.tsx +66 -0
  239. package/src/components/ui/aspect-ratio.tsx +11 -0
  240. package/src/components/ui/avatar.tsx +53 -0
  241. package/src/components/ui/badge.tsx +46 -0
  242. package/src/components/ui/breadcrumb.tsx +109 -0
  243. package/src/components/ui/button-group.tsx +83 -0
  244. package/src/components/ui/button.tsx +60 -0
  245. package/src/components/ui/calendar.tsx +216 -0
  246. package/src/components/ui/card.tsx +92 -0
  247. package/src/components/ui/carousel.tsx +241 -0
  248. package/src/components/ui/chart.tsx +357 -0
  249. package/src/components/ui/checkbox.tsx +32 -0
  250. package/src/components/ui/collapsible.tsx +33 -0
  251. package/src/components/ui/command.tsx +184 -0
  252. package/src/components/ui/context-menu.tsx +252 -0
  253. package/src/components/ui/dialog.tsx +143 -0
  254. package/src/components/ui/drawer.tsx +135 -0
  255. package/src/components/ui/dropdown-menu.tsx +257 -0
  256. package/src/components/ui/empty.tsx +104 -0
  257. package/src/components/ui/field.tsx +248 -0
  258. package/src/components/ui/form.tsx +167 -0
  259. package/src/components/ui/hover-card.tsx +44 -0
  260. package/src/components/ui/input-group.tsx +170 -0
  261. package/src/components/ui/input-otp.tsx +77 -0
  262. package/src/components/ui/input.tsx +21 -0
  263. package/src/components/ui/item.tsx +193 -0
  264. package/src/components/ui/kbd.tsx +28 -0
  265. package/src/components/ui/label.tsx +24 -0
  266. package/src/components/ui/menubar.tsx +276 -0
  267. package/src/components/ui/navigation-menu.tsx +168 -0
  268. package/src/components/ui/pagination.tsx +127 -0
  269. package/src/components/ui/popover.tsx +48 -0
  270. package/src/components/ui/progress.tsx +31 -0
  271. package/src/components/ui/radio-group.tsx +45 -0
  272. package/src/components/ui/resizable.tsx +56 -0
  273. package/src/components/ui/scroll-area.tsx +58 -0
  274. package/src/components/ui/select.tsx +187 -0
  275. package/src/components/ui/separator.tsx +28 -0
  276. package/src/components/ui/sheet.tsx +139 -0
  277. package/src/components/ui/sidebar.tsx +726 -0
  278. package/src/components/ui/skeleton.tsx +13 -0
  279. package/src/components/ui/slider.tsx +63 -0
  280. package/src/components/ui/sonner.tsx +40 -0
  281. package/src/components/ui/spinner.tsx +16 -0
  282. package/src/components/ui/switch.tsx +31 -0
  283. package/src/components/ui/table.tsx +116 -0
  284. package/src/components/ui/tabs.tsx +66 -0
  285. package/src/components/ui/textarea.tsx +18 -0
  286. package/src/components/ui/toggle-group.tsx +83 -0
  287. package/src/components/ui/toggle.tsx +47 -0
  288. package/src/components/ui/tooltip.tsx +61 -0
  289. package/src/exports/components.ts +15 -0
  290. package/src/exports/index.ts +4 -0
  291. package/src/exports/providers.ts +4 -0
  292. package/src/exports/types.ts +26 -0
  293. package/src/hooks/use-ai-chat.ts +182 -0
  294. package/src/hooks/use-all-connections.ts +66 -0
  295. package/src/hooks/use-api-call.ts +71 -0
  296. package/src/hooks/use-auth.ts +51 -0
  297. package/src/hooks/use-connection-form.ts +349 -0
  298. package/src/hooks/use-connection-manager.ts +169 -0
  299. package/src/hooks/use-connection-payload.ts +15 -0
  300. package/src/hooks/use-inline-editing.ts +109 -0
  301. package/src/hooks/use-mobile.ts +20 -0
  302. package/src/hooks/use-monitoring-data.ts +270 -0
  303. package/src/hooks/use-provider-metadata.ts +62 -0
  304. package/src/hooks/use-query-execution.ts +478 -0
  305. package/src/hooks/use-storage-sync.ts +259 -0
  306. package/src/hooks/use-tab-manager.ts +231 -0
  307. package/src/hooks/use-toast.ts +20 -0
  308. package/src/hooks/use-transaction-control.ts +64 -0
  309. package/src/lib/api/error-codes.ts +30 -0
  310. package/src/lib/api/errors.ts +236 -0
  311. package/src/lib/api/with-error-handler.ts +41 -0
  312. package/src/lib/audit.ts +105 -0
  313. package/src/lib/auth.ts +87 -0
  314. package/src/lib/connection-string-parser.ts +172 -0
  315. package/src/lib/data-masking.ts +385 -0
  316. package/src/lib/db/base-provider.ts +325 -0
  317. package/src/lib/db/errors.ts +317 -0
  318. package/src/lib/db/factory.ts +324 -0
  319. package/src/lib/db/index.ts +123 -0
  320. package/src/lib/db/providers/document/index.ts +6 -0
  321. package/src/lib/db/providers/document/mongodb.ts +992 -0
  322. package/src/lib/db/providers/keyvalue/redis.ts +554 -0
  323. package/src/lib/db/providers/sql/index.ts +11 -0
  324. package/src/lib/db/providers/sql/mssql.ts +1065 -0
  325. package/src/lib/db/providers/sql/mysql.ts +978 -0
  326. package/src/lib/db/providers/sql/oracle.ts +1044 -0
  327. package/src/lib/db/providers/sql/postgres.ts +1179 -0
  328. package/src/lib/db/providers/sql/sql-base.ts +174 -0
  329. package/src/lib/db/providers/sql/sqlite.ts +721 -0
  330. package/src/lib/db/types.ts +437 -0
  331. package/src/lib/db/utils/pool-manager.ts +287 -0
  332. package/src/lib/db/utils/query-limiter.ts +239 -0
  333. package/src/lib/db-ui-config.ts +86 -0
  334. package/src/lib/editor/mongodb-completions.ts +172 -0
  335. package/src/lib/editor/sql-completions.ts +280 -0
  336. package/src/lib/llm/base-provider.ts +117 -0
  337. package/src/lib/llm/factory.ts +102 -0
  338. package/src/lib/llm/index.ts +90 -0
  339. package/src/lib/llm/providers/custom.ts +181 -0
  340. package/src/lib/llm/providers/gemini.ts +126 -0
  341. package/src/lib/llm/providers/ollama.ts +154 -0
  342. package/src/lib/llm/providers/openai.ts +146 -0
  343. package/src/lib/llm/types.ts +173 -0
  344. package/src/lib/llm/utils/config.ts +187 -0
  345. package/src/lib/llm/utils/retry.ts +119 -0
  346. package/src/lib/llm/utils/streaming.ts +202 -0
  347. package/src/lib/logger.ts +127 -0
  348. package/src/lib/monitoring-thresholds.ts +44 -0
  349. package/src/lib/oidc.ts +262 -0
  350. package/src/lib/query-generators.ts +61 -0
  351. package/src/lib/schema-diff/diff-engine.ts +273 -0
  352. package/src/lib/schema-diff/migration-generator.ts +208 -0
  353. package/src/lib/schema-diff/types.ts +55 -0
  354. package/src/lib/seed/config-loader.ts +79 -0
  355. package/src/lib/seed/connection-filter.ts +49 -0
  356. package/src/lib/seed/credential-resolver.ts +62 -0
  357. package/src/lib/seed/index.ts +40 -0
  358. package/src/lib/seed/resolve-connection.ts +57 -0
  359. package/src/lib/seed/types.ts +69 -0
  360. package/src/lib/sql/alias-extractor.ts +267 -0
  361. package/src/lib/sql/index.ts +8 -0
  362. package/src/lib/sql/statement-splitter.ts +167 -0
  363. package/src/lib/sql/types.ts +40 -0
  364. package/src/lib/ssh/tunnel.ts +142 -0
  365. package/src/lib/storage/factory.ts +84 -0
  366. package/src/lib/storage/index.ts +14 -0
  367. package/src/lib/storage/local-storage.ts +99 -0
  368. package/src/lib/storage/providers/postgres.ts +225 -0
  369. package/src/lib/storage/providers/sqlite.ts +153 -0
  370. package/src/lib/storage/storage-facade.ts +272 -0
  371. package/src/lib/storage/types.ts +75 -0
  372. package/src/lib/time-series-buffer.ts +58 -0
  373. package/src/lib/types.ts +173 -0
  374. package/src/lib/utils.ts +6 -0
  375. package/src/proxy.ts +104 -0
  376. package/src/types/db-drivers.d.ts +23 -0
  377. package/src/types/html2canvas.d.ts +9 -0
  378. package/tests/api/admin/audit.test.ts +178 -0
  379. package/tests/api/admin/fleet-health.test.ts +183 -0
  380. package/tests/api/ai/autopilot.test.ts +174 -0
  381. package/tests/api/ai/chat.test.ts +250 -0
  382. package/tests/api/ai/describe-schema.test.ts +266 -0
  383. package/tests/api/ai/explain.test.ts +199 -0
  384. package/tests/api/ai/impact.test.ts +168 -0
  385. package/tests/api/ai/index-advisor.test.ts +171 -0
  386. package/tests/api/ai/nl2sql.test.ts +202 -0
  387. package/tests/api/ai/query-safety.test.ts +196 -0
  388. package/tests/api/auth/login.test.ts +170 -0
  389. package/tests/api/auth/logout.test.ts +140 -0
  390. package/tests/api/auth/me.test.ts +73 -0
  391. package/tests/api/auth/oidc-callback.test.ts +215 -0
  392. package/tests/api/auth/oidc-login.test.ts +127 -0
  393. package/tests/api/db/cancel.test.ts +198 -0
  394. package/tests/api/db/disconnect.test.ts +124 -0
  395. package/tests/api/db/health.test.ts +222 -0
  396. package/tests/api/db/maintenance.test.ts +263 -0
  397. package/tests/api/db/monitoring.test.ts +221 -0
  398. package/tests/api/db/multi-query.test.ts +316 -0
  399. package/tests/api/db/pool-stats.test.ts +135 -0
  400. package/tests/api/db/profile.test.ts +330 -0
  401. package/tests/api/db/provider-meta.test.ts +193 -0
  402. package/tests/api/db/query.test.ts +314 -0
  403. package/tests/api/db/schema-snapshot.test.ts +170 -0
  404. package/tests/api/db/schema.test.ts +191 -0
  405. package/tests/api/db/test-connection.test.ts +185 -0
  406. package/tests/api/db/transaction.test.ts +314 -0
  407. package/tests/api/proxy.test.ts +191 -0
  408. package/tests/api/seed/managed-route.test.ts +113 -0
  409. package/tests/api/storage/config.test.ts +42 -0
  410. package/tests/api/storage/storage-routes.test.ts +309 -0
  411. package/tests/components/AIAutopilotPanel.test.tsx +756 -0
  412. package/tests/components/AdminPage.test.tsx +33 -0
  413. package/tests/components/CodeGenerator.test.tsx +182 -0
  414. package/tests/components/CommandPalette.test.tsx +428 -0
  415. package/tests/components/CommunitySection.test.tsx +91 -0
  416. package/tests/components/ConnectionModal.mobile.test.tsx +284 -0
  417. package/tests/components/ConnectionModal.test.tsx +570 -0
  418. package/tests/components/CreateTableModal.test.tsx +383 -0
  419. package/tests/components/DataCharts.test.tsx +739 -0
  420. package/tests/components/DataImportModal.test.tsx +751 -0
  421. package/tests/components/DataProfiler.test.tsx +589 -0
  422. package/tests/components/DatabaseDocs.test.tsx +353 -0
  423. package/tests/components/LoginPage.test.tsx +163 -0
  424. package/tests/components/LoginPageOIDC.test.tsx +92 -0
  425. package/tests/components/MaskingSettings.test.tsx +498 -0
  426. package/tests/components/MobileNav.test.tsx +30 -0
  427. package/tests/components/MonitoringPage.test.tsx +32 -0
  428. package/tests/components/NL2SQLPanel.test.tsx +621 -0
  429. package/tests/components/Page.test.tsx +33 -0
  430. package/tests/components/PivotTable.test.tsx +350 -0
  431. package/tests/components/QueryEditor.test.tsx +1730 -0
  432. package/tests/components/QueryHistory.test.tsx +572 -0
  433. package/tests/components/QuerySafetyDialog.test.tsx +586 -0
  434. package/tests/components/ResultsGrid.test.tsx +804 -0
  435. package/tests/components/RootLayout.test.tsx +83 -0
  436. package/tests/components/SaveQueryModal.test.tsx +25 -0
  437. package/tests/components/SavedQueries.test.tsx +43 -0
  438. package/tests/components/SchemaDiagram.test.tsx +1034 -0
  439. package/tests/components/SchemaDiff.test.tsx +906 -0
  440. package/tests/components/SnapshotTimeline.test.tsx +174 -0
  441. package/tests/components/Studio.test.tsx +1030 -0
  442. package/tests/components/TestDataGenerator.test.tsx +291 -0
  443. package/tests/components/VisualExplain.test.tsx +704 -0
  444. package/tests/components/admin/AdminDashboard.test.tsx +205 -0
  445. package/tests/components/admin/AuditTab.test.tsx +220 -0
  446. package/tests/components/admin/MonitoringEmbed.test.tsx +58 -0
  447. package/tests/components/admin/OperationsTab.test.tsx +975 -0
  448. package/tests/components/admin/OverviewTab.test.tsx +254 -0
  449. package/tests/components/admin/SecurityTab.test.tsx +467 -0
  450. package/tests/components/monitoring/MetricChart.test.tsx +111 -0
  451. package/tests/components/monitoring/MonitoringDashboard.test.tsx +259 -0
  452. package/tests/components/monitoring/OverviewTab.test.tsx +78 -0
  453. package/tests/components/monitoring/PerformanceTab.test.tsx +87 -0
  454. package/tests/components/monitoring/PoolTab.test.tsx +42 -0
  455. package/tests/components/monitoring/QueriesTab.test.tsx +80 -0
  456. package/tests/components/monitoring/SessionsTab.test.tsx +154 -0
  457. package/tests/components/monitoring/StorageTab.test.tsx +127 -0
  458. package/tests/components/monitoring/TablesTab.test.tsx +153 -0
  459. package/tests/components/results-grid/ResultCard.test.tsx +105 -0
  460. package/tests/components/results-grid/RowDetailSheet.test.tsx +308 -0
  461. package/tests/components/results-grid/StatsBar.test.tsx +162 -0
  462. package/tests/components/schema-explorer/ColumnList.test.tsx +151 -0
  463. package/tests/components/schema-explorer/SchemaExplorer.test.tsx +461 -0
  464. package/tests/components/schema-explorer/TableItem.test.tsx +415 -0
  465. package/tests/components/sidebar/ConnectionItem.test.tsx +201 -0
  466. package/tests/components/sidebar/ConnectionsList.test.tsx +176 -0
  467. package/tests/components/sidebar/Sidebar.test.tsx +187 -0
  468. package/tests/components/studio/BottomPanel.test.tsx +383 -0
  469. package/tests/components/studio/QueryToolbar.test.tsx +321 -0
  470. package/tests/components/studio/StudioDesktopHeader.test.tsx +377 -0
  471. package/tests/components/studio/StudioMobileHeader.test.tsx +198 -0
  472. package/tests/components/studio/StudioTabBar.test.tsx +331 -0
  473. package/tests/fixtures/connections.ts +96 -0
  474. package/tests/fixtures/masking-configs.ts +86 -0
  475. package/tests/fixtures/query-results.ts +71 -0
  476. package/tests/fixtures/schemas.ts +64 -0
  477. package/tests/fixtures/seed-connections/invalid-config.yaml +7 -0
  478. package/tests/fixtures/seed-connections/minimal-config.yaml +8 -0
  479. package/tests/fixtures/seed-connections/mixed-credentials.yaml +23 -0
  480. package/tests/fixtures/seed-connections/multi-role-config.yaml +30 -0
  481. package/tests/fixtures/seed-connections/valid-config.json +15 -0
  482. package/tests/fixtures/seed-connections/valid-config.yaml +51 -0
  483. package/tests/helpers/mock-fetch.ts +59 -0
  484. package/tests/helpers/mock-monaco.ts +112 -0
  485. package/tests/helpers/mock-navigation.ts +28 -0
  486. package/tests/helpers/mock-next.ts +80 -0
  487. package/tests/helpers/mock-provider.ts +133 -0
  488. package/tests/helpers/mock-sonner.ts +29 -0
  489. package/tests/helpers/render-with-providers.tsx +19 -0
  490. package/tests/hooks/use-ai-chat.test.ts +600 -0
  491. package/tests/hooks/use-auth.test.ts +371 -0
  492. package/tests/hooks/use-connection-form.test.ts +743 -0
  493. package/tests/hooks/use-connection-manager.test.ts +466 -0
  494. package/tests/hooks/use-inline-editing.test.ts +321 -0
  495. package/tests/hooks/use-mobile.test.ts +177 -0
  496. package/tests/hooks/use-monitoring-data.test.ts +819 -0
  497. package/tests/hooks/use-provider-metadata.test.ts +228 -0
  498. package/tests/hooks/use-query-execution.test.ts +1212 -0
  499. package/tests/hooks/use-tab-manager.test.ts +756 -0
  500. package/tests/hooks/use-toast.test.ts +74 -0
  501. package/tests/hooks/use-transaction-control.test.ts +211 -0
  502. package/tests/integration/db/mongodb-provider.test.ts +698 -0
  503. package/tests/integration/db/mssql-provider.test.ts +840 -0
  504. package/tests/integration/db/mysql-provider.test.ts +872 -0
  505. package/tests/integration/db/oracle-provider.test.ts +843 -0
  506. package/tests/integration/db/postgres-provider.test.ts +1382 -0
  507. package/tests/integration/db/redis-provider.test.ts +526 -0
  508. package/tests/integration/db/sqlite-provider.test.ts +480 -0
  509. package/tests/integration/seed/seed-pipeline.test.ts +102 -0
  510. package/tests/isolated/factory-singleton.test.ts +150 -0
  511. package/tests/isolated/use-storage-sync.test.ts +389 -0
  512. package/tests/run-components.sh +196 -0
  513. package/tests/setup-dom.ts +58 -0
  514. package/tests/setup.ts +40 -0
  515. package/tests/unit/api-errors.test.ts +210 -0
  516. package/tests/unit/code-generator-functions.test.ts +271 -0
  517. package/tests/unit/components/column-list.test.tsx +190 -0
  518. package/tests/unit/components/data-import-modal.test.tsx +441 -0
  519. package/tests/unit/components/studio-mobile-header.test.tsx +327 -0
  520. package/tests/unit/data-charts-functions.test.ts +496 -0
  521. package/tests/unit/data-import-functions.test.ts +320 -0
  522. package/tests/unit/data-import-utils.test.ts +125 -0
  523. package/tests/unit/db/base-provider.test.ts +517 -0
  524. package/tests/unit/db/errors.test.ts +403 -0
  525. package/tests/unit/db/factory.test.ts +436 -0
  526. package/tests/unit/db/pool-manager.test.ts +440 -0
  527. package/tests/unit/db/query-limiter.test.ts +387 -0
  528. package/tests/unit/db/sql-base.test.ts +438 -0
  529. package/tests/unit/lib/api/error-codes.test.ts +39 -0
  530. package/tests/unit/lib/audit.test.ts +326 -0
  531. package/tests/unit/lib/auth.test.ts +146 -0
  532. package/tests/unit/lib/connection-string-parser.test.ts +424 -0
  533. package/tests/unit/lib/data-masking.test.ts +583 -0
  534. package/tests/unit/lib/db-icons.test.tsx +41 -0
  535. package/tests/unit/lib/monitoring-thresholds.test.ts +133 -0
  536. package/tests/unit/lib/oidc.test.ts +509 -0
  537. package/tests/unit/lib/query-generators.test.ts +127 -0
  538. package/tests/unit/lib/storage/factory.test.ts +71 -0
  539. package/tests/unit/lib/storage/local-storage.test.ts +114 -0
  540. package/tests/unit/lib/storage/providers/postgres.test.ts +312 -0
  541. package/tests/unit/lib/storage/providers/sqlite.test.ts +232 -0
  542. package/tests/unit/lib/storage/storage-facade-extended.test.ts +331 -0
  543. package/tests/unit/lib/storage/storage-facade.test.ts +184 -0
  544. package/tests/unit/lib/storage.test.ts +317 -0
  545. package/tests/unit/lib/time-series-buffer.test.ts +212 -0
  546. package/tests/unit/lib/utils.test.ts +24 -0
  547. package/tests/unit/llm/base-provider.test.ts +238 -0
  548. package/tests/unit/llm/config.test.ts +262 -0
  549. package/tests/unit/llm/custom-provider.test.ts +281 -0
  550. package/tests/unit/llm/gemini-provider.test.ts +248 -0
  551. package/tests/unit/llm/llm-factory.test.ts +155 -0
  552. package/tests/unit/llm/ollama-provider.test.ts +288 -0
  553. package/tests/unit/llm/openai-provider.test.ts +324 -0
  554. package/tests/unit/llm/retry.test.ts +180 -0
  555. package/tests/unit/llm/streaming.test.ts +355 -0
  556. package/tests/unit/logger.test.ts +198 -0
  557. package/tests/unit/mongodb-completions.test.ts +516 -0
  558. package/tests/unit/pivot-table-functions.test.ts +76 -0
  559. package/tests/unit/query-cancelled-error.test.ts +81 -0
  560. package/tests/unit/schema-diff/diff-engine.test.ts +367 -0
  561. package/tests/unit/schema-diff/migration-generator.test.ts +513 -0
  562. package/tests/unit/seed/config-loader.test.ts +73 -0
  563. package/tests/unit/seed/connection-filter.test.ts +91 -0
  564. package/tests/unit/seed/credential-resolver.test.ts +85 -0
  565. package/tests/unit/seed/index.test.ts +72 -0
  566. package/tests/unit/seed/resolve-connection.test.ts +74 -0
  567. package/tests/unit/seed/types.test.ts +129 -0
  568. package/tests/unit/sql/alias-extractor.test.ts +444 -0
  569. package/tests/unit/sql/statement-splitter.test.ts +348 -0
  570. package/tests/unit/sql-completions.test.ts +463 -0
  571. package/tests/unit/ssh-tunnel.test.ts +465 -0
  572. package/tsconfig.json +42 -0
package/README.md ADDED
@@ -0,0 +1,614 @@
1
+ <p align="center">
2
+ <img src="public/logo.svg" width="200" alt="LibreDB Studio Logo" />
3
+ </p>
4
+
5
+ <h1 align="center">LibreDB Studio</h1>
6
+
7
+ <p align="center">
8
+ <strong>The Modern, AI-Powered Open-Source SQL IDE for Cloud-Native Teams.</strong>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
13
+ <a href="https://sonarcloud.io/project/overview?id=libredb_libredb-studio"><img src="https://sonarcloud.io/api/project_badges/measure?project=libredb_libredb-studio&metric=alert_status" alt="Quality Gate"></a>
14
+ <a href="https://deepwiki.com/libredb/libredb-studio"><img src="https://img.shields.io/badge/Docs-DeepWiki-blue?logo=gitbook" alt="DeepWiki Docs"></a>
15
+ <a href="https://artifacthub.io/packages/search?repo=libredb-studio"><img src="https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/libredb-studio" alt="Artifact Hub"></a>
16
+ </p>
17
+
18
+ <p align="center">
19
+ <a href="https://nextjs.org/"><img src="https://img.shields.io/badge/Next.js-16-black?logo=next.js" alt="Next.js 16"></a>
20
+ <a href="https://react.dev/"><img src="https://img.shields.io/badge/React-19-61DAFB?logo=react" alt="React 19"></a>
21
+ <a href="https://www.docker.com/"><img src="https://img.shields.io/badge/Docker-Ready-2496ED?logo=docker" alt="Docker Support"></a>
22
+ <a href="https://kubernetes.io/"><img src="https://img.shields.io/badge/Kubernetes-Compatible-326CE5?logo=kubernetes" alt="Kubernetes Compatible"></a>
23
+ </p>
24
+
25
+ <p align="center">
26
+ <a href="#-live-test"><strong>🚀 Try Live Test</strong></a> •
27
+ <a href="#getting-started"><strong>📖 Documentation</strong></a> •
28
+ <a href="#-one-click-deploy"><strong>⚡ Deploy Your Own</strong></a>
29
+ </p>
30
+
31
+ <p align="center">
32
+ <img src="public/screenshots/hero-editor.png" alt="LibreDB Studio - Professional SQL IDE" width="100%" />
33
+ </p>
34
+
35
+ ---
36
+
37
+ ## 🚀 Live Test
38
+
39
+ > **Try LibreDB Studio instantly without installation!**
40
+
41
+ | Test | URL | Credentials |
42
+ |------|-----|-------------|
43
+ | **Public Test** | [app.libredb.org](https://app.libredb.org) | `admin@libredb.org` / `LibreDB.2026` |
44
+
45
+ The test instance comes with a pre-configured PostgreSQL database via [Seed Connections](#seed-connections-pre-configured-databases). No setup required!
46
+
47
+ ---
48
+
49
+ ## Overview
50
+
51
+ **LibreDB Studio** is a lightweight, high-performance, and secure web-based SQL editor designed to bridge the gap between heavy desktop applications (like DataGrip/DBeaver) and minimal CLI tools. Built with a "Mobile-First, Professional-Always" philosophy, it empowers engineering teams to manage databases anywhere—from a 4K monitor to a mobile screen.
52
+
53
+ ### Why LibreDB Studio?
54
+ - **Zero Install**: Run a professional SQL IDE in your browser or private network.
55
+ - **Multi-Platform**: Native-like experience on both **Web** and **Mobile** browsers.
56
+ - **AI-Native**: Multi-model support (Gemini, OpenAI, or Local LLMs) for NL2SQL.
57
+ - **DevOps Ready**: Optimized for Kubernetes orchestration and Docker environments.
58
+ - **Enterprise Grade**: Built-in RBAC, SSO (OIDC), query auditing, and live health monitoring.
59
+
60
+ <p align="center">
61
+ <img src="public/screenshots/connection-modal.png" alt="Multi-Database Connection Manager" width="100%" />
62
+ <br/><em>Connect to PostgreSQL, MySQL, Oracle, SQL Server, MongoDB, Redis, or SQLite with SSL/TLS and SSH Tunnel support.</em>
63
+ </p>
64
+
65
+ ---
66
+
67
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/libredb/libredb-studio)
68
+
69
+ ---
70
+
71
+ ## Key Features
72
+
73
+ ### Professional SQL IDE
74
+ - **Monaco Engine**: Powered by the same core as VS Code.
75
+ - **Smart Autocomplete**: Schema-aware suggestions for tables, columns, and SQL keywords.
76
+ - **Multi-Tab Workspace**: Handle parallel tasks with independent execution states.
77
+ - **Visual EXPLAIN**: Graphical execution plans to identify performance bottlenecks.
78
+ - **Interactive ER Diagrams**: Visual schema graph with real foreign key edges, cardinality labels, MiniMap navigation, table search/filter, compact mode, and PNG/SVG export. Automatic hierarchical layout powered by ELK.js.
79
+ - **Schema Diff & Migration**: Compare schema snapshots or cross-connection schemas side-by-side. Color-coded diff view (added/removed/modified) with automatic migration SQL generation for PostgreSQL, MySQL, SQLite, Oracle, and SQL Server.
80
+ - **Snapshot Timeline**: Visual horizontal timeline of schema snapshots. Click any two points to instantly compare and track schema evolution over time.
81
+
82
+ <p align="center">
83
+ <img src="public/screenshots/erd-diagram.png" alt="Interactive ER Diagram" width="100%" />
84
+ <br/><em>Visual schema explorer with interactive ER diagrams powered by ReactFlow.</em>
85
+ </p>
86
+
87
+ ### Multi-Model AI Copilot
88
+ - **Universal LLM Support**: Defaults to Gemini 2.5 Flash, but ready for OpenAI, Claude, or **Local LLMs** (Ollama/LM Studio).
89
+ - **NL2SQL**: Generate complex queries from natural language with schema-aware context.
90
+ - **Query Safety Analysis**: AI-powered pre-execution risk assessment for destructive queries (DELETE, DROP, TRUNCATE).
91
+ - **AI Query Explainer**: EXPLAIN plans translated into plain language with optimization suggestions.
92
+ - **AI Query Autopilot**: Automated slow query analysis with actionable index and rewrite recommendations.
93
+ - **Schema Awareness**: AI understands your specific database structure for pinpoint accuracy.
94
+ - **Plug & Play**: Works out of the box with zero complex configuration.
95
+
96
+ <p align="center">
97
+ <img src="public/screenshots/nl2sql.png" alt="NL2SQL - Natural Language to SQL" width="100%" />
98
+ <br/><em>Ask questions in plain English and get executable SQL queries instantly.</em>
99
+ </p>
100
+
101
+ ### Pro Data Management
102
+ - **Universal Data Grid**: Virtualized rendering (TanStack) for millions of rows.
103
+ - **Inline Editing**: Double-click to update values directly in the grid.
104
+ - **Column Filtering**: Per-column text filters on query results for instant data exploration.
105
+ - **Interactive Pivot Table**: Client-side pivoting with 5 aggregation functions (COUNT, SUM, AVG, MIN, MAX) and SQL generation.
106
+ - **Expert Exporter**: Instant CSV and JSON exports for reporting.
107
+
108
+ ### Advanced Data Visualization
109
+ - **8 Chart Types**: Bar, Line, Pie, Area, Scatter, Histogram, Stacked Bar, and Stacked Area charts powered by Recharts.
110
+ - **Data Aggregation**: Group-by with SUM, AVG, COUNT, MIN, MAX aggregation functions. Date grouping by hour, day, week, month, or year.
111
+ - **Chart Persistence**: Save chart configurations and reload them instantly. Manage a library of saved charts.
112
+ - **Chart Dashboard**: Grid view of all saved charts for at-a-glance data overview directly in the bottom panel.
113
+
114
+ ### Data Privacy & Masking
115
+ - **Automatic Sensitive Column Detection**: 10 built-in patterns (email, phone, credit card, SSN, password, IP, date, financial, and more) with regex-based column name matching.
116
+ - **Configurable Masking Rules**: Admin panel to add, edit, enable/disable masking patterns. Custom patterns with regex support.
117
+ - **RBAC-Enforced Masking**: User role cannot toggle or reveal masked data. Admin role has full control with per-cell temporary reveal (10s auto-hide).
118
+ - **Export Protection**: CSV, JSON, and SQL INSERT exports contain masked values when masking is active — no raw data leakage.
119
+ - **Full Coverage**: Masking applied across desktop grid, mobile card view, mobile table view, row detail sheet, and clipboard operations.
120
+ - **Persistent Configuration**: Masking settings stored in localStorage and survive page reloads.
121
+
122
+ ### Analyst & Developer Tools
123
+ - **AI Data Profiler**: One-click table profiling with column statistics (null %, cardinality, min/max, sample values) and AI-powered narrative summaries.
124
+ - **ORM Code Generator**: Generate TypeScript interfaces, Zod schemas, Prisma models, Go structs, Python dataclasses, and Java POJOs from live table schemas.
125
+ - **Test Data Generator**: Schema-aware fake data generation with 30+ semantic column inferences (email, phone, name, address, etc.). Produces INSERT statements or MongoDB insertMany JSON.
126
+ - **Database Documentation**: Auto-generated searchable data dictionary from live schema with AI-powered documentation and Markdown export.
127
+
128
+ <p align="center">
129
+ <img src="public/screenshots/data-profiler.png" alt="AI Data Profiler" width="80%" />
130
+ <br/><em>One-click column profiling: null %, cardinality, min/max, and sample values for 300K+ rows.</em>
131
+ </p>
132
+
133
+ <p align="center">
134
+ <img src="public/screenshots/code-generator.png" alt="ORM Code Generator" width="80%" />
135
+ <br/><em>Generate TypeScript interfaces, Prisma models, Go structs, and more from live schemas.</em>
136
+ </p>
137
+
138
+ ### Authentication & SSO
139
+ - **Dual Auth Modes**: Local email/password login or OpenID Connect (OIDC) Single Sign-On — switchable via environment variable.
140
+ - **Vendor-Agnostic OIDC**: Works with any OIDC-compliant provider — Auth0, Keycloak, Okta, Azure AD, Zitadel, Google, and more.
141
+ - **PKCE Security**: Authorization Code Flow with Proof Key for Code Exchange (S256) for secure authentication.
142
+ - **Auto Role Mapping**: Configurable claim-based role mapping with dot-notation for nested claims (e.g., `realm_access.roles`).
143
+ - **Provider Logout**: Logout clears both local JWT session and identity provider session.
144
+
145
+ ### DBA Maintenance Toolkit (Admin Only)
146
+ - **Live Monitoring Dashboard**: 7-tab monitoring with Overview, Performance, Queries, Sessions, Tables, Storage, and Connection Pool views.
147
+ - **Time-Series Trend Charts**: Real-time metric trends (connections, cache hit ratio, buffer pool, deadlocks) with auto-refreshing ring buffer history.
148
+ - **Configurable Auto-Refresh**: Polling intervals from 5s to 60s with play/pause control.
149
+ - **Threshold Alerting**: Color-coded health indicators (healthy/warning/critical) for cache hit ratio, connection usage, deadlocks, and buffer pool utilization.
150
+ - **Connection Pool Stats**: Live total/active/idle/waiting pool metrics with utilization progress bars.
151
+ - **One-Click Maintenance**: Trigger `VACUUM`, `ANALYZE`, `REINDEX`, `UPDATE STATISTICS`, `DBCC CHECKDB`, and `ALTER INDEX REBUILD` per database engine.
152
+ - **Audit Trail**: Full history of every query executed across the organization.
153
+
154
+ ---
155
+
156
+ ## Supported Databases
157
+
158
+ | Database | Driver | Features |
159
+ | :--- | :--- | :--- |
160
+ | **PostgreSQL** | `pg` | Full SQL IDE, EXPLAIN plans, transactions, query cancellation (`pg_cancel_backend`), SSL/TLS, SSH tunnel |
161
+ | **MySQL** | `mysql2` | Full SQL IDE, EXPLAIN plans, transactions, query cancellation (`KILL QUERY`), SSL/TLS, SSH tunnel |
162
+ | **Oracle** | `oracledb` (Thin mode) | Full SQL IDE, `FETCH FIRST N ROWS` pagination, `V$` monitoring views, `ANALYZE TABLE`, `ALTER INDEX REBUILD`, transactions |
163
+ | **SQL Server** | `mssql` (tedious) | Full SQL IDE, `TOP N` / `OFFSET FETCH` pagination, `sys.dm_*` DMVs, `UPDATE STATISTICS`, `DBCC CHECKDB`, transactions, Azure SQL auto-detect |
164
+ | **SQLite** | `better-sqlite3` | Full SQL IDE, file-based or in-memory databases |
165
+ | **MongoDB** | `mongodb` | JSON query editor, collection operations (find, aggregate, insert, update, delete) |
166
+ | **Redis** | `ioredis` | Command editor, key browser, INFO-based monitoring |
167
+
168
+ > All SQL databases share: schema explorer, ER diagrams, schema diff & migration, data masking, monitoring dashboard, and connection string import.
169
+
170
+ ---
171
+
172
+ ## Tech Stack
173
+
174
+ | Component | Technology | Target |
175
+ | :--- | :--- | :--- |
176
+ | **Framework** | Next.js 16 (App Router), React 19 | Web, Mobile |
177
+ | **UI Engine** | Tailwind CSS 4, Radix UI, [shadcn/ui](https://ui.shadcn.com/) | Web, Mobile |
178
+ | **Theming** | CSS Variables + `@theme inline` ([Guide](docs/THEMING.md)) | Web, Mobile |
179
+ | **Editor** | Monaco Editor (VS Code Engine) | Web |
180
+ | **AI** | Multi-Model (Gemini, OpenAI, Ollama, Custom) | Web, Mobile |
181
+ | **Auth** | JWT (`jose`) + OIDC (`openid-client`), PKCE, Role Mapping | Web, Mobile |
182
+ | **Database** | PostgreSQL, MySQL, Oracle, SQL Server, SQLite, MongoDB, Redis | Web, Mobile |
183
+ | **Charts** | Recharts (Bar, Line, Pie, Area, Scatter, Histogram, Stacked) | Web, Mobile |
184
+ | **ERD** | React Flow, ELK.js (auto-layout) | Web |
185
+ | **State/Grid** | TanStack Table & Virtual | Web, Mobile |
186
+ | **Deployment** | Docker, Kubernetes | Web |
187
+
188
+ ---
189
+
190
+ ## Getting Started
191
+
192
+ ### Quick Start (Docker)
193
+
194
+ Run LibreDB Studio with a single command — no clone, no install, no build:
195
+
196
+ ```bash
197
+ docker run -d \
198
+ --name libredb-studio \
199
+ -p 3000:3000 \
200
+ -e ADMIN_EMAIL=admin@libredb.org \
201
+ -e ADMIN_PASSWORD=LibreDB.2026 \
202
+ -e USER_EMAIL=user@libredb.org \
203
+ -e USER_PASSWORD=LibreDB.2026 \
204
+ -e JWT_SECRET=change-me-to-a-random-32-char-string \
205
+ ghcr.io/libredb/libredb-studio:latest
206
+ ```
207
+
208
+ Open [http://localhost:3000](http://localhost:3000) and login with `admin@libredb.org` / `LibreDB.2026`.
209
+
210
+ > **Tip**: Add `-e LLM_PROVIDER=gemini -e LLM_API_KEY=your_key -e LLM_MODEL=gemini-2.5-flash` to enable AI features.
211
+
212
+ ### Prerequisites
213
+ - [Bun](https://bun.sh/) (Recommended) or Node.js 20+
214
+ - A target database to query (PostgreSQL, MySQL, Oracle, SQL Server, SQLite, MongoDB, or Redis)
215
+
216
+ ### Quick Start (Local)
217
+ 1. **Clone & Install**
218
+ ```bash
219
+ git clone https://github.com/libredb/libredb-studio.git
220
+ cd libredb-studio
221
+ bun install
222
+ ```
223
+
224
+ 2. **Configure Environment**
225
+ Create a `.env.local` file:
226
+ ```env
227
+ # Authentication (email/password)
228
+ ADMIN_EMAIL=admin@libredb.org
229
+ ADMIN_PASSWORD=your_admin_password
230
+ USER_EMAIL=user@libredb.org
231
+ USER_PASSWORD=your_user_password
232
+ JWT_SECRET=your_32_character_random_string
233
+
234
+ # Optional: OIDC Single Sign-On (Auth0, Keycloak, Okta, Azure AD, etc.)
235
+ # NEXT_PUBLIC_AUTH_PROVIDER=oidc
236
+ # OIDC_ISSUER=https://your-provider.com
237
+ # OIDC_CLIENT_ID=your_client_id
238
+ # OIDC_CLIENT_SECRET=your_client_secret
239
+
240
+ # LLM Configuration
241
+ LLM_PROVIDER=gemini # options: gemini, openai, ollama, custom
242
+ LLM_API_KEY=your_api_key
243
+ LLM_MODEL=gemini-2.5-flash
244
+ LLM_API_URL=http://localhost:11434/v1 # optional for local LLMs (Ollama)
245
+ ```
246
+
247
+ 3. **Launch**
248
+ ```bash
249
+ bun dev
250
+ ```
251
+ Open [http://localhost:3000](http://localhost:3000)
252
+
253
+ ---
254
+
255
+ ## 🗄️ Development Databases
256
+
257
+ Need databases to test with? We provide ready-to-use containers for all supported engines:
258
+
259
+ ```bash
260
+ # Start all development databases (PostgreSQL, MySQL, MongoDB, SQL Server, Oracle)
261
+ docker compose -f database-compose.yml up -d
262
+
263
+ # Or start a specific database
264
+ docker compose -f database-compose.yml up -d postgres
265
+ docker compose -f database-compose.yml up -d mssql
266
+ docker compose -f database-compose.yml up -d oracle
267
+
268
+ # Start PostgreSQL with sample e-commerce data
269
+ docker compose -f docker/postgres.yml up -d
270
+
271
+ # Stop (keeps data)
272
+ docker compose -f database-compose.yml down
273
+
274
+ # Stop and remove all data
275
+ docker compose -f database-compose.yml down -v
276
+ ```
277
+
278
+ ### Connection Details
279
+
280
+ | Database | Host | Port | User | Password | Database/Service |
281
+ |----------|------|------|------|----------|-----------------|
282
+ | **PostgreSQL** | localhost | 5432 | postgres | postgres | postgres |
283
+ | **MySQL** | localhost | 3306 | root | root | mysql |
284
+ | **SQL Server** | localhost | 1433 | sa | Password123! | master |
285
+ | **Oracle** | localhost | 1521 | system | Password123! | freepdb1 |
286
+ | **MongoDB** | localhost | 27017 | admin | admin | — |
287
+
288
+ ### PostgreSQL Sample Data
289
+
290
+ The `docker/postgres.yml` setup includes a pre-loaded e-commerce schema:
291
+
292
+ | Feature | Description |
293
+ |---------|-------------|
294
+ | **PostgreSQL 17** | Latest Alpine image |
295
+ | **pg_stat_statements** | Pre-enabled for query monitoring |
296
+ | **Sample Schema** | E-commerce database (app schema) |
297
+ | **Sample Data** | 25 customers, 30 products, 100 orders |
298
+ | **Views** | Order summary, product sales, customer LTV |
299
+
300
+ Sample tables: `app.customers`, `app.products`, `app.orders`, `app.order_items`, `app.product_reviews`, `app.categories`, `app.coupons`, `app.audit_log`
301
+
302
+ > This setup is ideal for testing the **Monitoring Dashboard** features with real `pg_stat_statements` data.
303
+
304
+ ---
305
+
306
+ ## Testing
307
+
308
+ LibreDB Studio has a comprehensive test suite with **2,500+ unit/integration tests** and **35 E2E tests** across 6 layers, achieving **96%+ line coverage**.
309
+
310
+ ### Quick Commands
311
+
312
+ ```bash
313
+ # Run all tests (unit + API + integration + hooks + components)
314
+ bun run test
315
+
316
+ # Run by layer
317
+ bun run test:unit # Pure function tests (800 cases)
318
+ bun run test:api # API route handler tests (205 cases)
319
+ bun run test:integration # Database provider tests (294 cases)
320
+ bun run test:hooks # React hook tests (178 cases)
321
+ bun run test:components # Component tests with mock isolation (194 cases)
322
+
323
+ # E2E tests (requires build)
324
+ bun run test:e2e # Playwright browser tests (35 cases)
325
+
326
+ # Coverage report (lcov)
327
+ bun run test:coverage
328
+ ```
329
+
330
+ ### Test Architecture
331
+
332
+ | Layer | Directory | Runner | Tests | What it covers |
333
+ |-------|-----------|--------|-------|----------------|
334
+ | **Unit** | `tests/unit/` | `bun:test` | ~800 | Pure functions: SQL parser, connection strings, data masking, query limiter, schema diff, error classes, DB icons, showcase queries |
335
+ | **API** | `tests/api/` | `bun:test` | ~205 | Route handlers: auth, query, transaction, maintenance, AI endpoints, middleware |
336
+ | **Integration** | `tests/integration/` | `bun:test` | ~294 | Database providers: PG, MySQL, SQLite, MongoDB, Redis, Oracle, MSSQL|
337
+ | **Hooks** | `tests/hooks/` | `bun:test` | ~178 | React hooks: auth, connections, tabs, query execution, transactions, inline editing, AI chat, monitoring |
338
+ | **Components** | `tests/components/` | `bun:test` + happy-dom | ~194 | UI components: Studio, Sidebar, QueryEditor, ResultsGrid, Admin Dashboard, Charts, ERD |
339
+ | **E2E** | `e2e/` | Playwright | ~35 | Full browser flows: login, connections, query execution, tabs, export, admin |
340
+
341
+ ### Key Details
342
+
343
+ - **Test runner**: `bun:test` (built-in, Jest-compatible API) with `happy-dom` for DOM environment
344
+ - **Component isolation**: Component tests run in 6 isolated groups via `tests/run-components.sh` to prevent `mock.module()` cross-contamination
345
+ - **E2E**: Playwright with Chromium, runs against a production build (`bun run build && bun start`)
346
+ - **CI**: GitHub Actions runs lint + typecheck + build, unit/integration tests with coverage, E2E tests, and SonarCloud analysis
347
+ - **Coverage**: `bun test --coverage` generates lcov reports for SonarCloud integration
348
+
349
+ > **Important**: Always use `bun run test` instead of bare `bun test`. The test script handles proper isolation between test groups.
350
+
351
+ ---
352
+
353
+ ## ⚡ One-Click Deploy
354
+
355
+ Deploy your own instance of LibreDB Studio with a single click and a free account on Koyeb or Render:
356
+
357
+ [![Deploy to Koyeb](https://www.koyeb.com/static/images/deploy/button.svg)](https://app.koyeb.com/deploy?name=libredb-studio&type=docker&image=ghcr.io%2Flibredb%2Flibredb-studio%3Alatest&instance_type=free&regions=fra&instances_min=0&autoscaling_sleep_idle_delay=3900&env%5BADMIN_EMAIL%5D=admin%40libredb.org&env%5BADMIN_PASSWORD%5D=LibreDB.2026&env%5BJWT_SECRET%5D=your_secure_pass%3D&env%5BLLM_API_KEY%5D=your_GEMINI_API_KEY&env%5BLLM_MODEL%5D=gemini-2.5-flash&env%5BLLM_PROVIDER%5D=gemini&env%5BNEXT_PUBLIC_AUTH_PROVIDER%5D=local&env%5BSTORAGE_PROVIDER%5D=postgres&env%5BSTORAGE_POSTGRES_URL%5D=postgresql%3A%2F%2Fdb_user%3Adb_pass%40your_host.eu-central-1.pg.koyeb.app%2Flibredb_storage&env%5BUSER_EMAIL%5D=user%40libredb.org&env%5BUSER_PASSWORD%5D=LibreDB.2026&ports=3000%3Bhttp%3B%2F&hc_protocol%5B3000%5D=tcp&hc_grace_period%5B3000%5D=5&hc_interval%5B3000%5D=30&hc_restart_limit%5B3000%5D=3&hc_timeout%5B3000%5D=5&hc_path%5B3000%5D=%2F&hc_method%5B3000%5D=get)
358
+
359
+ [![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/libredb/libredb-studio)
360
+
361
+
362
+ ### Environment Variables
363
+
364
+ | Variable | Required | Description |
365
+ |----------|----------|-------------|
366
+ | `ADMIN_EMAIL` | ✅ | Admin email (default: `admin@libredb.org`) |
367
+ | `ADMIN_PASSWORD` | ✅ | Admin password |
368
+ | `USER_EMAIL` | ✅ | User email (default: `user@libredb.org`) |
369
+ | `USER_PASSWORD` | ✅ | User password |
370
+ | `JWT_SECRET` | ✅ | Secret for JWT tokens (min 32 chars) |
371
+ | `NEXT_PUBLIC_AUTH_PROVIDER` | ❌ | `local` (default) or `oidc` for SSO |
372
+ | `OIDC_ISSUER` | ❌ | OIDC issuer URL (required when `oidc`) |
373
+ | `OIDC_CLIENT_ID` | ❌ | OIDC client ID (required when `oidc`) |
374
+ | `OIDC_CLIENT_SECRET` | ❌ | OIDC client secret (required when `oidc`) |
375
+ | `OIDC_ADMIN_ROLES` | ❌ | Comma-separated admin role values (default: `admin`) |
376
+ | `OIDC_ROLE_CLAIM` | ❌ | Claim path for role (e.g. `realm_access.roles`) |
377
+ | `OIDC_SCOPE` | ❌ | OIDC scope (default: `openid profile email`) |
378
+ | `LLM_PROVIDER` | ❌ | AI provider: `gemini`, `openai`, `ollama` |
379
+ | `LLM_API_KEY` | ❌ | API key for AI features |
380
+ | `LLM_MODEL` | ❌ | Model name (e.g., `gemini-2.5-flash`) |
381
+ | `STORAGE_PROVIDER` | ❌ | Storage provider: `local` (default), `sqlite`, or `postgres` |
382
+ | `STORAGE_POSTGRES_URL` | ❌ | PostgreSQL connection URL (required when `STORAGE_PROVIDER=postgres`) |
383
+ | `SEED_CONFIG_PATH` | ❌ | Path to seed connections YAML config (see [Seed Connections](#seed-connections-pre-configured-databases)) |
384
+ | `SEED_CACHE_TTL_MS` | ❌ | Seed config cache TTL in ms (default: `60000`) |
385
+
386
+ > **Tip**: Copy `.env.example` to `.env.local` for local development.
387
+
388
+ ---
389
+
390
+ ## Deployment (DevOps)
391
+
392
+ ### Koyeb (Recommended for cloud deployment)
393
+
394
+ 1. **Fork this repository**
395
+ 2. **Connect to Koyeb**: [app.koyeb.com](https://app.koyeb.com) → New → Blueprint
396
+ 3. **Select your forked repo** and Koyeb will auto-detect `koyeb.yaml`
397
+ 4. **Set Environment Variables** in Koyeb Dashboard:
398
+ 5. **Deploy!** 🎉
399
+
400
+ ### Render (Recommended for cloud deployment)
401
+
402
+ LibreDB Studio includes a `render.yaml` Blueprint for one-click deployment:
403
+
404
+ 1. **Fork this repository**
405
+ 2. **Connect to Render**: [dashboard.render.com](https://dashboard.render.com) → New → Blueprint
406
+ 3. **Select your forked repo** and Render will auto-detect `render.yaml`
407
+ 4. **Set Environment Variables** in Render Dashboard:
408
+ 5. **Deploy!** 🎉
409
+
410
+ ### Docker Compose (Self-Hosted)
411
+
412
+ ```bash
413
+ docker-compose up -d
414
+ ```
415
+
416
+ ### Kubernetes (Helm Chart)
417
+
418
+ ```bash
419
+ helm repo add libredb https://libredb.org/libredb-studio/
420
+ helm install libredb libredb/libredb-studio \
421
+ --set secrets.jwtSecret=$(openssl rand -base64 32) \
422
+ --set secrets.adminPassword=MyAdmin123 \
423
+ --set secrets.userPassword=MyUser123
424
+ ```
425
+
426
+ Or via OCI registry:
427
+ ```bash
428
+ helm install libredb oci://ghcr.io/libredb/charts/libredb-studio --version 0.1.0 \
429
+ --set secrets.jwtSecret=$(openssl rand -base64 32) \
430
+ --set secrets.adminPassword=MyAdmin123 \
431
+ --set secrets.userPassword=MyUser123
432
+ ```
433
+
434
+ Features: PostgreSQL subchart, Ingress/TLS, HPA, PDB, NetworkPolicy, ExternalSecrets support. See [charts/libredb-studio/README.md](charts/libredb-studio/README.md) for full documentation.
435
+
436
+ ### Seed Connections (Pre-Configured Databases)
437
+
438
+ Pre-configure database connections via a YAML config file so users see them immediately after login. Ideal for Platform/SaaS deployments where admins provision databases for teams.
439
+
440
+ **Features:**
441
+ - Role-based access control (`admin`, `user`, `*` wildcard)
442
+ - Hybrid model: `managed: true` (read-only, admin-controlled) or `managed: false` (editable copy for user)
443
+ - Credentials injected via `${ENV_VAR}` syntax — never stored in config file
444
+ - Hot-reload: config changes apply within 60s without restart
445
+ - Works with Docker, docker-compose, and Kubernetes (Helm)
446
+
447
+ **1. Create a config file** (`seed-connections.yaml`):
448
+
449
+ ```yaml
450
+ version: "1"
451
+
452
+ defaults:
453
+ managed: true
454
+ environment: production
455
+
456
+ connections:
457
+ - id: "prod-analytics"
458
+ name: "Production Analytics"
459
+ type: postgres
460
+ host: analytics-db.internal
461
+ port: 5432
462
+ database: analytics
463
+ user: "readonly_user"
464
+ password: "${ANALYTICS_DB_PASSWORD}"
465
+ roles: ["admin"]
466
+ color: "#10B981"
467
+
468
+ - id: "dev-sandbox"
469
+ name: "Dev Sandbox"
470
+ type: mysql
471
+ host: dev-mysql.internal
472
+ port: 3306
473
+ database: sandbox
474
+ user: "dev_user"
475
+ password: "${DEV_DB_PASSWORD}"
476
+ roles: ["*"]
477
+ managed: false
478
+ ```
479
+
480
+ **2. Mount and configure:**
481
+
482
+ <details>
483
+ <summary><strong>Docker</strong></summary>
484
+
485
+ ```bash
486
+ docker run -v ./seed-connections.yaml:/app/config/seed-connections.yaml:ro \
487
+ -e SEED_CONFIG_PATH=/app/config/seed-connections.yaml \
488
+ -e ANALYTICS_DB_PASSWORD=secret \
489
+ -e DEV_DB_PASSWORD=devsecret \
490
+ ghcr.io/libredb/libredb-studio:latest
491
+ ```
492
+ </details>
493
+
494
+ <details>
495
+ <summary><strong>Docker Compose</strong></summary>
496
+
497
+ ```yaml
498
+ services:
499
+ app:
500
+ image: ghcr.io/libredb/libredb-studio:latest
501
+ volumes:
502
+ - ./seed-connections.yaml:/app/config/seed-connections.yaml:ro
503
+ environment:
504
+ SEED_CONFIG_PATH: /app/config/seed-connections.yaml
505
+ ANALYTICS_DB_PASSWORD: ${ANALYTICS_DB_PASSWORD}
506
+ DEV_DB_PASSWORD: ${DEV_DB_PASSWORD}
507
+ ```
508
+ </details>
509
+
510
+ <details>
511
+ <summary><strong>Kubernetes (Helm)</strong></summary>
512
+
513
+ ```yaml
514
+ # values.yaml
515
+ seedConnections:
516
+ enabled: true
517
+ config:
518
+ version: "1"
519
+ connections:
520
+ - id: "prod-analytics"
521
+ name: "Production Analytics"
522
+ type: postgres
523
+ host: analytics-db.internal
524
+ password: "${ANALYTICS_DB_PASSWORD}"
525
+ roles: ["admin"]
526
+
527
+ # Credentials via K8s Secret:
528
+ extraEnvFrom:
529
+ - secretRef:
530
+ name: seed-db-credentials
531
+ ```
532
+ </details>
533
+
534
+ **Config Reference:**
535
+
536
+ | Field | Required | Description |
537
+ |-------|----------|-------------|
538
+ | `version` | Yes | Must be `"1"` |
539
+ | `defaults` | No | Default values merged into all connections |
540
+ | `connections[].id` | Yes | Unique slug (`[a-z0-9-]+`, max 64 chars) |
541
+ | `connections[].name` | Yes | Display name in UI |
542
+ | `connections[].type` | Yes | `postgres`, `mysql`, `sqlite`, `mongodb`, `redis`, `oracle`, `mssql` |
543
+ | `connections[].roles` | Yes | `["*"]` (everyone), `["admin"]`, `["user"]`, or `["admin", "user"]` |
544
+ | `connections[].managed` | No | `true` = read-only (default), `false` = editable copy for user |
545
+ | `connections[].password` | No | Use `${ENV_VAR}` syntax for secrets |
546
+ | `connections[].environment` | No | `production`, `staging`, `development`, `local`, `other` |
547
+ | `connections[].group` | No | Group label in sidebar |
548
+ | `connections[].color` | No | Hex color for badge (e.g., `#10B981`) |
549
+
550
+ **Environment Variables:**
551
+
552
+ | Variable | Default | Description |
553
+ |----------|---------|-------------|
554
+ | `SEED_CONFIG_PATH` | `/app/config/seed-connections.yaml` | Path to config file |
555
+ | `SEED_CACHE_TTL_MS` | `60000` | Cache TTL in ms (hot-reload interval) |
556
+
557
+ ---
558
+
559
+ ## Roadmap
560
+
561
+ - [x] **Phase 1**: Monaco SQL IDE & Multi-Tab Support.
562
+ - [x] **Phase 2**: Multi-Model AI (Gemini, OpenAI, Ollama, Custom) Integration.
563
+ - [x] **Phase 3**: Pro Data Grid & Virtualization.
564
+ - [x] **Phase 4**: Multi-Database Support (PostgreSQL, MySQL, SQLite, MongoDB, Redis).
565
+ - [x] **Phase 5**: Interactive ER Diagrams (Visual Schema Graph).
566
+ - [x] **Phase 6**: Enterprise Foundation (Connection Testing, SSL/TLS, SSH Tunnel, Transaction Control, Query Cancellation).
567
+ - [x] **Phase 7**: AI Intelligence (NL2SQL, Query Safety Analysis, AI Index Advisor, Multi-Turn Chat, Query Autopilot).
568
+ - [x] **Phase 8**: Analyst & Developer Tools (Data Profiler, Code Generator, Test Data Generator, Pivot Table, Column Filtering, Database Docs).
569
+ - [x] **Phase 9**: Data Privacy (Automatic Sensitive Column Detection, Configurable Masking Patterns, RBAC-Enforced Masking, Export Protection).
570
+ - [x] **Phase 10**: Advanced ERD (Real FK Edges, ELK.js Auto-Layout, MiniMap, PNG/SVG Export, Compact Mode, Table Search).
571
+ - [x] **Phase 11**: Schema Diff & Migration (Snapshot Timeline, Cross-Connection Diff, Migration SQL Generation for PG/MySQL/SQLite).
572
+ - [x] **Phase 12**: Advanced Charting (Scatter, Histogram, Stacked Charts, Aggregation, Date Grouping, Chart Save/Load, Chart Dashboard).
573
+ - [x] **Phase 13**: Monitoring Enhancement (Time-Series Trends, Threshold Alerting, Connection Pool Stats, Configurable Polling).
574
+ - [x] **Phase 14**: Enterprise Database Support (Oracle Database via oracledb Thin mode, Microsoft SQL Server via mssql/tedious).
575
+ - [x] **Phase 15**: SSO Integration — Vendor-agnostic OIDC authentication (Auth0, Keycloak, Okta, Azure AD, Zitadel) with PKCE, role mapping, and provider logout.
576
+ - [ ] **Phase 16**: DBA & Monitoring (Lock Dependency Graph, Vacuum Scheduler, Prometheus Export).
577
+ - [ ] **Phase 17**: Enterprise Collaboration (User Identity, Shared Workspaces, SAML 2.0).
578
+
579
+ ---
580
+
581
+ ## Community & Quality
582
+
583
+ | Resource | Description |
584
+ |----------|-------------|
585
+ | [DeepWiki](https://deepwiki.com/libredb/libredb-studio) | AI-powered documentation — always up-to-date with the codebase |
586
+ | [SonarCloud](https://sonarcloud.io/project/overview?id=libredb_libredb-studio) | Code quality, security analysis, and technical debt tracking |
587
+ | [API Docs](docs/API_DOCS.md) | Complete REST API reference |
588
+ | [OIDC Setup Guide](docs/OIDC_SETUP.md) | SSO configuration for Auth0, Keycloak, Okta, Azure AD, Zitadel |
589
+ | [OIDC Architecture](docs/OIDC_ARCH.md) | OIDC subsystem internals, security model, extension points |
590
+ | [Theming Guide](docs/THEMING.md) | CSS theming, dark mode, and styling customization |
591
+ | [Architecture](docs/ARCHITECTURE.md) | System architecture and design patterns |
592
+
593
+ ---
594
+
595
+ ## Contributing
596
+
597
+ We welcome contributions from the community! Whether it's a bug fix, a new feature, or documentation improvements:
598
+ 1. Fork the Project.
599
+ 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`).
600
+ 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`).
601
+ 4. Push to the Branch (`git push origin feature/AmazingFeature`).
602
+ 5. Open a Pull Request.
603
+
604
+ ---
605
+
606
+ ## License
607
+
608
+ Distributed under the MIT License. See `LICENSE` for more information.
609
+
610
+ ---
611
+
612
+ <p align="center">
613
+ Built for DBAs and Developers.
614
+ </p>