supaschema 0.1.0-rc.1

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 (257) hide show
  1. package/.agents/skills/supaschema/SKILL.md +61 -0
  2. package/.claude/hooks/block-generated-migration-edits.mjs +32 -0
  3. package/.claude/rules/supaschema.md +22 -0
  4. package/.claude/settings.json +16 -0
  5. package/.claude/skills/supaschema/SKILL.md +61 -0
  6. package/.codex/hooks/supaschema-tool-gate.mjs +73 -0
  7. package/.codex/hooks.json +16 -0
  8. package/.codex/rules/supaschema.rules +22 -0
  9. package/AGENTS.md +40 -0
  10. package/LICENSE +661 -0
  11. package/LICENSE-COMMERCIAL.md +35 -0
  12. package/README.md +249 -0
  13. package/benchmarks/README.md +104 -0
  14. package/benchmarks/compare.js +489 -0
  15. package/benchmarks/fixtures/additive/from.sql +8 -0
  16. package/benchmarks/fixtures/additive/manifest.json +1 -0
  17. package/benchmarks/fixtures/additive/to.sql +9 -0
  18. package/benchmarks/fixtures/functions-policies/from.sql +24 -0
  19. package/benchmarks/fixtures/functions-policies/manifest.json +5 -0
  20. package/benchmarks/fixtures/functions-policies/to.sql +24 -0
  21. package/benchmarks/plot-lib.js +234 -0
  22. package/benchmarks/plot-svg.js +339 -0
  23. package/benchmarks/plot.js +154 -0
  24. package/benchmarks/tools/bench-all.sh +49 -0
  25. package/benchmarks/tools/build-project-fixture.mjs +245 -0
  26. package/benchmarks/tools/compare-db.mjs +101 -0
  27. package/benchmarks/tools/compare-fixtures.mjs +84 -0
  28. package/benchmarks/tools/compare-report.mjs +90 -0
  29. package/benchmarks/tools/compare-supabase.mjs +67 -0
  30. package/benchmarks/tools/registry.js +266 -0
  31. package/benchmarks/tools/run-workflow.mjs +77 -0
  32. package/bin/postinstall.mjs +26 -0
  33. package/bin/supaschema +2 -0
  34. package/config-schema.json +208 -0
  35. package/corpus/supabase-style/corpus.json +6 -0
  36. package/corpus/supabase-style/migrations/20260101000000_init.sql +28 -0
  37. package/corpus/supabase-style/migrations/20260102000000_noise.sql +13 -0
  38. package/corpus/supabase-style/migrations/20260103000000_churn.sql +4 -0
  39. package/corpus/supabase-style/migrations/20260104000000_triggers.sql +17 -0
  40. package/corpus/supabase-style/roles.sql +13 -0
  41. package/corpus/supabase-style/tree/functions.sql +26 -0
  42. package/corpus/supabase-style/tree/policies.sql +4 -0
  43. package/corpus/supabase-style/tree/schema.sql +4 -0
  44. package/corpus/supabase-style/tree/tables.sql +20 -0
  45. package/corpus/supabase-style/tree/triggers.sql +3 -0
  46. package/corpus/supabase-style/tree/types.sql +2 -0
  47. package/corpus/supabase-style/tree/views.sql +6 -0
  48. package/dist/audit.d.ts +20 -0
  49. package/dist/audit.d.ts.map +1 -0
  50. package/dist/audit.js +68 -0
  51. package/dist/benchmark-db.d.ts +5 -0
  52. package/dist/benchmark-db.d.ts.map +1 -0
  53. package/dist/benchmark-db.js +71 -0
  54. package/dist/benchmark-fixtures.d.ts +10 -0
  55. package/dist/benchmark-fixtures.d.ts.map +1 -0
  56. package/dist/benchmark-fixtures.js +201 -0
  57. package/dist/benchmark.d.ts +2 -0
  58. package/dist/benchmark.d.ts.map +1 -0
  59. package/dist/benchmark.js +308 -0
  60. package/dist/catalog-comments.d.ts +9 -0
  61. package/dist/catalog-comments.d.ts.map +1 -0
  62. package/dist/catalog-comments.js +194 -0
  63. package/dist/catalog-extras.d.ts +12 -0
  64. package/dist/catalog-extras.d.ts.map +1 -0
  65. package/dist/catalog-extras.js +408 -0
  66. package/dist/catalog-foreign.d.ts +15 -0
  67. package/dist/catalog-foreign.d.ts.map +1 -0
  68. package/dist/catalog-foreign.js +114 -0
  69. package/dist/catalog-tables.d.ts +9 -0
  70. package/dist/catalog-tables.d.ts.map +1 -0
  71. package/dist/catalog-tables.js +114 -0
  72. package/dist/catalog.d.ts +8 -0
  73. package/dist/catalog.d.ts.map +1 -0
  74. package/dist/catalog.js +351 -0
  75. package/dist/check-hazards.d.ts +7 -0
  76. package/dist/check-hazards.d.ts.map +1 -0
  77. package/dist/check-hazards.js +83 -0
  78. package/dist/check-reporters.d.ts +8 -0
  79. package/dist/check-reporters.d.ts.map +1 -0
  80. package/dist/check-reporters.js +76 -0
  81. package/dist/check.d.ts +3 -0
  82. package/dist/check.d.ts.map +1 -0
  83. package/dist/check.js +229 -0
  84. package/dist/cli-defaults.d.ts +24 -0
  85. package/dist/cli-defaults.d.ts.map +1 -0
  86. package/dist/cli-defaults.js +65 -0
  87. package/dist/cli-diff.d.ts +13 -0
  88. package/dist/cli-diff.d.ts.map +1 -0
  89. package/dist/cli-diff.js +348 -0
  90. package/dist/cli-reports.d.ts +9 -0
  91. package/dist/cli-reports.d.ts.map +1 -0
  92. package/dist/cli-reports.js +90 -0
  93. package/dist/cli-tools.d.ts +17 -0
  94. package/dist/cli-tools.d.ts.map +1 -0
  95. package/dist/cli-tools.js +136 -0
  96. package/dist/cli.d.ts +2 -0
  97. package/dist/cli.d.ts.map +1 -0
  98. package/dist/cli.js +239 -0
  99. package/dist/config-schema-gen.d.ts +2 -0
  100. package/dist/config-schema-gen.d.ts.map +1 -0
  101. package/dist/config-schema-gen.js +11 -0
  102. package/dist/config.d.ts +58 -0
  103. package/dist/config.d.ts.map +1 -0
  104. package/dist/config.js +132 -0
  105. package/dist/core.d.ts +115 -0
  106. package/dist/core.d.ts.map +1 -0
  107. package/dist/core.js +1 -0
  108. package/dist/corpus.d.ts +26 -0
  109. package/dist/corpus.d.ts.map +1 -0
  110. package/dist/corpus.js +112 -0
  111. package/dist/database-url.d.ts +8 -0
  112. package/dist/database-url.d.ts.map +1 -0
  113. package/dist/database-url.js +74 -0
  114. package/dist/db-admin.d.ts +23 -0
  115. package/dist/db-admin.d.ts.map +1 -0
  116. package/dist/db-admin.js +147 -0
  117. package/dist/diagnostics.d.ts +16 -0
  118. package/dist/diagnostics.d.ts.map +1 -0
  119. package/dist/diagnostics.js +155 -0
  120. package/dist/diff-score.d.ts +12 -0
  121. package/dist/diff-score.d.ts.map +1 -0
  122. package/dist/diff-score.js +339 -0
  123. package/dist/doctor.d.ts +17 -0
  124. package/dist/doctor.d.ts.map +1 -0
  125. package/dist/doctor.js +110 -0
  126. package/dist/hash.d.ts +7 -0
  127. package/dist/hash.d.ts.map +1 -0
  128. package/dist/hash.js +34 -0
  129. package/dist/index.d.ts +24 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/dist/index.js +17 -0
  132. package/dist/lineage.d.ts +23 -0
  133. package/dist/lineage.d.ts.map +1 -0
  134. package/dist/lineage.js +61 -0
  135. package/dist/migrations-status.d.ts +35 -0
  136. package/dist/migrations-status.d.ts.map +1 -0
  137. package/dist/migrations-status.js +131 -0
  138. package/dist/plan-order.d.ts +4 -0
  139. package/dist/plan-order.d.ts.map +1 -0
  140. package/dist/plan-order.js +178 -0
  141. package/dist/planner-replace.d.ts +4 -0
  142. package/dist/planner-replace.d.ts.map +1 -0
  143. package/dist/planner-replace.js +76 -0
  144. package/dist/planner-table.d.ts +3 -0
  145. package/dist/planner-table.d.ts.map +1 -0
  146. package/dist/planner-table.js +165 -0
  147. package/dist/planner.d.ts +5 -0
  148. package/dist/planner.d.ts.map +1 -0
  149. package/dist/planner.js +385 -0
  150. package/dist/render-guards.d.ts +12 -0
  151. package/dist/render-guards.d.ts.map +1 -0
  152. package/dist/render-guards.js +159 -0
  153. package/dist/render.d.ts +7 -0
  154. package/dist/render.d.ts.map +1 -0
  155. package/dist/render.js +325 -0
  156. package/dist/selfcheck.d.ts +11 -0
  157. package/dist/selfcheck.d.ts.map +1 -0
  158. package/dist/selfcheck.js +43 -0
  159. package/dist/source-normalize.d.ts +14 -0
  160. package/dist/source-normalize.d.ts.map +1 -0
  161. package/dist/source-normalize.js +420 -0
  162. package/dist/source.d.ts +4 -0
  163. package/dist/source.d.ts.map +1 -0
  164. package/dist/source.js +233 -0
  165. package/dist/sql/ast.d.ts +42 -0
  166. package/dist/sql/ast.d.ts.map +1 -0
  167. package/dist/sql/ast.js +241 -0
  168. package/dist/sql/canonical-nodes.d.ts +5 -0
  169. package/dist/sql/canonical-nodes.d.ts.map +1 -0
  170. package/dist/sql/canonical-nodes.js +101 -0
  171. package/dist/sql/extract-helpers.d.ts +18 -0
  172. package/dist/sql/extract-helpers.d.ts.map +1 -0
  173. package/dist/sql/extract-helpers.js +127 -0
  174. package/dist/sql/extract.d.ts +13 -0
  175. package/dist/sql/extract.d.ts.map +1 -0
  176. package/dist/sql/extract.js +323 -0
  177. package/dist/sql/facts.d.ts +34 -0
  178. package/dist/sql/facts.d.ts.map +1 -0
  179. package/dist/sql/facts.js +392 -0
  180. package/dist/sql/identifiers.d.ts +13 -0
  181. package/dist/sql/identifiers.d.ts.map +1 -0
  182. package/dist/sql/identifiers.js +83 -0
  183. package/dist/sql/normalize-deparse.d.ts +25 -0
  184. package/dist/sql/normalize-deparse.d.ts.map +1 -0
  185. package/dist/sql/normalize-deparse.js +96 -0
  186. package/dist/sql/object-hash.d.ts +5 -0
  187. package/dist/sql/object-hash.d.ts.map +1 -0
  188. package/dist/sql/object-hash.js +24 -0
  189. package/dist/sql/parser.d.ts +8 -0
  190. package/dist/sql/parser.d.ts.map +1 -0
  191. package/dist/sql/parser.js +89 -0
  192. package/dist/sql/privileges.d.ts +33 -0
  193. package/dist/sql/privileges.d.ts.map +1 -0
  194. package/dist/sql/privileges.js +379 -0
  195. package/dist/sql/split.d.ts +3 -0
  196. package/dist/sql/split.d.ts.map +1 -0
  197. package/dist/sql/split.js +182 -0
  198. package/dist/sql/statements.d.ts +17 -0
  199. package/dist/sql/statements.d.ts.map +1 -0
  200. package/dist/sql/statements.js +284 -0
  201. package/dist/sql/table-constraints.d.ts +15 -0
  202. package/dist/sql/table-constraints.d.ts.map +1 -0
  203. package/dist/sql/table-constraints.js +304 -0
  204. package/dist/sql/table-shape.d.ts +38 -0
  205. package/dist/sql/table-shape.d.ts.map +1 -0
  206. package/dist/sql/table-shape.js +287 -0
  207. package/dist/sync.d.ts +27 -0
  208. package/dist/sync.d.ts.map +1 -0
  209. package/dist/sync.js +86 -0
  210. package/dist/typegen-model.d.ts +78 -0
  211. package/dist/typegen-model.d.ts.map +1 -0
  212. package/dist/typegen-model.js +338 -0
  213. package/dist/typegen-views.d.ts +7 -0
  214. package/dist/typegen-views.d.ts.map +1 -0
  215. package/dist/typegen-views.js +92 -0
  216. package/dist/typegen-zod.d.ts +3 -0
  217. package/dist/typegen-zod.d.ts.map +1 -0
  218. package/dist/typegen-zod.js +149 -0
  219. package/dist/typegen.d.ts +4 -0
  220. package/dist/typegen.d.ts.map +1 -0
  221. package/dist/typegen.js +184 -0
  222. package/dist/validators.d.ts +3 -0
  223. package/dist/validators.d.ts.map +1 -0
  224. package/dist/validators.js +104 -0
  225. package/dist/verify-environment.d.ts +5 -0
  226. package/dist/verify-environment.d.ts.map +1 -0
  227. package/dist/verify-environment.js +92 -0
  228. package/dist/verify.d.ts +3 -0
  229. package/dist/verify.d.ts.map +1 -0
  230. package/dist/verify.js +261 -0
  231. package/docs/benchmarks/additive-correctness.svg +86 -0
  232. package/docs/benchmarks/additive-latency.svg +60 -0
  233. package/docs/benchmarks/functions-policies-correctness.svg +86 -0
  234. package/docs/benchmarks/functions-policies-latency.svg +60 -0
  235. package/docs/benchmarks/realistic-correctness.svg +86 -0
  236. package/docs/benchmarks/realistic-latency.svg +60 -0
  237. package/docs/benchmarks/scaling-latency.svg +106 -0
  238. package/docs/benchmarks/workflow-latency.svg +98 -0
  239. package/docs/benchmarks/xl-correctness.svg +86 -0
  240. package/docs/benchmarks/xl-latency.svg +60 -0
  241. package/docs/benchmarks/xxl-correctness.svg +86 -0
  242. package/docs/benchmarks/xxl-latency.svg +66 -0
  243. package/docs/case-study-anilize.md +51 -0
  244. package/docs/ci-gate.md +44 -0
  245. package/docs/ci.md +68 -0
  246. package/docs/commands.md +35 -0
  247. package/docs/config.md +72 -0
  248. package/docs/corpus.md +33 -0
  249. package/docs/diagnostics.md +77 -0
  250. package/docs/hints.md +92 -0
  251. package/docs/release.md +19 -0
  252. package/docs/support-matrix.md +57 -0
  253. package/examples/postgres/schemas/001_app.sql +17 -0
  254. package/examples/supabase/schemas/001_app.sql +13 -0
  255. package/examples/supabase/schemas-next/001_app.sql +21 -0
  256. package/examples/supabase/supaschema.config.json +15 -0
  257. package/package.json +99 -0
@@ -0,0 +1,60 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="410" viewBox="0 0 1200 410" role="img">
2
+ <defs>
3
+ <linearGradient id="supaGradient" x1="0" y1="0" x2="1" y2="0">
4
+ <stop offset="0%" stop-color="#059669" />
5
+ <stop offset="100%" stop-color="#34d399" />
6
+ </linearGradient>
7
+ <linearGradient id="slateGradient" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0%" stop-color="#3b4757" />
9
+ <stop offset="100%" stop-color="#526079" />
10
+ </linearGradient>
11
+ </defs>
12
+ <rect width="100%" height="100%" rx="14" fill="#0b1220" />
13
+ <text x="36.0" y="46.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="21" font-weight="700">Diff latency — functions-policies fixture (1 table)</text>
14
+ <text x="36.0" y="70.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12.5" font-weight="400">Median seconds per diff, log scale · whisker marks p95 · lower is better</text>
15
+ <line x1="300.0" y1="94" x2="300.0" y2="336" stroke="#1e293b" stroke-width="1" />
16
+ <text x="300.0" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">0.10s</text>
17
+ <line x1="399.3" y1="94" x2="399.3" y2="336" stroke="#1e293b" stroke-width="1" />
18
+ <text x="399.3" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">0.20s</text>
19
+ <line x1="530.7" y1="94" x2="530.7" y2="336" stroke="#1e293b" stroke-width="1" />
20
+ <text x="530.7" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">0.50s</text>
21
+ <line x1="630.0" y1="94" x2="630.0" y2="336" stroke="#1e293b" stroke-width="1" />
22
+ <text x="630.0" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">1.00s</text>
23
+ <line x1="729.3" y1="94" x2="729.3" y2="336" stroke="#1e293b" stroke-width="1" />
24
+ <text x="729.3" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">2.00s</text>
25
+ <line x1="860.7" y1="94" x2="860.7" y2="336" stroke="#1e293b" stroke-width="1" />
26
+ <text x="860.7" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">5.00s</text>
27
+ <line x1="960.0" y1="94" x2="960.0" y2="336" stroke="#1e293b" stroke-width="1" />
28
+ <text x="960.0" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">10.0s</text>
29
+ <circle cx="41" cy="117" r="4" fill="#34d399" />
30
+ <text x="54.0" y="121.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="650">supaschema-file</text>
31
+ <rect x="300" y="108" width="107.7" height="18" rx="4" fill="url(#supaGradient)" />
32
+ <line x1="446.0" y1="105" x2="446.0" y2="129" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
33
+ <text x="1164.0" y="121.0" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="650" text-anchor="end">0.21s · p95 0.28s</text>
34
+ <circle cx="41" cy="151" r="4" fill="#34d399" />
35
+ <text x="54.0" y="155.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="650">supaschema-db</text>
36
+ <rect x="300" y="142" width="140.2" height="18" rx="4" fill="url(#supaGradient)" />
37
+ <line x1="545.1" y1="139" x2="545.1" y2="163" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
38
+ <text x="1164.0" y="155.0" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="650" text-anchor="end">0.27s · p95 0.55s</text>
39
+ <text x="54.0" y="189.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-pg-schema</text>
40
+ <rect x="300" y="176" width="529.8" height="18" rx="4" fill="url(#slateGradient)" />
41
+ <line x1="841.7" y1="173" x2="841.7" y2="197" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
42
+ <text x="1164.0" y="189.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">4.03s · p95 4.38s</text>
43
+ <text x="54.0" y="223.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-pg-delta</text>
44
+ <rect x="300" y="210" width="530.3" height="18" rx="4" fill="url(#slateGradient)" />
45
+ <line x1="875.3" y1="207" x2="875.3" y2="231" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
46
+ <text x="1164.0" y="223.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">4.05s · p95 5.54s</text>
47
+ <text x="54.0" y="257.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-migra</text>
48
+ <rect x="300" y="244" width="533.1" height="18" rx="4" fill="url(#slateGradient)" />
49
+ <line x1="839.9" y1="241" x2="839.9" y2="265" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
50
+ <text x="1164.0" y="257.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">4.13s · p95 4.33s</text>
51
+ <text x="54.0" y="291.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-pgadmin</text>
52
+ <rect x="300" y="278" width="548.0" height="18" rx="4" fill="url(#slateGradient)" />
53
+ <line x1="862.7" y1="275" x2="862.7" y2="299" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
54
+ <text x="1164.0" y="291.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">4.58s · p95 5.07s</text>
55
+ <text x="54.0" y="325.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-default</text>
56
+ <rect x="300" y="312" width="552.1" height="18" rx="4" fill="url(#slateGradient)" />
57
+ <line x1="855.8" y1="309" x2="855.8" y2="333" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
58
+ <text x="1164.0" y="325.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">4.71s · p95 4.83s</text>
59
+ <text x="36.0" y="388.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400">supaschema 0.1.0 · Supabase CLI 2.106.0 · Node v24.14.0 · Apple Silicon · 3 iterations</text>
60
+ </svg>
@@ -0,0 +1,86 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="454" viewBox="0 0 1200 454" role="img">
2
+ <defs>
3
+ <linearGradient id="supaGradient" x1="0" y1="0" x2="1" y2="0">
4
+ <stop offset="0%" stop-color="#059669" />
5
+ <stop offset="100%" stop-color="#34d399" />
6
+ </linearGradient>
7
+ <linearGradient id="slateGradient" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0%" stop-color="#3b4757" />
9
+ <stop offset="100%" stop-color="#526079" />
10
+ </linearGradient>
11
+ </defs>
12
+ <rect width="100%" height="100%" rx="14" fill="#0b1220" />
13
+ <text x="36.0" y="46.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="21" font-weight="700">Verification &amp; accuracy — realistic fixture (50 tables)</text>
14
+ <text x="36.0" y="70.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12.5" font-weight="400">Each generated migration is applied in one transaction, applied again, and the catalog is fingerprinted against the target.</text>
15
+ <text x="36.0" y="88.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12.5" font-weight="400">Output F1 scores generated SQL content against the fixture's ground-truth change manifest (1.000 = exact).</text>
16
+ <text x="490.0" y="116.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">applies once</text>
17
+ <text x="670.0" y="116.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">applies twice</text>
18
+ <text x="850.0" y="116.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">matches target</text>
19
+ <text x="1045.0" y="116.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">output F1</text>
20
+ <circle cx="41" cy="143" r="4" fill="#34d399" />
21
+ <text x="54.0" y="147.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="650">supaschema-db</text>
22
+ <rect x="430" y="132" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
23
+ <text x="490.0" y="147.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
24
+ <rect x="610" y="132" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
25
+ <text x="670.0" y="147.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
26
+ <rect x="790" y="132" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
27
+ <text x="850.0" y="147.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
28
+ <rect x="985" y="132" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
29
+ <text x="1045.0" y="147.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">1.000</text>
30
+ <circle cx="41" cy="181" r="4" fill="#34d399" />
31
+ <text x="54.0" y="185.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="650">supaschema-file</text>
32
+ <rect x="430" y="170" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
33
+ <text x="490.0" y="185.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
34
+ <rect x="610" y="170" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
35
+ <text x="670.0" y="185.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
36
+ <rect x="790" y="170" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
37
+ <text x="850.0" y="185.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
38
+ <rect x="985" y="170" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
39
+ <text x="1045.0" y="185.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">1.000</text>
40
+ <text x="54.0" y="223.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-default</text>
41
+ <rect x="430" y="208" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
42
+ <text x="490.0" y="223.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
43
+ <rect x="610" y="208" width="120" height="23" rx="11.5" fill="rgba(239,68,68,0.12)" stroke="#ef4444" stroke-opacity="0.55" />
44
+ <text x="670.0" y="223.5" fill="#f87171" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✗ 0/3</text>
45
+ <rect x="790" y="208" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
46
+ <text x="850.0" y="223.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
47
+ <rect x="985" y="208" width="120" height="23" rx="11.5" fill="rgba(251,191,36,0.12)" stroke="#fbbf24" stroke-opacity="0.55" />
48
+ <text x="1045.0" y="223.5" fill="#fbbf24" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">0.982</text>
49
+ <text x="54.0" y="261.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-migra</text>
50
+ <rect x="430" y="246" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
51
+ <text x="490.0" y="261.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
52
+ <rect x="610" y="246" width="120" height="23" rx="11.5" fill="rgba(239,68,68,0.12)" stroke="#ef4444" stroke-opacity="0.55" />
53
+ <text x="670.0" y="261.5" fill="#f87171" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✗ 0/3</text>
54
+ <rect x="790" y="246" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
55
+ <text x="850.0" y="261.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
56
+ <rect x="985" y="246" width="120" height="23" rx="11.5" fill="rgba(251,191,36,0.12)" stroke="#fbbf24" stroke-opacity="0.55" />
57
+ <text x="1045.0" y="261.5" fill="#fbbf24" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">0.982</text>
58
+ <text x="54.0" y="299.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-pg-delta</text>
59
+ <rect x="430" y="284" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
60
+ <text x="490.0" y="299.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
61
+ <rect x="610" y="284" width="120" height="23" rx="11.5" fill="rgba(239,68,68,0.12)" stroke="#ef4444" stroke-opacity="0.55" />
62
+ <text x="670.0" y="299.5" fill="#f87171" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✗ 0/3</text>
63
+ <rect x="790" y="284" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
64
+ <text x="850.0" y="299.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
65
+ <rect x="985" y="284" width="120" height="23" rx="11.5" fill="rgba(251,191,36,0.12)" stroke="#fbbf24" stroke-opacity="0.55" />
66
+ <text x="1045.0" y="299.5" fill="#fbbf24" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">0.982</text>
67
+ <text x="54.0" y="337.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-pg-schema</text>
68
+ <rect x="430" y="322" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
69
+ <text x="490.0" y="337.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
70
+ <rect x="610" y="322" width="120" height="23" rx="11.5" fill="rgba(239,68,68,0.12)" stroke="#ef4444" stroke-opacity="0.55" />
71
+ <text x="670.0" y="337.5" fill="#f87171" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✗ 0/3</text>
72
+ <rect x="790" y="322" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
73
+ <text x="850.0" y="337.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
74
+ <rect x="985" y="322" width="120" height="23" rx="11.5" fill="rgba(251,191,36,0.12)" stroke="#fbbf24" stroke-opacity="0.55" />
75
+ <text x="1045.0" y="337.5" fill="#fbbf24" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">0.982</text>
76
+ <text x="54.0" y="375.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-pgadmin</text>
77
+ <rect x="430" y="360" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
78
+ <text x="490.0" y="375.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
79
+ <rect x="610" y="360" width="120" height="23" rx="11.5" fill="rgba(239,68,68,0.12)" stroke="#ef4444" stroke-opacity="0.55" />
80
+ <text x="670.0" y="375.5" fill="#f87171" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✗ 0/3</text>
81
+ <rect x="790" y="360" width="120" height="23" rx="11.5" fill="rgba(16,185,129,0.14)" stroke="#10b981" stroke-opacity="0.55" />
82
+ <text x="850.0" y="375.5" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">✓ 3/3</text>
83
+ <rect x="985" y="360" width="120" height="23" rx="11.5" fill="rgba(251,191,36,0.12)" stroke="#fbbf24" stroke-opacity="0.55" />
84
+ <text x="1045.0" y="375.5" fill="#fbbf24" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11.5" font-weight="600" text-anchor="middle">0.982</text>
85
+ <text x="36.0" y="432.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400">supaschema 0.1.0 · Supabase CLI 2.106.0 · Node v24.14.0 · Apple Silicon · 3 iterations</text>
86
+ </svg>
@@ -0,0 +1,60 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="410" viewBox="0 0 1200 410" role="img">
2
+ <defs>
3
+ <linearGradient id="supaGradient" x1="0" y1="0" x2="1" y2="0">
4
+ <stop offset="0%" stop-color="#059669" />
5
+ <stop offset="100%" stop-color="#34d399" />
6
+ </linearGradient>
7
+ <linearGradient id="slateGradient" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0%" stop-color="#3b4757" />
9
+ <stop offset="100%" stop-color="#526079" />
10
+ </linearGradient>
11
+ </defs>
12
+ <rect width="100%" height="100%" rx="14" fill="#0b1220" />
13
+ <text x="36.0" y="46.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="21" font-weight="700">Diff latency — realistic fixture (50 tables)</text>
14
+ <text x="36.0" y="70.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12.5" font-weight="400">Median seconds per diff, log scale · whisker marks p95 · lower is better</text>
15
+ <line x1="300.0" y1="94" x2="300.0" y2="336" stroke="#1e293b" stroke-width="1" />
16
+ <text x="300.0" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">0.10s</text>
17
+ <line x1="399.3" y1="94" x2="399.3" y2="336" stroke="#1e293b" stroke-width="1" />
18
+ <text x="399.3" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">0.20s</text>
19
+ <line x1="530.7" y1="94" x2="530.7" y2="336" stroke="#1e293b" stroke-width="1" />
20
+ <text x="530.7" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">0.50s</text>
21
+ <line x1="630.0" y1="94" x2="630.0" y2="336" stroke="#1e293b" stroke-width="1" />
22
+ <text x="630.0" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">1.00s</text>
23
+ <line x1="729.3" y1="94" x2="729.3" y2="336" stroke="#1e293b" stroke-width="1" />
24
+ <text x="729.3" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">2.00s</text>
25
+ <line x1="860.7" y1="94" x2="860.7" y2="336" stroke="#1e293b" stroke-width="1" />
26
+ <text x="860.7" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">5.00s</text>
27
+ <line x1="960.0" y1="94" x2="960.0" y2="336" stroke="#1e293b" stroke-width="1" />
28
+ <text x="960.0" y="358.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">10.0s</text>
29
+ <circle cx="41" cy="117" r="4" fill="#34d399" />
30
+ <text x="54.0" y="121.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="650">supaschema-db</text>
31
+ <rect x="300" y="108" width="124.3" height="18" rx="4" fill="url(#supaGradient)" />
32
+ <line x1="424.9" y1="105" x2="424.9" y2="129" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
33
+ <text x="1164.0" y="121.0" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="650" text-anchor="end">0.24s · p95 0.24s</text>
34
+ <circle cx="41" cy="151" r="4" fill="#34d399" />
35
+ <text x="54.0" y="155.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="650">supaschema-file</text>
36
+ <rect x="300" y="142" width="129.6" height="18" rx="4" fill="url(#supaGradient)" />
37
+ <line x1="435.8" y1="139" x2="435.8" y2="163" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
38
+ <text x="1164.0" y="155.0" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="650" text-anchor="end">0.25s · p95 0.26s</text>
39
+ <text x="54.0" y="189.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-pgadmin</text>
40
+ <rect x="300" y="176" width="543.5" height="18" rx="4" fill="url(#slateGradient)" />
41
+ <line x1="867.2" y1="173" x2="867.2" y2="197" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
42
+ <text x="1164.0" y="189.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">4.44s · p95 5.23s</text>
43
+ <text x="54.0" y="223.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-pg-schema</text>
44
+ <rect x="300" y="210" width="555.8" height="18" rx="4" fill="url(#slateGradient)" />
45
+ <line x1="863.6" y1="207" x2="863.6" y2="231" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
46
+ <text x="1164.0" y="223.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">4.83s · p95 5.10s</text>
47
+ <text x="54.0" y="257.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-pg-delta</text>
48
+ <rect x="300" y="244" width="563.4" height="18" rx="4" fill="url(#slateGradient)" />
49
+ <line x1="874.8" y1="241" x2="874.8" y2="265" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
50
+ <text x="1164.0" y="257.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">5.10s · p95 5.52s</text>
51
+ <text x="54.0" y="291.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-default</text>
52
+ <rect x="300" y="278" width="567.2" height="18" rx="4" fill="url(#slateGradient)" />
53
+ <line x1="868.4" y1="275" x2="868.4" y2="299" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
54
+ <text x="1164.0" y="291.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">5.24s · p95 5.28s</text>
55
+ <text x="54.0" y="325.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="13" font-weight="450">supabase-migra</text>
56
+ <rect x="300" y="312" width="570.9" height="18" rx="4" fill="url(#slateGradient)" />
57
+ <line x1="893.2" y1="309" x2="893.2" y2="333" stroke="#f8fafc" stroke-opacity="0.55" stroke-width="2" />
58
+ <text x="1164.0" y="325.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450" text-anchor="end">5.37s · p95 6.27s</text>
59
+ <text x="36.0" y="388.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400">supaschema 0.1.0 · Supabase CLI 2.106.0 · Node v24.14.0 · Apple Silicon · 3 iterations</text>
60
+ </svg>
@@ -0,0 +1,106 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="560" viewBox="0 0 1200 560" role="img">
2
+ <defs>
3
+ <linearGradient id="supaGradient" x1="0" y1="0" x2="1" y2="0">
4
+ <stop offset="0%" stop-color="#059669" />
5
+ <stop offset="100%" stop-color="#34d399" />
6
+ </linearGradient>
7
+ <linearGradient id="slateGradient" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0%" stop-color="#3b4757" />
9
+ <stop offset="100%" stop-color="#526079" />
10
+ </linearGradient>
11
+ </defs>
12
+ <rect width="100%" height="100%" rx="14" fill="#0b1220" />
13
+ <text x="36.0" y="46.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="21" font-weight="700">Diff latency vs schema size</text>
14
+ <text x="36.0" y="70.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12.5" font-weight="400">Median seconds per diff at each fixture scale, log scale · lower is better</text>
15
+ <line x1="96" y1="474.0" x2="910" y2="474.0" stroke="#1e293b" stroke-width="1" />
16
+ <text x="84.0" y="478.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">0.10s</text>
17
+ <line x1="96" y1="447.1" x2="910" y2="447.1" stroke="#1e293b" stroke-width="1" />
18
+ <text x="84.0" y="451.1" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">0.20s</text>
19
+ <line x1="96" y1="411.4" x2="910" y2="411.4" stroke="#1e293b" stroke-width="1" />
20
+ <text x="84.0" y="415.4" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">0.50s</text>
21
+ <line x1="96" y1="384.5" x2="910" y2="384.5" stroke="#1e293b" stroke-width="1" />
22
+ <text x="84.0" y="388.5" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">1.00s</text>
23
+ <line x1="96" y1="357.6" x2="910" y2="357.6" stroke="#1e293b" stroke-width="1" />
24
+ <text x="84.0" y="361.6" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">2.00s</text>
25
+ <line x1="96" y1="321.9" x2="910" y2="321.9" stroke="#1e293b" stroke-width="1" />
26
+ <text x="84.0" y="325.9" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">5.00s</text>
27
+ <line x1="96" y1="295.0" x2="910" y2="295.0" stroke="#1e293b" stroke-width="1" />
28
+ <text x="84.0" y="299.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">10.0s</text>
29
+ <line x1="96" y1="268.1" x2="910" y2="268.1" stroke="#1e293b" stroke-width="1" />
30
+ <text x="84.0" y="272.1" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">20.0s</text>
31
+ <line x1="96" y1="232.4" x2="910" y2="232.4" stroke="#1e293b" stroke-width="1" />
32
+ <text x="84.0" y="236.4" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">50.0s</text>
33
+ <line x1="96" y1="205.5" x2="910" y2="205.5" stroke="#1e293b" stroke-width="1" />
34
+ <text x="84.0" y="209.5" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">100s</text>
35
+ <line x1="96" y1="178.6" x2="910" y2="178.6" stroke="#1e293b" stroke-width="1" />
36
+ <text x="84.0" y="182.6" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">200s</text>
37
+ <line x1="96" y1="142.9" x2="910" y2="142.9" stroke="#1e293b" stroke-width="1" />
38
+ <text x="84.0" y="146.9" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">500s</text>
39
+ <line x1="96" y1="116.0" x2="910" y2="116.0" stroke="#1e293b" stroke-width="1" />
40
+ <text x="84.0" y="120.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">1000s</text>
41
+ <text x="96.0" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">additive</text>
42
+ <text x="96.0" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">1 table</text>
43
+ <text x="299.5" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">functions-policies</text>
44
+ <text x="299.5" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">1 table</text>
45
+ <text x="503.0" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">realistic</text>
46
+ <text x="503.0" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">50 tables</text>
47
+ <text x="706.5" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">xl</text>
48
+ <text x="706.5" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">1,000 tables</text>
49
+ <text x="910.0" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">xxl</text>
50
+ <text x="910.0" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">2,500 tables</text>
51
+ <path d="M96.0,438.2 L299.5,436.0 L503.0,440.3 L706.5,364.7 L910.0,346.7" fill="none" stroke="#34d399" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" />
52
+ <circle cx="96.0" cy="438.2" r="4.5" fill="#34d399" />
53
+ <circle cx="299.5" cy="436.0" r="4.5" fill="#34d399" />
54
+ <circle cx="503.0" cy="440.3" r="4.5" fill="#34d399" />
55
+ <circle cx="706.5" cy="364.7" r="4.5" fill="#34d399" />
56
+ <circle cx="910.0" cy="346.7" r="4.5" fill="#34d399" />
57
+ <path d="M96.0,445.7 L299.5,444.8 L503.0,438.9 L706.5,371.3 L910.0,339.7" fill="none" stroke="#22d3ee" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" />
58
+ <circle cx="96.0" cy="445.7" r="4.5" fill="#22d3ee" />
59
+ <circle cx="299.5" cy="444.8" r="4.5" fill="#22d3ee" />
60
+ <circle cx="503.0" cy="438.9" r="4.5" fill="#22d3ee" />
61
+ <circle cx="706.5" cy="371.3" r="4.5" fill="#22d3ee" />
62
+ <circle cx="910.0" cy="339.7" r="4.5" fill="#22d3ee" />
63
+ <path d="M96.0,329.7 L299.5,324.3 L503.0,320.2 L706.5,238.3 L910.0,175.5" fill="none" stroke="#94a3b8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
64
+ <circle cx="96.0" cy="329.7" r="3.5" fill="#94a3b8" />
65
+ <circle cx="299.5" cy="324.3" r="3.5" fill="#94a3b8" />
66
+ <circle cx="503.0" cy="320.2" r="3.5" fill="#94a3b8" />
67
+ <circle cx="706.5" cy="238.3" r="3.5" fill="#94a3b8" />
68
+ <circle cx="910.0" cy="175.5" r="3.5" fill="#94a3b8" />
69
+ <path d="M96.0,330.3 L299.5,329.4 L503.0,319.2 L706.5,241.9 L910.0,177.2" fill="none" stroke="#7c8aa0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
70
+ <circle cx="96.0" cy="330.3" r="3.5" fill="#7c8aa0" />
71
+ <circle cx="299.5" cy="329.4" r="3.5" fill="#7c8aa0" />
72
+ <circle cx="503.0" cy="319.2" r="3.5" fill="#7c8aa0" />
73
+ <circle cx="706.5" cy="241.9" r="3.5" fill="#7c8aa0" />
74
+ <circle cx="910.0" cy="177.2" r="3.5" fill="#7c8aa0" />
75
+ <path d="M96.0,327.9 L299.5,330.2 L503.0,321.2 L706.5,240.2 L910.0,177.3" fill="none" stroke="#64748b" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
76
+ <circle cx="96.0" cy="327.9" r="3.5" fill="#64748b" />
77
+ <circle cx="299.5" cy="330.2" r="3.5" fill="#64748b" />
78
+ <circle cx="503.0" cy="321.2" r="3.5" fill="#64748b" />
79
+ <circle cx="706.5" cy="240.2" r="3.5" fill="#64748b" />
80
+ <circle cx="910.0" cy="177.3" r="3.5" fill="#64748b" />
81
+ <path d="M96.0,325.7 L299.5,330.3 L503.0,323.3 L706.5,240.2 L910.0,175.4" fill="none" stroke="#8896ab" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
82
+ <circle cx="96.0" cy="325.7" r="3.5" fill="#8896ab" />
83
+ <circle cx="299.5" cy="330.3" r="3.5" fill="#8896ab" />
84
+ <circle cx="503.0" cy="323.3" r="3.5" fill="#8896ab" />
85
+ <circle cx="706.5" cy="240.2" r="3.5" fill="#8896ab" />
86
+ <circle cx="910.0" cy="175.4" r="3.5" fill="#8896ab" />
87
+ <path d="M96.0,329.9 L299.5,325.4 L503.0,326.6 L706.5,239.3 L910.0,176.4" fill="none" stroke="#566379" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
88
+ <circle cx="96.0" cy="329.9" r="3.5" fill="#566379" />
89
+ <circle cx="299.5" cy="325.4" r="3.5" fill="#566379" />
90
+ <circle cx="503.0" cy="326.6" r="3.5" fill="#566379" />
91
+ <circle cx="706.5" cy="239.3" r="3.5" fill="#566379" />
92
+ <circle cx="910.0" cy="176.4" r="3.5" fill="#566379" />
93
+ <text x="938.0" y="175.4" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-pg-schema 217s</text>
94
+ <line x1="916" y1="175.5" x2="934" y2="189.4" stroke="#94a3b8" stroke-opacity="0.45" stroke-width="1" />
95
+ <text x="938.0" y="193.4" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-default 216s</text>
96
+ <line x1="916" y1="176.4" x2="934" y2="207.4" stroke="#566379" stroke-opacity="0.45" stroke-width="1" />
97
+ <text x="938.0" y="211.4" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-pgadmin 211s</text>
98
+ <line x1="916" y1="177.2" x2="934" y2="225.4" stroke="#7c8aa0" stroke-opacity="0.45" stroke-width="1" />
99
+ <text x="938.0" y="229.4" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-migra 207s</text>
100
+ <line x1="916" y1="177.3" x2="934" y2="243.4" stroke="#64748b" stroke-opacity="0.45" stroke-width="1" />
101
+ <text x="938.0" y="247.4" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-pg-delta 207s</text>
102
+ <text x="938.0" y="339.7" fill="#22d3ee" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="650">supaschema-file 3.17s</text>
103
+ <line x1="916" y1="346.7" x2="934" y2="353.7" stroke="#34d399" stroke-opacity="0.45" stroke-width="1" />
104
+ <text x="938.0" y="357.7" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="650">supaschema-db 2.64s</text>
105
+ <text x="36.0" y="538.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400">supaschema 0.1.0 · Supabase CLI 2.106.0 · Node v24.14.0 · Apple Silicon · 1–3 iterations per fixture</text>
106
+ </svg>
@@ -0,0 +1,98 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="560" viewBox="0 0 1200 560" role="img">
2
+ <defs>
3
+ <linearGradient id="supaGradient" x1="0" y1="0" x2="1" y2="0">
4
+ <stop offset="0%" stop-color="#059669" />
5
+ <stop offset="100%" stop-color="#34d399" />
6
+ </linearGradient>
7
+ <linearGradient id="slateGradient" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0%" stop-color="#3b4757" />
9
+ <stop offset="100%" stop-color="#526079" />
10
+ </linearGradient>
11
+ </defs>
12
+ <rect width="100%" height="100%" rx="14" fill="#0b1220" />
13
+ <text x="36.0" y="46.0" fill="#f8fafc" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="21" font-weight="700">Full workflow: migration + regenerated types</text>
14
+ <text x="36.0" y="70.0" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12.5" font-weight="400">supaschema: one diff = migration + TS types + Zod · Supabase engines: db diff + apply + gen types · log scale</text>
15
+ <line x1="96" y1="474.0" x2="910" y2="474.0" stroke="#1e293b" stroke-width="1" />
16
+ <text x="84.0" y="478.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">0.10s</text>
17
+ <line x1="96" y1="447.1" x2="910" y2="447.1" stroke="#1e293b" stroke-width="1" />
18
+ <text x="84.0" y="451.1" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">0.20s</text>
19
+ <line x1="96" y1="411.4" x2="910" y2="411.4" stroke="#1e293b" stroke-width="1" />
20
+ <text x="84.0" y="415.4" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">0.50s</text>
21
+ <line x1="96" y1="384.5" x2="910" y2="384.5" stroke="#1e293b" stroke-width="1" />
22
+ <text x="84.0" y="388.5" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">1.00s</text>
23
+ <line x1="96" y1="357.6" x2="910" y2="357.6" stroke="#1e293b" stroke-width="1" />
24
+ <text x="84.0" y="361.6" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">2.00s</text>
25
+ <line x1="96" y1="321.9" x2="910" y2="321.9" stroke="#1e293b" stroke-width="1" />
26
+ <text x="84.0" y="325.9" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">5.00s</text>
27
+ <line x1="96" y1="295.0" x2="910" y2="295.0" stroke="#1e293b" stroke-width="1" />
28
+ <text x="84.0" y="299.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">10.0s</text>
29
+ <line x1="96" y1="268.1" x2="910" y2="268.1" stroke="#1e293b" stroke-width="1" />
30
+ <text x="84.0" y="272.1" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">20.0s</text>
31
+ <line x1="96" y1="232.4" x2="910" y2="232.4" stroke="#1e293b" stroke-width="1" />
32
+ <text x="84.0" y="236.4" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">50.0s</text>
33
+ <line x1="96" y1="205.5" x2="910" y2="205.5" stroke="#1e293b" stroke-width="1" />
34
+ <text x="84.0" y="209.5" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">100s</text>
35
+ <line x1="96" y1="178.6" x2="910" y2="178.6" stroke="#1e293b" stroke-width="1" />
36
+ <text x="84.0" y="182.6" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">200s</text>
37
+ <line x1="96" y1="142.9" x2="910" y2="142.9" stroke="#1e293b" stroke-width="1" />
38
+ <text x="84.0" y="146.9" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">500s</text>
39
+ <line x1="96" y1="116.0" x2="910" y2="116.0" stroke="#1e293b" stroke-width="1" />
40
+ <text x="84.0" y="120.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="end">1000s</text>
41
+ <text x="96.0" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">additive</text>
42
+ <text x="96.0" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">1 table</text>
43
+ <text x="299.5" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">functions-policies</text>
44
+ <text x="299.5" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">1 table</text>
45
+ <text x="503.0" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">realistic</text>
46
+ <text x="503.0" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">50 tables</text>
47
+ <text x="706.5" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">xl</text>
48
+ <text x="706.5" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">1,000 tables</text>
49
+ <text x="910.0" y="500.0" fill="#e2e8f0" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="550" text-anchor="middle">xxl</text>
50
+ <text x="910.0" y="518.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400" text-anchor="middle">2,500 tables</text>
51
+ <path d="M96.0,439.3 L299.5,440.8 L503.0,436.3 L706.5,353.0 L910.0,320.3" fill="none" stroke="#34d399" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" />
52
+ <circle cx="96.0" cy="439.3" r="4.5" fill="#34d399" />
53
+ <circle cx="299.5" cy="440.8" r="4.5" fill="#34d399" />
54
+ <circle cx="503.0" cy="436.3" r="4.5" fill="#34d399" />
55
+ <circle cx="706.5" cy="353.0" r="4.5" fill="#34d399" />
56
+ <circle cx="910.0" cy="320.3" r="4.5" fill="#34d399" />
57
+ <path d="M96.0,313.8 L299.5,316.9 L503.0,309.8 L706.5,232.1 L910.0,174.7" fill="none" stroke="#94a3b8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
58
+ <circle cx="96.0" cy="313.8" r="3.5" fill="#94a3b8" />
59
+ <circle cx="299.5" cy="316.9" r="3.5" fill="#94a3b8" />
60
+ <circle cx="503.0" cy="309.8" r="3.5" fill="#94a3b8" />
61
+ <circle cx="706.5" cy="232.1" r="3.5" fill="#94a3b8" />
62
+ <circle cx="910.0" cy="174.7" r="3.5" fill="#94a3b8" />
63
+ <path d="M96.0,316.3 L299.5,316.7 L503.0,309.4 L706.5,236.7 L910.0,175.0" fill="none" stroke="#7c8aa0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
64
+ <circle cx="96.0" cy="316.3" r="3.5" fill="#7c8aa0" />
65
+ <circle cx="299.5" cy="316.7" r="3.5" fill="#7c8aa0" />
66
+ <circle cx="503.0" cy="309.4" r="3.5" fill="#7c8aa0" />
67
+ <circle cx="706.5" cy="236.7" r="3.5" fill="#7c8aa0" />
68
+ <circle cx="910.0" cy="175.0" r="3.5" fill="#7c8aa0" />
69
+ <path d="M96.0,313.4 L299.5,314.4 L503.0,312.5 L706.5,236.2 L910.0,173.4" fill="none" stroke="#64748b" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
70
+ <circle cx="96.0" cy="313.4" r="3.5" fill="#64748b" />
71
+ <circle cx="299.5" cy="314.4" r="3.5" fill="#64748b" />
72
+ <circle cx="503.0" cy="312.5" r="3.5" fill="#64748b" />
73
+ <circle cx="706.5" cy="236.2" r="3.5" fill="#64748b" />
74
+ <circle cx="910.0" cy="173.4" r="3.5" fill="#64748b" />
75
+ <path d="M96.0,311.6 L299.5,313.8 L503.0,311.2 L706.5,236.1 L910.0,173.2" fill="none" stroke="#8896ab" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
76
+ <circle cx="96.0" cy="311.6" r="3.5" fill="#8896ab" />
77
+ <circle cx="299.5" cy="313.8" r="3.5" fill="#8896ab" />
78
+ <circle cx="503.0" cy="311.2" r="3.5" fill="#8896ab" />
79
+ <circle cx="706.5" cy="236.1" r="3.5" fill="#8896ab" />
80
+ <circle cx="910.0" cy="173.2" r="3.5" fill="#8896ab" />
81
+ <path d="M96.0,303.3 L299.5,315.2 L503.0,305.9 L706.5,234.7 L910.0,176.2" fill="none" stroke="#566379" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.75" />
82
+ <circle cx="96.0" cy="303.3" r="3.5" fill="#566379" />
83
+ <circle cx="299.5" cy="315.2" r="3.5" fill="#566379" />
84
+ <circle cx="503.0" cy="305.9" r="3.5" fill="#566379" />
85
+ <circle cx="706.5" cy="234.7" r="3.5" fill="#566379" />
86
+ <circle cx="910.0" cy="176.2" r="3.5" fill="#566379" />
87
+ <text x="938.0" y="173.2" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-pg-schema-workflow 230s</text>
88
+ <line x1="916" y1="173.4" x2="934" y2="187.2" stroke="#64748b" stroke-opacity="0.45" stroke-width="1" />
89
+ <text x="938.0" y="191.2" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-pg-delta-workflow 229s</text>
90
+ <line x1="916" y1="174.7" x2="934" y2="205.2" stroke="#94a3b8" stroke-opacity="0.45" stroke-width="1" />
91
+ <text x="938.0" y="209.2" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-default-workflow 221s</text>
92
+ <line x1="916" y1="175.0" x2="934" y2="223.2" stroke="#7c8aa0" stroke-opacity="0.45" stroke-width="1" />
93
+ <text x="938.0" y="227.2" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-migra-workflow 219s</text>
94
+ <line x1="916" y1="176.2" x2="934" y2="241.2" stroke="#566379" stroke-opacity="0.45" stroke-width="1" />
95
+ <text x="938.0" y="245.2" fill="#94a3b8" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="450">supabase-pgadmin-workflow 213s</text>
96
+ <text x="938.0" y="320.3" fill="#34d399" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="12" font-weight="650">supaschema-workflow 5.22s</text>
97
+ <text x="36.0" y="538.0" fill="#64748b" font-family="ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif" font-size="11" font-weight="400">supaschema 0.1.0 · Supabase CLI 2.106.0 · Node v24.14.0 · Apple Silicon · 1–3 iterations per fixture</text>
98
+ </svg>