@vasfal/vellum 0.1.0

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 (441) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +15 -0
  3. package/.next/build/56416d4ae4ce586f.js +6 -0
  4. package/.next/build/56416d4ae4ce586f.js.map +5 -0
  5. package/.next/build/chunks/[root-of-the-server]__0oj80bi._.js +206 -0
  6. package/.next/build/chunks/[root-of-the-server]__0oj80bi._.js.map +8 -0
  7. package/.next/build/chunks/[root-of-the-server]__1f933tp._.js +500 -0
  8. package/.next/build/chunks/[root-of-the-server]__1f933tp._.js.map +11 -0
  9. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0b7xl6g._.js +13 -0
  10. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0b7xl6g._.js.map +5 -0
  11. package/.next/build/chunks/[turbopack]_runtime.js +890 -0
  12. package/.next/build/chunks/[turbopack]_runtime.js.map +11 -0
  13. package/.next/build/chunks/node_modules_20v-8wl._.js +6832 -0
  14. package/.next/build/chunks/node_modules_20v-8wl._.js.map +47 -0
  15. package/.next/build/package.json +1 -0
  16. package/.next/build-manifest.json +21 -0
  17. package/.next/cache/.previewinfo +1 -0
  18. package/.next/cache/.rscinfo +1 -0
  19. package/.next/cache/.tsbuildinfo +1 -0
  20. package/.next/diagnostics/build-diagnostics.json +6 -0
  21. package/.next/diagnostics/framework.json +1 -0
  22. package/.next/diagnostics/route-bundle-stats.json +111 -0
  23. package/.next/export-marker.json +6 -0
  24. package/.next/fallback-build-manifest.json +13 -0
  25. package/.next/images-manifest.json +68 -0
  26. package/.next/next-minimal-server.js.nft.json +1 -0
  27. package/.next/next-server.js.nft.json +1 -0
  28. package/.next/package.json +1 -0
  29. package/.next/prerender-manifest.json +186 -0
  30. package/.next/required-server-files.js +334 -0
  31. package/.next/required-server-files.json +334 -0
  32. package/.next/routes-manifest.json +126 -0
  33. package/.next/server/app/(app)/page/app-paths-manifest.json +3 -0
  34. package/.next/server/app/(app)/page/build-manifest.json +17 -0
  35. package/.next/server/app/(app)/page/next-font-manifest.json +11 -0
  36. package/.next/server/app/(app)/page/react-loadable-manifest.json +1 -0
  37. package/.next/server/app/(app)/page/server-reference-manifest.json +4 -0
  38. package/.next/server/app/(app)/page.js +15 -0
  39. package/.next/server/app/(app)/page.js.map +5 -0
  40. package/.next/server/app/(app)/page.js.nft.json +1 -0
  41. package/.next/server/app/(app)/page_client-reference-manifest.js +3 -0
  42. package/.next/server/app/(app)/session/[name]/page/app-paths-manifest.json +3 -0
  43. package/.next/server/app/(app)/session/[name]/page/build-manifest.json +17 -0
  44. package/.next/server/app/(app)/session/[name]/page/next-font-manifest.json +11 -0
  45. package/.next/server/app/(app)/session/[name]/page/react-loadable-manifest.json +1 -0
  46. package/.next/server/app/(app)/session/[name]/page/server-reference-manifest.json +4 -0
  47. package/.next/server/app/(app)/session/[name]/page.js +15 -0
  48. package/.next/server/app/(app)/session/[name]/page.js.map +5 -0
  49. package/.next/server/app/(app)/session/[name]/page.js.nft.json +1 -0
  50. package/.next/server/app/(app)/session/[name]/page_client-reference-manifest.js +3 -0
  51. package/.next/server/app/(app)/settings/key/page/app-paths-manifest.json +3 -0
  52. package/.next/server/app/(app)/settings/key/page/build-manifest.json +17 -0
  53. package/.next/server/app/(app)/settings/key/page/next-font-manifest.json +11 -0
  54. package/.next/server/app/(app)/settings/key/page/react-loadable-manifest.json +1 -0
  55. package/.next/server/app/(app)/settings/key/page/server-reference-manifest.json +4 -0
  56. package/.next/server/app/(app)/settings/key/page.js +15 -0
  57. package/.next/server/app/(app)/settings/key/page.js.map +5 -0
  58. package/.next/server/app/(app)/settings/key/page.js.nft.json +1 -0
  59. package/.next/server/app/(app)/settings/key/page_client-reference-manifest.js +3 -0
  60. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  61. package/.next/server/app/_global-error/page/build-manifest.json +17 -0
  62. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  63. package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  64. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  65. package/.next/server/app/_global-error/page.js +9 -0
  66. package/.next/server/app/_global-error/page.js.map +5 -0
  67. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  68. package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  69. package/.next/server/app/_global-error.html +1 -0
  70. package/.next/server/app/_global-error.meta +15 -0
  71. package/.next/server/app/_global-error.rsc +14 -0
  72. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  73. package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
  74. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  75. package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  76. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  77. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  78. package/.next/server/app/_not-found/page/build-manifest.json +17 -0
  79. package/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  80. package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  81. package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  82. package/.next/server/app/_not-found/page.js +13 -0
  83. package/.next/server/app/_not-found/page.js.map +5 -0
  84. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  85. package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
  86. package/.next/server/app/_not-found.html +1 -0
  87. package/.next/server/app/_not-found.meta +16 -0
  88. package/.next/server/app/_not-found.rsc +18 -0
  89. package/.next/server/app/_not-found.segments/_full.segment.rsc +18 -0
  90. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  91. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -0
  92. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  93. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  94. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  95. package/.next/server/app/api/analyze/route/app-paths-manifest.json +3 -0
  96. package/.next/server/app/api/analyze/route/build-manifest.json +9 -0
  97. package/.next/server/app/api/analyze/route/server-reference-manifest.json +4 -0
  98. package/.next/server/app/api/analyze/route.js +9 -0
  99. package/.next/server/app/api/analyze/route.js.map +5 -0
  100. package/.next/server/app/api/analyze/route.js.nft.json +1 -0
  101. package/.next/server/app/api/analyze/route_client-reference-manifest.js +3 -0
  102. package/.next/server/app/api/key/route/app-paths-manifest.json +3 -0
  103. package/.next/server/app/api/key/route/build-manifest.json +9 -0
  104. package/.next/server/app/api/key/route/server-reference-manifest.json +4 -0
  105. package/.next/server/app/api/key/route.js +8 -0
  106. package/.next/server/app/api/key/route.js.map +5 -0
  107. package/.next/server/app/api/key/route.js.nft.json +1 -0
  108. package/.next/server/app/api/key/route_client-reference-manifest.js +3 -0
  109. package/.next/server/app/api/key-status/route/app-paths-manifest.json +3 -0
  110. package/.next/server/app/api/key-status/route/build-manifest.json +9 -0
  111. package/.next/server/app/api/key-status/route/server-reference-manifest.json +4 -0
  112. package/.next/server/app/api/key-status/route.js +7 -0
  113. package/.next/server/app/api/key-status/route.js.map +5 -0
  114. package/.next/server/app/api/key-status/route.js.nft.json +1 -0
  115. package/.next/server/app/api/key-status/route_client-reference-manifest.js +3 -0
  116. package/.next/server/app/api/models/route/app-paths-manifest.json +3 -0
  117. package/.next/server/app/api/models/route/build-manifest.json +9 -0
  118. package/.next/server/app/api/models/route/server-reference-manifest.json +4 -0
  119. package/.next/server/app/api/models/route.js +7 -0
  120. package/.next/server/app/api/models/route.js.map +5 -0
  121. package/.next/server/app/api/models/route.js.nft.json +1 -0
  122. package/.next/server/app/api/models/route_client-reference-manifest.js +3 -0
  123. package/.next/server/app/api/revise/route/app-paths-manifest.json +3 -0
  124. package/.next/server/app/api/revise/route/build-manifest.json +9 -0
  125. package/.next/server/app/api/revise/route/server-reference-manifest.json +4 -0
  126. package/.next/server/app/api/revise/route.js +8 -0
  127. package/.next/server/app/api/revise/route.js.map +5 -0
  128. package/.next/server/app/api/revise/route.js.nft.json +1 -0
  129. package/.next/server/app/api/revise/route_client-reference-manifest.js +3 -0
  130. package/.next/server/app/icon.svg/route/app-paths-manifest.json +3 -0
  131. package/.next/server/app/icon.svg/route/build-manifest.json +9 -0
  132. package/.next/server/app/icon.svg/route.js +7 -0
  133. package/.next/server/app/icon.svg/route.js.map +5 -0
  134. package/.next/server/app/icon.svg/route.js.nft.json +1 -0
  135. package/.next/server/app/icon.svg.body +7 -0
  136. package/.next/server/app/icon.svg.meta +1 -0
  137. package/.next/server/app/index.html +1 -0
  138. package/.next/server/app/index.meta +15 -0
  139. package/.next/server/app/index.rsc +31 -0
  140. package/.next/server/app/index.segments/!KGFwcCk/__PAGE__.segment.rsc +9 -0
  141. package/.next/server/app/index.segments/!KGFwcCk.segment.rsc +10 -0
  142. package/.next/server/app/index.segments/_full.segment.rsc +31 -0
  143. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  144. package/.next/server/app/index.segments/_index.segment.rsc +7 -0
  145. package/.next/server/app/index.segments/_tree.segment.rsc +4 -0
  146. package/.next/server/app/record-test/page/app-paths-manifest.json +3 -0
  147. package/.next/server/app/record-test/page/build-manifest.json +17 -0
  148. package/.next/server/app/record-test/page/next-font-manifest.json +11 -0
  149. package/.next/server/app/record-test/page/react-loadable-manifest.json +1 -0
  150. package/.next/server/app/record-test/page/server-reference-manifest.json +4 -0
  151. package/.next/server/app/record-test/page.js +14 -0
  152. package/.next/server/app/record-test/page.js.map +5 -0
  153. package/.next/server/app/record-test/page.js.nft.json +1 -0
  154. package/.next/server/app/record-test/page_client-reference-manifest.js +3 -0
  155. package/.next/server/app/record-test.html +7 -0
  156. package/.next/server/app/record-test.meta +15 -0
  157. package/.next/server/app/record-test.rsc +24 -0
  158. package/.next/server/app/record-test.segments/_full.segment.rsc +24 -0
  159. package/.next/server/app/record-test.segments/_head.segment.rsc +6 -0
  160. package/.next/server/app/record-test.segments/_index.segment.rsc +7 -0
  161. package/.next/server/app/record-test.segments/_tree.segment.rsc +4 -0
  162. package/.next/server/app/record-test.segments/record-test/__PAGE__.segment.rsc +9 -0
  163. package/.next/server/app/record-test.segments/record-test.segment.rsc +5 -0
  164. package/.next/server/app/settings/key.html +1 -0
  165. package/.next/server/app/settings/key.meta +17 -0
  166. package/.next/server/app/settings/key.rsc +35 -0
  167. package/.next/server/app/settings/key.segments/!KGFwcCk/settings/key/__PAGE__.segment.rsc +8 -0
  168. package/.next/server/app/settings/key.segments/!KGFwcCk/settings/key.segment.rsc +5 -0
  169. package/.next/server/app/settings/key.segments/!KGFwcCk/settings.segment.rsc +5 -0
  170. package/.next/server/app/settings/key.segments/!KGFwcCk.segment.rsc +10 -0
  171. package/.next/server/app/settings/key.segments/_full.segment.rsc +35 -0
  172. package/.next/server/app/settings/key.segments/_head.segment.rsc +6 -0
  173. package/.next/server/app/settings/key.segments/_index.segment.rsc +7 -0
  174. package/.next/server/app/settings/key.segments/_tree.segment.rsc +4 -0
  175. package/.next/server/app/styleguide/page/app-paths-manifest.json +3 -0
  176. package/.next/server/app/styleguide/page/build-manifest.json +17 -0
  177. package/.next/server/app/styleguide/page/next-font-manifest.json +11 -0
  178. package/.next/server/app/styleguide/page/react-loadable-manifest.json +1 -0
  179. package/.next/server/app/styleguide/page/server-reference-manifest.json +4 -0
  180. package/.next/server/app/styleguide/page.js +15 -0
  181. package/.next/server/app/styleguide/page.js.map +5 -0
  182. package/.next/server/app/styleguide/page.js.nft.json +1 -0
  183. package/.next/server/app/styleguide/page_client-reference-manifest.js +3 -0
  184. package/.next/server/app/styleguide.html +1 -0
  185. package/.next/server/app/styleguide.meta +15 -0
  186. package/.next/server/app/styleguide.rsc +72 -0
  187. package/.next/server/app/styleguide.segments/_full.segment.rsc +72 -0
  188. package/.next/server/app/styleguide.segments/_head.segment.rsc +6 -0
  189. package/.next/server/app/styleguide.segments/_index.segment.rsc +7 -0
  190. package/.next/server/app/styleguide.segments/_tree.segment.rsc +4 -0
  191. package/.next/server/app/styleguide.segments/styleguide/__PAGE__.segment.rsc +60 -0
  192. package/.next/server/app/styleguide.segments/styleguide.segment.rsc +5 -0
  193. package/.next/server/app-paths-manifest.json +15 -0
  194. package/.next/server/chunks/[externals]__1l0bqbz._.js +3 -0
  195. package/.next/server/chunks/[externals]__1l0bqbz._.js.map +1 -0
  196. package/.next/server/chunks/[root-of-the-server]__00u0a0m._.js +3 -0
  197. package/.next/server/chunks/[root-of-the-server]__00u0a0m._.js.map +1 -0
  198. package/.next/server/chunks/[root-of-the-server]__02oblj7._.js +3 -0
  199. package/.next/server/chunks/[root-of-the-server]__02oblj7._.js.map +1 -0
  200. package/.next/server/chunks/[root-of-the-server]__04dzkv1._.js +3 -0
  201. package/.next/server/chunks/[root-of-the-server]__04dzkv1._.js.map +1 -0
  202. package/.next/server/chunks/[root-of-the-server]__081zp1m._.js +3 -0
  203. package/.next/server/chunks/[root-of-the-server]__081zp1m._.js.map +1 -0
  204. package/.next/server/chunks/[root-of-the-server]__0dkua3v._.js +3 -0
  205. package/.next/server/chunks/[root-of-the-server]__0dkua3v._.js.map +1 -0
  206. package/.next/server/chunks/[root-of-the-server]__0ezil_h._.js +3 -0
  207. package/.next/server/chunks/[root-of-the-server]__0ezil_h._.js.map +1 -0
  208. package/.next/server/chunks/[root-of-the-server]__0ww_12a._.js +3 -0
  209. package/.next/server/chunks/[root-of-the-server]__0ww_12a._.js.map +1 -0
  210. package/.next/server/chunks/[root-of-the-server]__0x-kpif._.js +3 -0
  211. package/.next/server/chunks/[root-of-the-server]__0x-kpif._.js.map +1 -0
  212. package/.next/server/chunks/[root-of-the-server]__15bjnu5._.js +3 -0
  213. package/.next/server/chunks/[root-of-the-server]__15bjnu5._.js.map +1 -0
  214. package/.next/server/chunks/[root-of-the-server]__1kmbnvv._.js +3 -0
  215. package/.next/server/chunks/[root-of-the-server]__1kmbnvv._.js.map +1 -0
  216. package/.next/server/chunks/[root-of-the-server]__1kp4vwc._.js +14 -0
  217. package/.next/server/chunks/[root-of-the-server]__1kp4vwc._.js.map +1 -0
  218. package/.next/server/chunks/[root-of-the-server]__1lbd3kd._.js +3 -0
  219. package/.next/server/chunks/[root-of-the-server]__1lbd3kd._.js.map +1 -0
  220. package/.next/server/chunks/[root-of-the-server]__1ra6psc._.js +3 -0
  221. package/.next/server/chunks/[root-of-the-server]__1ra6psc._.js.map +1 -0
  222. package/.next/server/chunks/[root-of-the-server]__1zn977r._.js +3 -0
  223. package/.next/server/chunks/[root-of-the-server]__1zn977r._.js.map +1 -0
  224. package/.next/server/chunks/[turbopack]_runtime.js +903 -0
  225. package/.next/server/chunks/[turbopack]_runtime.js.map +11 -0
  226. package/.next/server/chunks/_04h1cv_._.js +185 -0
  227. package/.next/server/chunks/_04h1cv_._.js.map +1 -0
  228. package/.next/server/chunks/_0pqmhjh._.js +185 -0
  229. package/.next/server/chunks/_0pqmhjh._.js.map +1 -0
  230. package/.next/server/chunks/_next-internal_server_app_api_analyze_route_actions_0lx-23h.js +3 -0
  231. package/.next/server/chunks/_next-internal_server_app_api_analyze_route_actions_0lx-23h.js.map +1 -0
  232. package/.next/server/chunks/_next-internal_server_app_api_key-status_route_actions_1qgztm2.js +3 -0
  233. package/.next/server/chunks/_next-internal_server_app_api_key-status_route_actions_1qgztm2.js.map +1 -0
  234. package/.next/server/chunks/_next-internal_server_app_api_key_route_actions_15n2qsb.js +3 -0
  235. package/.next/server/chunks/_next-internal_server_app_api_key_route_actions_15n2qsb.js.map +1 -0
  236. package/.next/server/chunks/_next-internal_server_app_api_models_route_actions_1h6mkqp.js +3 -0
  237. package/.next/server/chunks/_next-internal_server_app_api_models_route_actions_1h6mkqp.js.map +1 -0
  238. package/.next/server/chunks/_next-internal_server_app_api_revise_route_actions_19kk3m-.js +3 -0
  239. package/.next/server/chunks/_next-internal_server_app_api_revise_route_actions_19kk3m-.js.map +1 -0
  240. package/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_1r2h_ub.js +3 -0
  241. package/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_1r2h_ub.js.map +1 -0
  242. package/.next/server/chunks/node_modules_0x51oh_._.js +10 -0
  243. package/.next/server/chunks/node_modules_0x51oh_._.js.map +1 -0
  244. package/.next/server/chunks/node_modules_19bvt3l._.js +6 -0
  245. package/.next/server/chunks/node_modules_19bvt3l._.js.map +1 -0
  246. package/.next/server/chunks/node_modules_1_-az43._.js +16 -0
  247. package/.next/server/chunks/node_modules_1_-az43._.js.map +1 -0
  248. package/.next/server/chunks/node_modules_1t2pqct._.js +10 -0
  249. package/.next/server/chunks/node_modules_1t2pqct._.js.map +1 -0
  250. package/.next/server/chunks/node_modules_next_08s853w._.js +13 -0
  251. package/.next/server/chunks/node_modules_next_08s853w._.js.map +1 -0
  252. package/.next/server/chunks/node_modules_node-fetch_src_index_1gf-_pn.js +3 -0
  253. package/.next/server/chunks/node_modules_node-fetch_src_index_1gf-_pn.js.map +1 -0
  254. package/.next/server/chunks/ssr/[externals]__1l0bqbz._.js +3 -0
  255. package/.next/server/chunks/ssr/[externals]__1l0bqbz._.js.map +1 -0
  256. package/.next/server/chunks/ssr/[root-of-the-server]__06ync7f._.js +3 -0
  257. package/.next/server/chunks/ssr/[root-of-the-server]__06ync7f._.js.map +1 -0
  258. package/.next/server/chunks/ssr/[root-of-the-server]__0hml-pd._.js +3 -0
  259. package/.next/server/chunks/ssr/[root-of-the-server]__0hml-pd._.js.map +1 -0
  260. package/.next/server/chunks/ssr/[root-of-the-server]__0ntia6u._.js +3 -0
  261. package/.next/server/chunks/ssr/[root-of-the-server]__0ntia6u._.js.map +1 -0
  262. package/.next/server/chunks/ssr/[root-of-the-server]__0sdpd0o._.js +3 -0
  263. package/.next/server/chunks/ssr/[root-of-the-server]__0sdpd0o._.js.map +1 -0
  264. package/.next/server/chunks/ssr/[root-of-the-server]__0w2pa_y._.js +33 -0
  265. package/.next/server/chunks/ssr/[root-of-the-server]__0w2pa_y._.js.map +1 -0
  266. package/.next/server/chunks/ssr/[root-of-the-server]__10y0-wv._.js +3 -0
  267. package/.next/server/chunks/ssr/[root-of-the-server]__10y0-wv._.js.map +1 -0
  268. package/.next/server/chunks/ssr/[root-of-the-server]__11_7weu._.js +3 -0
  269. package/.next/server/chunks/ssr/[root-of-the-server]__11_7weu._.js.map +1 -0
  270. package/.next/server/chunks/ssr/[root-of-the-server]__1_stkwn._.js +3 -0
  271. package/.next/server/chunks/ssr/[root-of-the-server]__1_stkwn._.js.map +1 -0
  272. package/.next/server/chunks/ssr/[root-of-the-server]__1dky4g0._.js +33 -0
  273. package/.next/server/chunks/ssr/[root-of-the-server]__1dky4g0._.js.map +1 -0
  274. package/.next/server/chunks/ssr/[root-of-the-server]__1k6ey-q._.js +3 -0
  275. package/.next/server/chunks/ssr/[root-of-the-server]__1k6ey-q._.js.map +1 -0
  276. package/.next/server/chunks/ssr/[root-of-the-server]__1la73u1._.js +3 -0
  277. package/.next/server/chunks/ssr/[root-of-the-server]__1la73u1._.js.map +1 -0
  278. package/.next/server/chunks/ssr/[root-of-the-server]__1nshnxm._.js +3 -0
  279. package/.next/server/chunks/ssr/[root-of-the-server]__1nshnxm._.js.map +1 -0
  280. package/.next/server/chunks/ssr/[root-of-the-server]__1pssg49._.js +3 -0
  281. package/.next/server/chunks/ssr/[root-of-the-server]__1pssg49._.js.map +1 -0
  282. package/.next/server/chunks/ssr/[root-of-the-server]__1q6zd30._.js +3 -0
  283. package/.next/server/chunks/ssr/[root-of-the-server]__1q6zd30._.js.map +1 -0
  284. package/.next/server/chunks/ssr/[root-of-the-server]__1qlmg27._.js +3 -0
  285. package/.next/server/chunks/ssr/[root-of-the-server]__1qlmg27._.js.map +1 -0
  286. package/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
  287. package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +11 -0
  288. package/.next/server/chunks/ssr/_01pksvc._.js +78 -0
  289. package/.next/server/chunks/ssr/_01pksvc._.js.map +1 -0
  290. package/.next/server/chunks/ssr/_03lgii8._.js +3 -0
  291. package/.next/server/chunks/ssr/_03lgii8._.js.map +1 -0
  292. package/.next/server/chunks/ssr/_05tft_r._.js +3 -0
  293. package/.next/server/chunks/ssr/_05tft_r._.js.map +1 -0
  294. package/.next/server/chunks/ssr/_06gt995._.js +3 -0
  295. package/.next/server/chunks/ssr/_06gt995._.js.map +1 -0
  296. package/.next/server/chunks/ssr/_0jrh37c._.js +46 -0
  297. package/.next/server/chunks/ssr/_0jrh37c._.js.map +1 -0
  298. package/.next/server/chunks/ssr/_0kw6yq_._.js +3 -0
  299. package/.next/server/chunks/ssr/_0kw6yq_._.js.map +1 -0
  300. package/.next/server/chunks/ssr/_0l3c05z._.js +3 -0
  301. package/.next/server/chunks/ssr/_0l3c05z._.js.map +1 -0
  302. package/.next/server/chunks/ssr/_0n-ojw-._.js +3 -0
  303. package/.next/server/chunks/ssr/_0n-ojw-._.js.map +1 -0
  304. package/.next/server/chunks/ssr/_0t6a1ln._.js +6 -0
  305. package/.next/server/chunks/ssr/_0t6a1ln._.js.map +1 -0
  306. package/.next/server/chunks/ssr/_0td-xk-._.js +3 -0
  307. package/.next/server/chunks/ssr/_0td-xk-._.js.map +1 -0
  308. package/.next/server/chunks/ssr/_0y92f-y._.js +46 -0
  309. package/.next/server/chunks/ssr/_0y92f-y._.js.map +1 -0
  310. package/.next/server/chunks/ssr/_1b6au28._.js +3 -0
  311. package/.next/server/chunks/ssr/_1b6au28._.js.map +1 -0
  312. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_page_actions_1gxdy57.js +3 -0
  313. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_page_actions_1gxdy57.js.map +1 -0
  314. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_session_[name]_page_actions_115d_ja.js +3 -0
  315. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_session_[name]_page_actions_115d_ja.js.map +1 -0
  316. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_settings_key_page_actions_1jsc3or.js +3 -0
  317. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_settings_key_page_actions_1jsc3or.js.map +1 -0
  318. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js +3 -0
  319. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js.map +1 -0
  320. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js +3 -0
  321. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js.map +1 -0
  322. package/.next/server/chunks/ssr/_next-internal_server_app_record-test_page_actions_0a_yofw.js +3 -0
  323. package/.next/server/chunks/ssr/_next-internal_server_app_record-test_page_actions_0a_yofw.js.map +1 -0
  324. package/.next/server/chunks/ssr/_next-internal_server_app_styleguide_page_actions_174h7x7.js +3 -0
  325. package/.next/server/chunks/ssr/_next-internal_server_app_styleguide_page_actions_174h7x7.js.map +1 -0
  326. package/.next/server/chunks/ssr/node_modules_0el53_h._.js +10 -0
  327. package/.next/server/chunks/ssr/node_modules_0el53_h._.js.map +1 -0
  328. package/.next/server/chunks/ssr/node_modules_0h91jdk._.js +33 -0
  329. package/.next/server/chunks/ssr/node_modules_0h91jdk._.js.map +1 -0
  330. package/.next/server/chunks/ssr/node_modules_1fxqp22._.js +10 -0
  331. package/.next/server/chunks/ssr/node_modules_1fxqp22._.js.map +1 -0
  332. package/.next/server/chunks/ssr/node_modules_1loo6j7._.js +6 -0
  333. package/.next/server/chunks/ssr/node_modules_1loo6j7._.js.map +1 -0
  334. package/.next/server/chunks/ssr/node_modules_1pvqj0r._.js +3 -0
  335. package/.next/server/chunks/ssr/node_modules_1pvqj0r._.js.map +1 -0
  336. package/.next/server/chunks/ssr/node_modules_next_dist_0uboya6._.js +6 -0
  337. package/.next/server/chunks/ssr/node_modules_next_dist_0uboya6._.js.map +1 -0
  338. package/.next/server/chunks/ssr/node_modules_next_dist_172hvm-._.js +19 -0
  339. package/.next/server/chunks/ssr/node_modules_next_dist_172hvm-._.js.map +1 -0
  340. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +3 -0
  341. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js.map +1 -0
  342. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +3 -0
  343. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js.map +1 -0
  344. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0-o-goa.js +3 -0
  345. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0-o-goa.js.map +1 -0
  346. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +3 -0
  347. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js.map +1 -0
  348. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_q50sh.js +4 -0
  349. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_q50sh.js.map +1 -0
  350. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_xbpm0.js +4 -0
  351. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_xbpm0.js.map +1 -0
  352. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_119i6eu.js +4 -0
  353. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_119i6eu.js.map +1 -0
  354. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_14nl2rs.js +4 -0
  355. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_14nl2rs.js.map +1 -0
  356. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_18u8k23.js +4 -0
  357. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_18u8k23.js.map +1 -0
  358. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19--w_z.js +4 -0
  359. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19--w_z.js.map +1 -0
  360. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1_iwj0a.js +4 -0
  361. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1_iwj0a.js.map +1 -0
  362. package/.next/server/chunks/ssr/node_modules_node-fetch_src_index_1e0t9p6.js +3 -0
  363. package/.next/server/chunks/ssr/node_modules_node-fetch_src_index_1e0t9p6.js.map +1 -0
  364. package/.next/server/chunks/ssr/src_19oqe9t._.js +3 -0
  365. package/.next/server/chunks/ssr/src_19oqe9t._.js.map +1 -0
  366. package/.next/server/chunks/ssr/src_app_record-test_page_tsx_08-2bld._.js +9 -0
  367. package/.next/server/chunks/ssr/src_app_record-test_page_tsx_08-2bld._.js.map +1 -0
  368. package/.next/server/chunks/ssr/src_components_app-sidebar_tsx_1xx2k53._.js +3 -0
  369. package/.next/server/chunks/ssr/src_components_app-sidebar_tsx_1xx2k53._.js.map +1 -0
  370. package/.next/server/chunks/ssr/src_components_settings_key-setup_tsx_0jxhnpa._.js +3 -0
  371. package/.next/server/chunks/ssr/src_components_settings_key-setup_tsx_0jxhnpa._.js.map +1 -0
  372. package/.next/server/chunks/ssr/src_components_ui_0lq7ewx._.js +3 -0
  373. package/.next/server/chunks/ssr/src_components_ui_0lq7ewx._.js.map +1 -0
  374. package/.next/server/functions-config-manifest.json +10 -0
  375. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  376. package/.next/server/middleware-build-manifest.js +21 -0
  377. package/.next/server/middleware-manifest.json +6 -0
  378. package/.next/server/next-font-manifest.js +1 -0
  379. package/.next/server/next-font-manifest.json +31 -0
  380. package/.next/server/pages/404.html +1 -0
  381. package/.next/server/pages/500.html +1 -0
  382. package/.next/server/pages-manifest.json +4 -0
  383. package/.next/server/prefetch-hints.json +1 -0
  384. package/.next/server/server-reference-manifest.js +1 -0
  385. package/.next/server/server-reference-manifest.json +5 -0
  386. package/.next/static/CIZxngYjzUw1Kb0KrE473/_buildManifest.js +11 -0
  387. package/.next/static/CIZxngYjzUw1Kb0KrE473/_clientMiddlewareManifest.js +1 -0
  388. package/.next/static/CIZxngYjzUw1Kb0KrE473/_ssgManifest.js +1 -0
  389. package/.next/static/chunks/05-c3ty_6dwfk.js +1 -0
  390. package/.next/static/chunks/07-hzktxqjvzd.js +4 -0
  391. package/.next/static/chunks/09bn0buuu6k2x.js +1 -0
  392. package/.next/static/chunks/0cz1d0mv5g_q7.js +1 -0
  393. package/.next/static/chunks/0kkimqpuecvfn.js +1 -0
  394. package/.next/static/chunks/0mk1g55o6kl1e.js +2 -0
  395. package/.next/static/chunks/0ul837-9k0zx_.js +63 -0
  396. package/.next/static/chunks/0wpges32btt_p.js +1 -0
  397. package/.next/static/chunks/18qo-4_hfuwko.js +1 -0
  398. package/.next/static/chunks/1_dsevxz78b97.js +1 -0
  399. package/.next/static/chunks/2-oqhnxovgl_2.js +44 -0
  400. package/.next/static/chunks/2et_7fxuzt9cq.js +31 -0
  401. package/.next/static/chunks/2im7c515bo69p.js +1 -0
  402. package/.next/static/chunks/2merpuxt1zcvf.js +1 -0
  403. package/.next/static/chunks/2qb8lge1e2sv2.js +1 -0
  404. package/.next/static/chunks/2sj0gufu0lojq.css +3 -0
  405. package/.next/static/chunks/2zloaj9ja_vpy.js +1 -0
  406. package/.next/static/chunks/3rvy2rc9d_hwt.js +1 -0
  407. package/.next/static/chunks/3uci2qhsbp444.js +50 -0
  408. package/.next/static/chunks/3yao5u25-bf0g.js +1 -0
  409. package/.next/static/chunks/41_0qs6kjmoek.js +1 -0
  410. package/.next/static/chunks/4395sbjm36lbl.js +1 -0
  411. package/.next/static/chunks/turbopack-2cevjmbuh84ft.js +1 -0
  412. package/.next/static/media/1bffadaabf893a1e-s.3-6t-g6q0vh0a.woff2 +0 -0
  413. package/.next/static/media/2bbe8d2671613f1f-s.0k62hbripvv8p.woff2 +0 -0
  414. package/.next/static/media/2c55a0e60120577a-s.0-dom-5bn10r2.woff2 +0 -0
  415. package/.next/static/media/4fa387ec64143e14-s.2tuy5pz7dlieh.woff2 +0 -0
  416. package/.next/static/media/5476f68d60460930-s.2uwcyprjm3xu3.woff2 +0 -0
  417. package/.next/static/media/5ce348bf30bf5439-s.31988l_ccedte.woff2 +0 -0
  418. package/.next/static/media/6306c77e7c8268e4-s.2dbetqa9o8jxf.woff2 +0 -0
  419. package/.next/static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2 +0 -0
  420. package/.next/static/media/7d817b4c03b0c5f1-s.1uyisp29ctx0d.woff2 +0 -0
  421. package/.next/static/media/83afe278b6a6bb3c-s.p.2bn3s6zvc0dyp.woff2 +0 -0
  422. package/.next/static/media/9c72aa0f40e4eef8-s.1y4-pdgsjb-pw.woff2 +0 -0
  423. package/.next/static/media/ad66f9afd8947f86-s.3lvt2whj97whp.woff2 +0 -0
  424. package/.next/static/media/bbc41e54d2fcbd21-s.1rgnod-3esatf.woff2 +0 -0
  425. package/.next/static/media/icon.2_sgat73yt9an.svg +7 -0
  426. package/.next/trace +1 -0
  427. package/.next/trace-build +1 -0
  428. package/.next/turbopack +0 -0
  429. package/.next/types/cache-life.d.ts +145 -0
  430. package/.next/types/routes.d.ts +81 -0
  431. package/.next/types/validator.ts +160 -0
  432. package/LICENSE +21 -0
  433. package/README.md +146 -0
  434. package/bin/vellum.mjs +193 -0
  435. package/next.config.ts +19 -0
  436. package/package.json +72 -0
  437. package/public/file.svg +1 -0
  438. package/public/globe.svg +1 -0
  439. package/public/next.svg +1 -0
  440. package/public/vercel.svg +1 -0
  441. package/public/window.svg +1 -0
@@ -0,0 +1,160 @@
1
+ // This file is generated automatically by Next.js
2
+ // Do not edit this file manually
3
+ // This file validates that all pages and layouts export the correct types
4
+
5
+ import type { AppRoutes, LayoutRoutes, ParamMap, AppRouteHandlerRoutes } from "./routes.js"
6
+ import type { ResolvingMetadata, ResolvingViewport } from "next/types.js"
7
+ import type { NextRequest } from 'next/server.js'
8
+
9
+ type AppPageConfig<Route extends AppRoutes = AppRoutes> = {
10
+ default: React.ComponentType<{ params: Promise<ParamMap[Route]> } & any> | ((props: { params: Promise<ParamMap[Route]> } & any) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
11
+ generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
12
+ generateMetadata?: (
13
+ props: { params: Promise<ParamMap[Route]> } & any,
14
+ parent: ResolvingMetadata
15
+ ) => Promise<any> | any
16
+ generateViewport?: (
17
+ props: { params: Promise<ParamMap[Route]> } & any,
18
+ parent: ResolvingViewport
19
+ ) => Promise<any> | any
20
+ metadata?: any
21
+ viewport?: any
22
+ }
23
+
24
+ type LayoutConfig<Route extends LayoutRoutes = LayoutRoutes> = {
25
+ default: React.ComponentType<LayoutProps<Route>> | ((props: LayoutProps<Route>) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
26
+ generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
27
+ generateMetadata?: (
28
+ props: { params: Promise<ParamMap[Route]> } & any,
29
+ parent: ResolvingMetadata
30
+ ) => Promise<any> | any
31
+ generateViewport?: (
32
+ props: { params: Promise<ParamMap[Route]> } & any,
33
+ parent: ResolvingViewport
34
+ ) => Promise<any> | any
35
+ metadata?: any
36
+ viewport?: any
37
+ }
38
+
39
+ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRoutes> = {
40
+ GET?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
41
+ POST?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
42
+ PUT?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
43
+ PATCH?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
44
+ DELETE?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
45
+ HEAD?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
46
+ OPTIONS?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
47
+ }
48
+
49
+
50
+ // Validate ../../src/app/(app)/page.tsx
51
+ {
52
+ type __IsExpected<Specific extends AppPageConfig<"/">> = Specific
53
+ const handler = {} as typeof import("../../src/app/(app)/page.js")
54
+ type __Check = __IsExpected<typeof handler>
55
+ // @ts-ignore
56
+ type __Unused = __Check
57
+ }
58
+
59
+ // Validate ../../src/app/(app)/session/[name]/page.tsx
60
+ {
61
+ type __IsExpected<Specific extends AppPageConfig<"/session/[name]">> = Specific
62
+ const handler = {} as typeof import("../../src/app/(app)/session/[name]/page.js")
63
+ type __Check = __IsExpected<typeof handler>
64
+ // @ts-ignore
65
+ type __Unused = __Check
66
+ }
67
+
68
+ // Validate ../../src/app/(app)/settings/key/page.tsx
69
+ {
70
+ type __IsExpected<Specific extends AppPageConfig<"/settings/key">> = Specific
71
+ const handler = {} as typeof import("../../src/app/(app)/settings/key/page.js")
72
+ type __Check = __IsExpected<typeof handler>
73
+ // @ts-ignore
74
+ type __Unused = __Check
75
+ }
76
+
77
+ // Validate ../../src/app/record-test/page.tsx
78
+ {
79
+ type __IsExpected<Specific extends AppPageConfig<"/record-test">> = Specific
80
+ const handler = {} as typeof import("../../src/app/record-test/page.js")
81
+ type __Check = __IsExpected<typeof handler>
82
+ // @ts-ignore
83
+ type __Unused = __Check
84
+ }
85
+
86
+ // Validate ../../src/app/styleguide/page.tsx
87
+ {
88
+ type __IsExpected<Specific extends AppPageConfig<"/styleguide">> = Specific
89
+ const handler = {} as typeof import("../../src/app/styleguide/page.js")
90
+ type __Check = __IsExpected<typeof handler>
91
+ // @ts-ignore
92
+ type __Unused = __Check
93
+ }
94
+
95
+ // Validate ../../src/app/api/analyze/route.ts
96
+ {
97
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/analyze">> = Specific
98
+ const handler = {} as typeof import("../../src/app/api/analyze/route.js")
99
+ type __Check = __IsExpected<typeof handler>
100
+ // @ts-ignore
101
+ type __Unused = __Check
102
+ }
103
+
104
+ // Validate ../../src/app/api/key-status/route.ts
105
+ {
106
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/key-status">> = Specific
107
+ const handler = {} as typeof import("../../src/app/api/key-status/route.js")
108
+ type __Check = __IsExpected<typeof handler>
109
+ // @ts-ignore
110
+ type __Unused = __Check
111
+ }
112
+
113
+ // Validate ../../src/app/api/key/route.ts
114
+ {
115
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/key">> = Specific
116
+ const handler = {} as typeof import("../../src/app/api/key/route.js")
117
+ type __Check = __IsExpected<typeof handler>
118
+ // @ts-ignore
119
+ type __Unused = __Check
120
+ }
121
+
122
+ // Validate ../../src/app/api/models/route.ts
123
+ {
124
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/models">> = Specific
125
+ const handler = {} as typeof import("../../src/app/api/models/route.js")
126
+ type __Check = __IsExpected<typeof handler>
127
+ // @ts-ignore
128
+ type __Unused = __Check
129
+ }
130
+
131
+ // Validate ../../src/app/api/revise/route.ts
132
+ {
133
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/revise">> = Specific
134
+ const handler = {} as typeof import("../../src/app/api/revise/route.js")
135
+ type __Check = __IsExpected<typeof handler>
136
+ // @ts-ignore
137
+ type __Unused = __Check
138
+ }
139
+
140
+
141
+
142
+
143
+
144
+ // Validate ../../src/app/(app)/layout.tsx
145
+ {
146
+ type __IsExpected<Specific extends LayoutConfig<"/">> = Specific
147
+ const handler = {} as typeof import("../../src/app/(app)/layout.js")
148
+ type __Check = __IsExpected<typeof handler>
149
+ // @ts-ignore
150
+ type __Unused = __Check
151
+ }
152
+
153
+ // Validate ../../src/app/layout.tsx
154
+ {
155
+ type __IsExpected<Specific extends LayoutConfig<"/">> = Specific
156
+ const handler = {} as typeof import("../../src/app/layout.js")
157
+ type __Check = __IsExpected<typeof handler>
158
+ // @ts-ignore
159
+ type __Unused = __Check
160
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vasyl Falach
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,146 @@
1
+ # Vellum
2
+
3
+ > Think out loud over your screen. Vellum turns the recording into a structured report — every point you made, timestamped, screenshotted, and sorted into tasks.
4
+
5
+ The best reviews happen out loud: you point at something and say what's wrong with it — then it vanishes into a screen recording nobody rewatches. Vellum keeps the substance instead. Talk through the work, and get back a clean, actionable report — problems, ideas, questions, and decisions, each linked to the exact moment and frame it came from. It runs entirely on your machine, under your own API key: no account, no cloud.
6
+
7
+ Built for design and product reviews — the analysis is tuned for critiquing UI, checking a build against its design, and reviewing docs — but the mechanic works for any spoken walkthrough of a screen.
8
+
9
+ <picture>
10
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/hero-dark.png">
11
+ <img alt="Vellum turns a spoken design review into a structured report — the recording on the left, extracted tasks with timestamps, categories, and priorities on the right" src="docs/assets/hero-light.png">
12
+ </picture>
13
+
14
+ <!-- A short demo GIF of the record → report loop can go here later — see docs/assets/README.md -->
15
+
16
+ ## Before you start — is this for you?
17
+
18
+ Vellum is deliberately narrow. It's a good fit if:
19
+
20
+ - You're on a **Chromium browser** (Chrome, Edge, Arc, Brave). Recording and the floating controls use APIs Firefox and Safari don't support.
21
+ - You're comfortable getting a **free Google AI Studio API key** and pasting it in once. Analysis runs on Gemini under *your* key — there's no hosted service.
22
+ - You want a **single-user, local** tool. Recordings live on your disk; nothing syncs to a cloud.
23
+
24
+ If you need meeting transcription, multi-user collaboration, or a hosted app, Vellum isn't that — see [Scope](#scope).
25
+
26
+ ## Install and run
27
+
28
+ Vellum runs entirely on your machine. The web app is the tool; the `vellum` command just launches it.
29
+
30
+ ```bash
31
+ # Requires Node.js 20+
32
+ npx @vasfal/vellum ui
33
+ ```
34
+
35
+ That starts the local app and opens it in your browser. On first launch it walks you through pasting your Gemini key (stored in `~/.vellum/.env`, never sent anywhere but Google's API at analyze time) and picking a workspace folder for your recordings.
36
+
37
+ <details>
38
+ <summary>Or run from source (for development)</summary>
39
+
40
+ ```bash
41
+ git clone https://github.com/vasfal/vellum.git
42
+ cd vellum
43
+ npm install
44
+ npm run dev # starts on http://localhost:4270
45
+ ```
46
+
47
+ For a global command from a local checkout: `npm link`, then `vellum ui`.
48
+ </details>
49
+
50
+ ## Setting your API key
51
+
52
+ Analysis runs on Google Gemini under *your* key — there's no hosted service and no account. A key is free from [Google AI Studio](https://aistudio.google.com/apikey).
53
+
54
+ **In the app (recommended).** On first launch Vellum shows a prompt to paste your key, validates it, and saves it. You can change or remove it later from the sidebar. This is the path most people should use — no files, no restart.
55
+
56
+ <!-- screenshot: in-app key setup -->
57
+
58
+ **Power users / CLI.** If you'd rather not use the form, Vellum reads the key from the environment, in this order of precedence:
59
+
60
+ 1. An exported `GEMINI_API_KEY` environment variable (wins over everything below).
61
+ 2. `~/.vellum/.env` — the file the in-app form writes to. The launcher (`vellum ui`) loads it at every boot.
62
+ 3. `.env.local` in a source checkout — copy [`.env.example`](.env.example) to `.env.local` and fill in `GEMINI_API_KEY`. Read by `npm run dev`.
63
+
64
+ `.env.example` also documents the optional `GEMINI_MODEL` and `GEMINI_FALLBACK_MODELS` overrides.
65
+
66
+ **Where the key lives.** It's stored only in `~/.vellum/.env` on your machine, written with `0600` permissions (readable by you alone). Vellum never logs it, never echoes it back, and never sends it anywhere but Google's Gemini API at analyze time. See [Privacy](#privacy).
67
+
68
+ ## How it works
69
+
70
+ 1. **Record** — click *New recording*, pick a screen or window, and talk through your review. Floating controls stay above your other windows.
71
+ 2. **Stop** — the recording is saved to your workspace folder as `recording.webm`.
72
+ 3. **Analyze** — click *Analyze*. Vellum uploads the recording to Gemini (under your key), which watches it and pulls out what you said and pointed at.
73
+ 4. **Review** — a few minutes later you get a report: extracted tasks, each with a timestamp, a screenshot of the moment, a category, and a priority. Edit, comment, and re-run as you like.
74
+
75
+ ## What goes into the report
76
+
77
+ For each task Vellum extracts:
78
+
79
+ - A descriptive title and a description with on-screen context
80
+ - A timestamp linking back to the moment in the video
81
+ - A screenshot of the relevant frame
82
+ - A category: `problem` / `idea` / `question` / `decision` / `followup` / `praise`
83
+ - A priority guess
84
+
85
+ Each session is tagged with a `review_type` (UI design, dev-vs-design, documentation, mixed) so the analysis adapts to the kind of review it is.
86
+
87
+ ## Privacy
88
+
89
+ - Recordings live on your local filesystem, in the folder you choose.
90
+ - Only the analyze step sends video to Google (the Gemini API), under your own key.
91
+ - Your API key stays in `~/.vellum/.env` on your machine — it never leaves the local server.
92
+ - No telemetry, no analytics, no servers anyone else controls.
93
+
94
+ ## Your files
95
+
96
+ Each session is a self-contained folder in your workspace:
97
+
98
+ ```
99
+ ~/vellum-sessions/
100
+ ├── .vellum-workspace.json ← marks this folder as a Vellum workspace
101
+ └── 2026-05-19-onboarding-review/
102
+ ├── recording.webm ← the raw recording
103
+ ├── report.md ← the Markdown report
104
+ ├── tasks.json ← structured Gemini output, for re-rendering
105
+ └── screenshots/
106
+ ├── 00-03-42.png
107
+ └── ...
108
+ ```
109
+
110
+ Re-running analysis keeps your history — the latest report is always `report.md`, and previous runs are archived alongside it. Back up a session by copying its folder; share one by zipping it.
111
+
112
+ ## Scope
113
+
114
+ **What Vellum does:** single-user design and product reviews · screen + microphone recording · AI analysis and task extraction · Markdown reports with embedded screenshots.
115
+
116
+ **What it doesn't (and isn't trying to):** meeting transcription · multi-user collaboration · live sharing · cloud sync · recording other people's screens · system-audio capture (microphone only).
117
+
118
+ ## Troubleshooting
119
+
120
+ **The folder picker or floating controls don't work** — you need a Chromium-based browser. The File System Access and Document Picture-in-Picture APIs aren't in Firefox or Safari.
121
+
122
+ **Analysis takes a long time** — Gemini's File API is slower on the first upload of a long video. A 30-minute recording usually finishes in 3–5 minutes; 10+ minutes means something's wrong — check the terminal.
123
+
124
+ **The recording is silent** — grant the browser microphone permission and watch the audio meter while you talk.
125
+
126
+ **Gemini returned odd tasks** — usually poor recording quality (mumbled audio, blank screen). The prompt is tuned for design reviews; other kinds of review may need tuning.
127
+
128
+ ## Contributing
129
+
130
+ Issues and pull requests are welcome — there are templates for both. If you're developing Vellum rather than just using it, start with:
131
+
132
+ - [`ARCHITECTURE.md`](ARCHITECTURE.md) — the current locked state of the system
133
+ - [`DECISIONS.md`](DECISIONS.md) — the architecture decision log
134
+ - [`SCENARIOS.md`](SCENARIOS.md) — the core user scenarios the product supports
135
+
136
+ Vellum is developed with AI assistance; the architecture docs above are the source of truth for how it fits together.
137
+
138
+ ## License
139
+
140
+ [MIT](LICENSE).
141
+
142
+ ## Acknowledgements
143
+
144
+ Built with Next.js, Tailwind, shadcn/ui, Google Gemini, and ffmpeg.
145
+
146
+ The name *Vellum* refers to the thin parchment medieval scribes wrote on — a surface for holding thought.
package/bin/vellum.mjs ADDED
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env node
2
+ // Vellum launcher (TASK-62): `vellum ui` boots the local web app and opens a
3
+ // browser at it. Written as plain ESM on purpose — it runs straight from a
4
+ // published npm package with no tsx/TypeScript step at runtime. The Next app
5
+ // itself is the built `.next` that ships in the tarball; this file is just the
6
+ // front door.
7
+
8
+ import { spawn } from "node:child_process";
9
+ import { createServer } from "node:net";
10
+ import { existsSync, readFileSync } from "node:fs";
11
+ import { fileURLToPath } from "node:url";
12
+ import { dirname, join } from "node:path";
13
+ import { homedir, platform } from "node:os";
14
+ import { createRequire } from "node:module";
15
+
16
+ const require = createRequire(import.meta.url);
17
+ // The package root is the parent of bin/ — where `.next`, `public`, and
18
+ // next.config.ts live, both in a published tarball and in a dev checkout.
19
+ const packageRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
20
+
21
+ const [command = "ui"] = process.argv.slice(2);
22
+
23
+ switch (command) {
24
+ case "ui":
25
+ await runUi();
26
+ break;
27
+ case "analyze":
28
+ // Reserved for TASK-53. Named here so `vellum analyze` fails with a human
29
+ // hint instead of an "unknown command", since docs will mention it.
30
+ console.error(
31
+ "`vellum analyze` isn't available yet — analyze from the web app for now:\n vellum ui\n(The terminal analyze command lands in TASK-53.)",
32
+ );
33
+ process.exit(1);
34
+ break;
35
+ case "-v":
36
+ case "--version":
37
+ console.log(readVersion());
38
+ break;
39
+ case "-h":
40
+ case "--help":
41
+ printHelp();
42
+ break;
43
+ default:
44
+ console.error(`Unknown command: ${command}\n`);
45
+ printHelp();
46
+ process.exit(1);
47
+ }
48
+
49
+ async function runUi() {
50
+ // Load the home-config key (TASK-64 writes it here) so the server sees it. A
51
+ // real process.env value wins, so a dev checkout with .env.local or an
52
+ // exported GEMINI_API_KEY still works.
53
+ loadHomeEnv();
54
+
55
+ const nextBin = require.resolve("next/dist/bin/next");
56
+
57
+ // A production build must exist for `next start`. It ships prebuilt in the
58
+ // published tarball; a dev checkout builds once on first run.
59
+ if (!existsSync(join(packageRoot, ".next"))) {
60
+ console.log("First run — building Vellum (one time, ~a minute)…\n");
61
+ await runToCompletion(nextBin, ["build"]);
62
+ }
63
+
64
+ const port = await freePort(4270);
65
+ const url = `http://localhost:${port}`;
66
+
67
+ const server = spawn(process.execPath, [nextBin, "start", "-p", String(port)], {
68
+ cwd: packageRoot,
69
+ stdio: ["ignore", "inherit", "inherit"],
70
+ env: { ...process.env, NODE_ENV: "production" },
71
+ });
72
+
73
+ // Stop the server cleanly on Ctrl-C so a stray port isn't left held.
74
+ const stop = () => {
75
+ server.kill("SIGINT");
76
+ process.exit(0);
77
+ };
78
+ process.on("SIGINT", stop);
79
+ process.on("SIGTERM", stop);
80
+ server.on("exit", (code) => process.exit(code ?? 0));
81
+
82
+ await waitForServer(url);
83
+ console.log(`\nVellum is running at ${url} — opening your browser.`);
84
+ console.log("Leave this terminal open; press Ctrl-C to stop.\n");
85
+ openBrowser(url);
86
+ }
87
+
88
+ /** Load ~/.vellum/.env into process.env without overriding real env vars. */
89
+ function loadHomeEnv() {
90
+ const envPath = join(homedir(), ".vellum", ".env");
91
+ if (!existsSync(envPath)) return;
92
+ for (const line of readFileSync(envPath, "utf8").split("\n")) {
93
+ const trimmed = line.trim();
94
+ if (!trimmed || trimmed.startsWith("#")) continue;
95
+ const eq = trimmed.indexOf("=");
96
+ if (eq === -1) continue;
97
+ const key = trimmed.slice(0, eq).trim();
98
+ let value = trimmed.slice(eq + 1).trim();
99
+ if (
100
+ (value.startsWith('"') && value.endsWith('"')) ||
101
+ (value.startsWith("'") && value.endsWith("'"))
102
+ ) {
103
+ value = value.slice(1, -1);
104
+ }
105
+ if (key && !(key in process.env)) process.env[key] = value;
106
+ }
107
+ }
108
+
109
+ /** Prefer `preferred`; fall back to an OS-assigned free port if it's taken. */
110
+ function freePort(preferred) {
111
+ return new Promise((resolve) => {
112
+ const probe = createServer();
113
+ probe.once("error", () => resolve(ephemeralPort()));
114
+ probe.listen(preferred, () => probe.close(() => resolve(preferred)));
115
+ });
116
+ }
117
+
118
+ function ephemeralPort() {
119
+ return new Promise((resolve, reject) => {
120
+ const probe = createServer();
121
+ probe.once("error", reject);
122
+ probe.listen(0, () => {
123
+ const { port } = probe.address();
124
+ probe.close(() => resolve(port));
125
+ });
126
+ });
127
+ }
128
+
129
+ /** Poll until the server answers (any HTTP response counts), then return. */
130
+ async function waitForServer(url, timeoutMs = 60_000) {
131
+ const start = Date.now();
132
+ while (Date.now() - start < timeoutMs) {
133
+ try {
134
+ await fetch(url, { method: "HEAD" });
135
+ return;
136
+ } catch {
137
+ await sleep(300);
138
+ }
139
+ }
140
+ throw new Error(`Vellum didn't become ready at ${url} within 60s.`);
141
+ }
142
+
143
+ function openBrowser(url) {
144
+ const os = platform();
145
+ const [cmd, args] =
146
+ os === "darwin"
147
+ ? ["open", [url]]
148
+ : os === "win32"
149
+ ? ["cmd", ["/c", "start", "", url]]
150
+ : ["xdg-open", [url]];
151
+ try {
152
+ spawn(cmd, args, { stdio: "ignore", detached: true }).unref();
153
+ } catch {
154
+ // Non-fatal: the URL is already printed for the user to click.
155
+ }
156
+ }
157
+
158
+ /** Spawn `node <script> <args>` and resolve on a clean exit, reject otherwise. */
159
+ function runToCompletion(script, args) {
160
+ return new Promise((resolve, reject) => {
161
+ const child = spawn(process.execPath, [script, ...args], {
162
+ cwd: packageRoot,
163
+ stdio: "inherit",
164
+ env: { ...process.env, NODE_ENV: "production" },
165
+ });
166
+ child.on("exit", (code) =>
167
+ code === 0 ? resolve() : reject(new Error(`\`next ${args[0]}\` exited with code ${code}.`)),
168
+ );
169
+ });
170
+ }
171
+
172
+ function sleep(ms) {
173
+ return new Promise((resolve) => setTimeout(resolve, ms));
174
+ }
175
+
176
+ function readVersion() {
177
+ const pkg = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"));
178
+ return pkg.version ?? "unknown";
179
+ }
180
+
181
+ function printHelp() {
182
+ console.log(`Vellum — record a design review, get a structured report.
183
+
184
+ Usage:
185
+ vellum ui Launch the local web app and open it in your browser
186
+ vellum analyze (coming soon) Analyze a recording from the terminal
187
+
188
+ vellum --version Print the installed version
189
+ vellum --help Show this help
190
+
191
+ The web app runs entirely on your machine. Recordings never leave your disk;
192
+ only the analyze step sends video to Google Gemini, under your own API key.`);
193
+ }
package/next.config.ts ADDED
@@ -0,0 +1,19 @@
1
+ import type { NextConfig } from "next";
2
+
3
+ const nextConfig: NextConfig = {
4
+ // ffmpeg-static resolves its binary via a __dirname-relative path. Bundling it
5
+ // (Turbopack's default for server code) relocates that path into the build
6
+ // output, so getFfmpegPath() can't find the real binary and /api/analyze's
7
+ // screenshot stage fails. Keeping it external leaves the require() running
8
+ // from node_modules, where the path stays correct. Same reasoning for the
9
+ // Gemini SDK's native/file deps — exclude the packages the API route spawns
10
+ // or streams from disk. (ADR-014: the analyze route runs the Node pipeline.)
11
+ serverExternalPackages: ["ffmpeg-static"],
12
+
13
+ // Vellum is a focused, single-window desktop tool; the floating Next.js dev
14
+ // indicator overlaps the app chrome and reads as noise in an otherwise clean
15
+ // monochrome shell (ADR-004). Hide it — this only affects dev, not the build.
16
+ devIndicators: false,
17
+ };
18
+
19
+ export default nextConfig;
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@vasfal/vellum",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "description": "Think out loud over your screen; Vellum turns the recording into a structured report with timestamps, screenshots, and extracted tasks. Local-first, bring-your-own Gemini key.",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/vasfal/vellum.git"
12
+ },
13
+ "homepage": "https://github.com/vasfal/vellum#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/vasfal/vellum/issues"
16
+ },
17
+ "bin": {
18
+ "vellum": "bin/vellum.mjs"
19
+ },
20
+ "files": [
21
+ "bin",
22
+ ".next",
23
+ "public",
24
+ "next.config.ts"
25
+ ],
26
+ "engines": {
27
+ "node": ">=20"
28
+ },
29
+ "scripts": {
30
+ "dev": "next dev -p 4270",
31
+ "build": "next build",
32
+ "start": "next start",
33
+ "prepack": "rm -rf .next && next build",
34
+ "lint": "eslint",
35
+ "upload": "tsx --env-file-if-exists=.env.local scripts/upload-video.ts",
36
+ "analyze": "tsx --env-file-if-exists=.env.local scripts/analyze-video.ts",
37
+ "cli": "tsx --env-file-if-exists=.env.local scripts/cli.ts",
38
+ "validate:schema": "tsx scripts/validate-schema.ts",
39
+ "extract": "tsx scripts/extract-frames.ts",
40
+ "report": "tsx scripts/write-report.ts"
41
+ },
42
+ "dependencies": {
43
+ "@base-ui/react": "^1.6.0",
44
+ "@google/genai": "^2.10.0",
45
+ "class-variance-authority": "^0.7.1",
46
+ "clsx": "^2.1.1",
47
+ "ffmpeg-static": "^5.3.0",
48
+ "lucide-react": "^1.22.0",
49
+ "next": "16.2.9",
50
+ "next-themes": "^0.4.6",
51
+ "react": "19.2.4",
52
+ "react-dom": "19.2.4",
53
+ "react-markdown": "^10.1.0",
54
+ "remark-gfm": "^4.0.1",
55
+ "shadcn": "^4.12.0",
56
+ "sonner": "^2.0.7",
57
+ "tailwind-merge": "^3.6.0",
58
+ "tw-animate-css": "^1.4.0",
59
+ "zod": "^4.4.3"
60
+ },
61
+ "devDependencies": {
62
+ "@tailwindcss/postcss": "^4",
63
+ "@types/node": "^20.19.43",
64
+ "@types/react": "^19",
65
+ "@types/react-dom": "^19",
66
+ "eslint": "^9",
67
+ "eslint-config-next": "16.2.9",
68
+ "tailwindcss": "^4",
69
+ "tsx": "^4.22.4",
70
+ "typescript": "^5"
71
+ }
72
+ }
@@ -0,0 +1 @@
1
+ <svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>