forgecad 0.6.3 → 0.8.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 (234) hide show
  1. package/README.md +3 -12
  2. package/dist/assets/{AdminPage-CeqCUUgu.js → AdminPage-D4bocK4E.js} +250 -151
  3. package/dist/assets/{BlogPage-P_AJP0v9.js → BlogPage-CJEXL_zJ.js} +94 -70
  4. package/dist/assets/{DocsPage-CKRV2iq2.js → DocsPage-D3A_g8V3.js} +329 -163
  5. package/dist/assets/{EditorApp-CnC2k4cW.css → EditorApp-BWYUSpUN.css} +590 -136
  6. package/dist/assets/EditorApp-Cihhqcsq.js +11692 -0
  7. package/dist/assets/{EmbedViewer-DBlzmQ5i.js → EmbedViewer-kWjKaC_t.js} +2 -4
  8. package/dist/assets/LandingPageProofDriven-Bg2IUc3l.css +856 -0
  9. package/dist/assets/LandingPageProofDriven-DXkKlyhI.js +601 -0
  10. package/dist/assets/PricingPage-BsU5vzEx.js +232 -0
  11. package/dist/assets/{SettingsPage-BqCh9JcC.js → SettingsPage-PqvpAKIs.js} +129 -5
  12. package/dist/assets/{evalWorker-Ql-aKwLA.js → evalWorker-C-hzNUMy.js} +8949 -3161
  13. package/dist/assets/{Viewport-CoB46f5R.js → index-Pz321YAt.js} +38382 -7501
  14. package/dist/assets/{index-2hfs_ub0.css → index-ay13WNfa.css} +726 -53
  15. package/dist/assets/{javascript-DCxGoE5Y.js → javascript-DAl8Gmyo.js} +1 -1
  16. package/dist/assets/{manifold-CqNMHHKO.js → manifold-BcbjWLIo.js} +4 -3
  17. package/dist/assets/{manifold-Cce9wRFz.js → manifold-DBckbFgx.js} +1 -1
  18. package/dist/assets/{manifold-D6BeHIOo.js → manifold-O2AAGXyj.js} +1 -1
  19. package/dist/assets/{reportWorker-sFEFonXf.js → reportWorker-Dxr-5A7w.js} +8760 -3559
  20. package/dist/assets/{vendor-react-Dt7-aaJH.js → vendor-react-CG3i_wp0.js} +65 -8
  21. package/dist/docs/index.html +2 -2
  22. package/dist/docs-raw/CLI.md +341 -718
  23. package/dist/docs-raw/generated/assembly.md +699 -112
  24. package/dist/docs-raw/generated/concepts.md +1834 -1346
  25. package/dist/docs-raw/generated/core.md +1012 -1059
  26. package/dist/docs-raw/generated/curves.md +759 -116
  27. package/dist/docs-raw/generated/lib.md +43 -748
  28. package/dist/docs-raw/generated/output.md +139 -245
  29. package/dist/docs-raw/generated/sdf.md +208 -0
  30. package/dist/docs-raw/generated/sheet-metal.md +473 -21
  31. package/dist/docs-raw/generated/sketch.md +1518 -362
  32. package/dist/docs-raw/generated/viewport.md +368 -299
  33. package/dist/docs-raw/generated/wood.md +104 -0
  34. package/dist/index.html +2 -2
  35. package/dist/landing/proof-ams-adapter.png +0 -0
  36. package/dist/landing/proof-bolt-and-nut.png +0 -0
  37. package/dist/landing/proof-fillet-enclosure.png +0 -0
  38. package/dist/landing/proof-glasses.png +0 -0
  39. package/dist/landing/proof-gyroid.png +0 -0
  40. package/dist/sitemap.xml +6 -6
  41. package/dist-cli/forgecad.js +12321 -5700
  42. package/dist-cli/forgecad.js.map +1 -0
  43. package/dist-cli/solver-46FFSK2U.js +363 -0
  44. package/dist-cli/solver-46FFSK2U.js.map +1 -0
  45. package/dist-skill/CONTEXT.md +4890 -6302
  46. package/dist-skill/SKILL-dev.md +22 -66
  47. package/dist-skill/SKILL.md +20 -59
  48. package/dist-skill/docs/API/core/concepts.md +37 -92
  49. package/dist-skill/docs/CLI.md +341 -718
  50. package/dist-skill/docs/generated/assembly.md +699 -112
  51. package/dist-skill/docs/generated/core.md +1012 -1059
  52. package/dist-skill/docs/generated/curves.md +759 -116
  53. package/dist-skill/docs/generated/lib.md +43 -748
  54. package/dist-skill/docs/generated/output.md +139 -245
  55. package/dist-skill/docs/generated/sdf.md +208 -0
  56. package/dist-skill/docs/generated/sheet-metal.md +473 -21
  57. package/dist-skill/docs/generated/sketch.md +1518 -362
  58. package/dist-skill/docs/generated/viewport.md +368 -299
  59. package/dist-skill/docs/generated/wood.md +104 -0
  60. package/dist-skill/docs/guides/coordinate-system.md +11 -17
  61. package/dist-skill/docs/guides/geometry-conventions.md +13 -70
  62. package/dist-skill/docs/guides/joint-design.md +78 -0
  63. package/dist-skill/docs/guides/modeling-recipes.md +22 -195
  64. package/dist-skill/docs/guides/positioning.md +88 -147
  65. package/dist-skill/docs-dev/API/core/concepts.md +78 -0
  66. package/dist-skill/docs-dev/CLI.md +488 -0
  67. package/dist-skill/{docs → docs-dev}/blueprint-first.md +5 -0
  68. package/dist-skill/{docs → docs-dev}/coding-best-practices.md +6 -8
  69. package/dist-skill/{docs → docs-dev}/coding.md +2 -4
  70. package/dist-skill/docs-dev/component-model.md +164 -0
  71. package/dist-skill/docs-dev/generated/assembly.md +779 -0
  72. package/dist-skill/docs-dev/generated/core.md +1676 -0
  73. package/dist-skill/docs-dev/generated/curves.md +855 -0
  74. package/dist-skill/docs-dev/generated/lib.md +55 -0
  75. package/dist-skill/docs-dev/generated/output.md +234 -0
  76. package/dist-skill/docs-dev/generated/sdf.md +208 -0
  77. package/dist-skill/docs-dev/generated/sheet-metal.md +506 -0
  78. package/dist-skill/docs-dev/generated/sketch.md +1753 -0
  79. package/dist-skill/docs-dev/generated/viewport.md +513 -0
  80. package/dist-skill/docs-dev/generated/wood.md +104 -0
  81. package/dist-skill/docs-dev/guides/coordinate-system.md +46 -0
  82. package/dist-skill/docs-dev/guides/geometry-conventions.md +52 -0
  83. package/dist-skill/docs-dev/guides/joint-design.md +78 -0
  84. package/dist-skill/docs-dev/guides/modeling-recipes.md +77 -0
  85. package/dist-skill/docs-dev/guides/positioning.md +151 -0
  86. package/dist-skill/{docs → docs-dev}/guides/skill-maintenance.md +21 -10
  87. package/dist-skill/{docs → docs-dev}/internals/compiler.md +5 -6
  88. package/dist-skill/{docs → docs-dev}/internals/constraint-solver-quality.md +0 -1
  89. package/dist-skill/{docs → docs-dev}/internals/constraint-solver.md +0 -1
  90. package/dist-skill/{docs → docs-dev}/internals/sketch-2d-pipeline.md +2 -3
  91. package/examples/api/attachTo-basics.forge.js +8 -8
  92. package/examples/api/bill-of-materials.forge.js +9 -9
  93. package/examples/api/bolt-pattern.forge.js +5 -5
  94. package/examples/api/boolean-operations.forge.js +5 -5
  95. package/examples/api/bounding-box-visualizer.forge.js +3 -3
  96. package/examples/api/clone-duplicate.forge.js +2 -2
  97. package/examples/api/colors-union-vs-array.forge.js +6 -6
  98. package/examples/api/connector-assembly.forge.js +8 -6
  99. package/examples/api/connector-basics.forge.js +7 -7
  100. package/examples/api/constrained-sketch-mechanical.forge.js +4 -4
  101. package/examples/api/elbow-test.forge.js +3 -3
  102. package/examples/api/extrude-options.forge.js +8 -14
  103. package/examples/api/feature-created-faces.forge.js +6 -10
  104. package/examples/api/fillet-showcase.forge.js +2 -2
  105. package/examples/api/folded-service-panel-cover.forge.js +2 -2
  106. package/examples/api/gears-tier1.forge.js +5 -5
  107. package/examples/api/group-test.forge.js +3 -3
  108. package/examples/api/group-vs-union.forge.js +1 -1
  109. package/examples/api/highlight-debug.forge.js +4 -0
  110. package/examples/api/js-module-pillars.js +1 -1
  111. package/examples/api/js-module-scene.js +2 -2
  112. package/examples/api/mesh-import-slats.forge.js +4 -4
  113. package/examples/api/patterns.forge.js +3 -3
  114. package/examples/api/pointAlong-orientation.forge.js +3 -3
  115. package/examples/api/profile-2020-b-slot6.forge.js +4 -5
  116. package/examples/api/route-perimeter-flange.forge.js +1 -1
  117. package/examples/api/sdf-rover-demo.forge.js +10 -10
  118. package/examples/api/sketch-on-face-demo.forge.js +2 -2
  119. package/examples/api/sketch-regions.forge.js +4 -4
  120. package/examples/api/sketch-rounding-strategies.forge.js +1 -1
  121. package/examples/api/smooth-curve-connections.forge.js +1 -1
  122. package/examples/api/transition-curves.forge.js +4 -4
  123. package/examples/api/variable-sweep-pure-sdf-test.forge.js +162 -0
  124. package/examples/api/variable-sweep-test.forge.js +2 -2
  125. package/examples/api/wood-joinery.forge.js +60 -0
  126. package/examples/compiler-corpus/enclosure-shell-cuts.forge.js +3 -3
  127. package/examples/compiler-corpus/fastener-plate-variants.forge.js +2 -2
  128. package/examples/constraints/01-fully-constrained-rect.forge.js +2 -2
  129. package/examples/constraints/02-underconstrained-triangle.forge.js +1 -1
  130. package/examples/constraints/03-redundant-constraints.forge.js +2 -2
  131. package/examples/constraints/05-parallel-with-linedistance.forge.js +2 -2
  132. package/examples/constraints/06-complex-spectrogram.forge.js +1 -1
  133. package/examples/constraints/07-perpendicular-chain.forge.js +4 -4
  134. package/examples/constraints/08-symmetric-bracket.forge.js +4 -4
  135. package/examples/constraints/09-stress-spiral.forge.js +1 -1
  136. package/examples/constraints/10-stress-honeycomb.forge.js +1 -1
  137. package/examples/constraints/11-surface-grid.forge.js +2 -2
  138. package/examples/constraints/12-surface-nested.forge.js +4 -4
  139. package/examples/constraints/13-surface-complex.forge.js +1 -1
  140. package/examples/exact-arc-housing.forge.js +12 -0
  141. package/examples/experiments/drone-arm.forge.js +53 -0
  142. package/examples/furniture/adjustable-table.forge.js +15 -15
  143. package/examples/furniture/bathroom.forge.js +26 -26
  144. package/examples/furniture/chair.forge.js +13 -13
  145. package/examples/furniture/picture-frame.forge.js +6 -6
  146. package/examples/furniture/shoe-rack-doors.forge.js +8 -8
  147. package/examples/furniture/shoe-rack.forge.js +7 -7
  148. package/examples/furniture/table-lamp.forge.js +8 -8
  149. package/examples/gcode/lissajous-vase.forge.js +4 -4
  150. package/examples/gcode/math-surface.forge.js +3 -3
  151. package/examples/gcode/parametric-vase.forge.js +4 -4
  152. package/examples/gcode/spiral-tower.forge.js +4 -4
  153. package/examples/generative/crystal-growth.forge.js +9 -9
  154. package/examples/generative/frost-spires.forge.js +9 -9
  155. package/examples/generative/golden-spiral-tower.forge.js +11 -11
  156. package/examples/generative/molten-forge.forge.js +6 -6
  157. package/examples/generative/neon-coral.forge.js +7 -7
  158. package/examples/mechanical/3d-printer.forge.js +37 -37
  159. package/examples/mechanical/5-finger-robot-hand.forge.js +19 -19
  160. package/examples/mechanical/airplane-propeller.forge.js +9 -9
  161. package/examples/mechanical/bolt-and-nut.forge.js +10 -10
  162. package/examples/mechanical/door-with-hinges.forge.js +7 -7
  163. package/examples/mechanical/fillet-enclosure.forge.js +15 -11
  164. package/examples/mechanical/headphone-hanger-v2.forge.js +11 -11
  165. package/examples/mechanical/robot_hand.forge.js +24 -24
  166. package/examples/mechanical/robot_hand_2.forge.js +26 -26
  167. package/examples/nurbs-surface.forge.js +8 -0
  168. package/examples/nurbs-tube.forge.js +7 -0
  169. package/examples/products/bottle.forge.js +8 -8
  170. package/examples/products/chess-set.forge.js +25 -25
  171. package/examples/products/classical-piano.forge.js +20 -20
  172. package/examples/products/clock.forge.js +33 -33
  173. package/examples/products/cup.forge.js +5 -5
  174. package/examples/products/iphone.forge.js +20 -20
  175. package/examples/products/laptop.forge.js +24 -24
  176. package/examples/products/laser-cut-box.forge.js +6 -6
  177. package/examples/products/laser-cut-tray.forge.js +6 -6
  178. package/examples/products/liquid-soap-dispenser.forge.js +23 -23
  179. package/examples/products/origami-fish.forge.js +14 -12
  180. package/examples/products/spiderman-cake.forge.js +6 -6
  181. package/examples/shelf/container.forge.js +5 -5
  182. package/examples/shelf/shelf-unit.forge.js +6 -6
  183. package/examples/toolbox/bolted-joint.forge.js +7 -7
  184. package/package.json +9 -4
  185. package/dist/assets/EditorApp-B-vQvgam.js +0 -9888
  186. package/dist/assets/LandingPage-C5n9hDXI.js +0 -322
  187. package/dist/assets/PublishedModelPage-Dt7PCVBj.js +0 -146
  188. package/dist/assets/__vite-browser-external-CURh0WXD.js +0 -8
  189. package/dist/assets/deserializeRunResult-BLAFoiE0.js +0 -19365
  190. package/dist/assets/index-1CYp3zUp.js +0 -1455
  191. package/dist-skill/docs/API/API.md +0 -1666
  192. package/dist-skill/docs/API/README.md +0 -37
  193. package/dist-skill/docs/API/assembly/assembly.md +0 -617
  194. package/dist-skill/docs/API/core/edge-queries.md +0 -130
  195. package/dist-skill/docs/API/core/parameters.md +0 -122
  196. package/dist-skill/docs/API/core/reserved-terms.md +0 -137
  197. package/dist-skill/docs/API/core/sdf.md +0 -326
  198. package/dist-skill/docs/API/core/skill-cli.md +0 -194
  199. package/dist-skill/docs/API/core/skill-guide.md +0 -205
  200. package/dist-skill/docs/API/core/specs.md +0 -186
  201. package/dist-skill/docs/API/core/topology.md +0 -372
  202. package/dist-skill/docs/API/entities.md +0 -268
  203. package/dist-skill/docs/API/output/bom.md +0 -58
  204. package/dist-skill/docs/API/output/brep-export.md +0 -87
  205. package/dist-skill/docs/API/output/dimensions.md +0 -67
  206. package/dist-skill/docs/API/output/export.md +0 -110
  207. package/dist-skill/docs/API/output/gcode.md +0 -195
  208. package/dist-skill/docs/API/runtime/viewport.md +0 -420
  209. package/dist-skill/docs/API/sheet-metal/sheet-metal.md +0 -185
  210. package/dist-skill/docs/API/sketch/anchor.md +0 -37
  211. package/dist-skill/docs/API/sketch/booleans.md +0 -91
  212. package/dist-skill/docs/API/sketch/core.md +0 -73
  213. package/dist-skill/docs/API/sketch/extrude.md +0 -62
  214. package/dist-skill/docs/API/sketch/on-face.md +0 -104
  215. package/dist-skill/docs/API/sketch/operations.md +0 -78
  216. package/dist-skill/docs/API/sketch/path.md +0 -75
  217. package/dist-skill/docs/API/sketch/primitives.md +0 -146
  218. package/dist-skill/docs/API/sketch/regions.md +0 -80
  219. package/dist-skill/docs/API/sketch/text.md +0 -108
  220. package/dist-skill/docs/API/sketch/transforms.md +0 -65
  221. package/dist-skill/docs/API/toolbox/fasteners.md +0 -129
  222. package/dist-skill/docs/INDEX.md +0 -94
  223. package/dist-skill/docs/RELEASING.md +0 -55
  224. package/dist-skill/docs/cli-monetization.md +0 -111
  225. package/dist-skill/docs/deployment.md +0 -281
  226. package/dist-skill/docs/generated/concepts.md +0 -2112
  227. package/dist-skill/docs/internals/shape-from-slices.md +0 -152
  228. package/dist-skill/docs/platform/admin.md +0 -45
  229. package/dist-skill/docs/platform/architecture.md +0 -79
  230. package/dist-skill/docs/platform/auth.md +0 -110
  231. package/dist-skill/docs/platform/email.md +0 -67
  232. package/dist-skill/docs/platform/projects.md +0 -111
  233. package/dist-skill/docs/platform/sharing.md +0 -90
  234. package/dist-skill/docs/runbook.md +0 -345
@@ -1,345 +0,0 @@
1
- # ForgeCAD Hosted Service — Runbook
2
-
3
- Operational reference for running, testing, and troubleshooting the forgecad.io hosted service.
4
-
5
- For the full documentation index see [INDEX.md](../INDEX.md).
6
- For environment variables, Docker setup, and deployment details see [deployment.md](deployment.md).
7
- For releasing new versions see [RELEASING.md](../RELEASING.md).
8
- For platform feature docs (auth, projects, sharing, admin, email) see [platform/](../platform/).
9
-
10
- ---
11
-
12
- ## Quick Reference
13
-
14
- | What | Command |
15
- |------|---------|
16
- | Start local DB | `npm run dev:db` |
17
- | Stop local DB | `npm run dev:db:stop` |
18
- | Start API server | `npm run dev:server` |
19
- | Start frontend (with API proxy) | `npm run dev:studio` |
20
- | Run API tests | `bash scripts/test-shares-api.sh` |
21
- | Run unit tests | `npm run test:unit` |
22
- | Run full test suite | `npm test` |
23
- | Health check | `curl http://localhost:5174/api/health` |
24
- | SSH to production | `ssh hetzner` |
25
-
26
- ---
27
-
28
- ## Local Development Stack
29
-
30
- ### Minimal (editor only, no auth)
31
-
32
- ```bash
33
- npm run dev
34
- ```
35
-
36
- No database, no login. For geometry, sketches, viewer work.
37
-
38
- ### Full stack (auth, projects, sharing)
39
-
40
- Three terminals:
41
-
42
- ```bash
43
- # 1. Database
44
- npm run dev:db
45
-
46
- # 2. API server (port 5174)
47
- npm run dev:server
48
-
49
- # 3. Frontend (port 5173, proxies /api → 5174)
50
- npm run dev:studio
51
- ```
52
-
53
- Open http://localhost:5173. Dev credentials are hardcoded in `dev:server` — see [deployment.md](deployment.md#local-development).
54
-
55
- ### Verify the stack is healthy
56
-
57
- ```bash
58
- # API health
59
- curl -s http://localhost:5174/api/health | python3 -m json.tool
60
-
61
- # Database
62
- docker exec forgecad-postgresql-1 psql -U forgecad -d forgecad -c "SELECT count(*) FROM users;"
63
-
64
- # Migration state
65
- docker exec forgecad-postgresql-1 psql -U forgecad -d forgecad -c "SELECT * FROM _migrations ORDER BY id;"
66
- ```
67
-
68
- ---
69
-
70
- ## Testing
71
-
72
- ### API tests (end-to-end, from terminal)
73
-
74
- These scripts exercise the real server — no mocks, real HTTP, real database.
75
-
76
- | Script | What it tests | Prerequisites |
77
- |--------|--------------|---------------|
78
- | `scripts/test-shares-api.sh` | Publish, fetch, update, unpublish, auth enforcement | `dev:db` + `dev:server` |
79
-
80
- Run:
81
-
82
- ```bash
83
- bash scripts/test-shares-api.sh
84
- ```
85
-
86
- The script registers a fresh test user, runs through the full lifecycle, and cleans up. Each run uses a unique email so it's safe to re-run.
87
-
88
- ### Adding new API test scripts
89
-
90
- Follow the pattern in `test-shares-api.sh`:
91
-
92
- 1. Name: `scripts/test-<feature>-api.sh`
93
- 2. Check server health first (`/api/health`)
94
- 3. Register a unique test user per run
95
- 4. Use `acurl()` helper for authenticated requests
96
- 5. Assert HTTP status codes and response fields
97
- 6. Clean up (delete created resources)
98
- 7. Print colored pass/fail per step
99
-
100
- ### Unit tests
101
-
102
- ```bash
103
- npm run test:unit # vitest
104
- npm test # unit + CLI invariant checks
105
- ```
106
-
107
- ### Invariant checks (CLI)
108
-
109
- ```bash
110
- node dist-cli/forgecad.js check suite
111
- ```
112
-
113
- Runs compiler snapshots, example validation, parameter scanning, transform/dimension invariants.
114
-
115
- ---
116
-
117
- ## Database
118
-
119
- ### Migrations
120
-
121
- Migrations run automatically on server startup (`server/db/migrate.ts`). The system:
122
-
123
- 1. Maintains a `_migrations` table tracking applied migrations by sequential ID
124
- 2. Runs unapplied migrations in order on boot
125
- 3. Each migration is idempotent SQL (`CREATE TABLE IF NOT EXISTS`, `ALTER ... ADD COLUMN IF NOT EXISTS`)
126
-
127
- **To add a new migration:** append to the `MIGRATIONS` array in `server/db/migrate.ts`.
128
-
129
- ### Inspect the database locally
130
-
131
- ```bash
132
- docker exec -it forgecad-postgresql-1 psql -U forgecad -d forgecad
133
- ```
134
-
135
- Common queries:
136
-
137
- ```sql
138
- -- List tables
139
- \dt
140
-
141
- -- Users
142
- SELECT id, email, name, role, created_at FROM users;
143
-
144
- -- Projects
145
- SELECT id, slug, name, visibility, owner_id FROM projects;
146
-
147
- -- Shared/published models
148
- SELECT share_id, filename, title, owner_id, updated_at FROM shared_files;
149
-
150
- -- Audit log (recent)
151
- SELECT action, details, created_at FROM audit_log ORDER BY created_at DESC LIMIT 20;
152
-
153
- -- Migration state
154
- SELECT * FROM _migrations ORDER BY id;
155
- ```
156
-
157
- ### Reset local database
158
-
159
- ```bash
160
- npm run dev:db:stop
161
- docker volume rm forgecad_postgresql-dev-data # or the worktree-specific volume name
162
- npm run dev:db
163
- # Server will re-run all migrations on next start
164
- ```
165
-
166
- ---
167
-
168
- ## Production (Hetzner / Coolify)
169
-
170
- ### Access
171
-
172
- ```bash
173
- ssh hetzner # see ~/.ssh/config for host alias
174
- ```
175
-
176
- ### Find containers
177
-
178
- ```bash
179
- docker ps --format "{{.Names}}" | grep forge
180
- ```
181
-
182
- ### Logs
183
-
184
- ```bash
185
- # App logs (recent)
186
- docker logs --tail 200 <forgecad-container>
187
-
188
- # Follow live
189
- docker logs -f <forgecad-container>
190
-
191
- # Filter for errors
192
- docker logs <forgecad-container> 2>&1 | grep -i error | tail -20
193
- ```
194
-
195
- ### Database access in production
196
-
197
- ```bash
198
- # Get credentials from the app container's environment
199
- docker exec <forgecad-container> env | grep POSTGRES
200
-
201
- # Connect
202
- docker exec -it <postgres-container> psql -U <USER> -d forgecad
203
- ```
204
-
205
- ### Health check
206
-
207
- ```bash
208
- curl -s https://forgecad.io/api/health | python3 -m json.tool
209
- ```
210
-
211
- ### Verify a deployment landed
212
-
213
- Coolify auto-builds and deploys on push to `mainline`. This usually takes 2–5 minutes. The deploy is triggered by Coolify polling the repo (not a webhook), so the delay varies.
214
-
215
- To confirm:
216
-
217
- ```bash
218
- # 1. Check container was recently recreated (look at the "Up X minutes" status and CreatedAt)
219
- ssh hetzner 'docker ps --format "{{.Names}}\t{{.CreatedAt}}\t{{.Status}}" | grep -E "^forgecad-" | grep -v postgres'
220
-
221
- # 2. Check for healthy status
222
- ssh hetzner 'docker ps --format "{{.Names}}\t{{.Status}}" | grep -E "^forgecad-" | grep -v postgres | grep healthy'
223
-
224
- # 3. Check startup logs for errors
225
- ssh hetzner 'docker logs --tail 30 $(docker ps --format "{{.Names}}" | grep -E "^forgecad-" | grep -v postgres) 2>&1'
226
-
227
- # 4. Hit the health endpoint
228
- curl -s https://forgecad.io/api/health | python3 -m json.tool
229
-
230
- # 5. Verify specific code landed (check compiled output, not source)
231
- ssh hetzner 'docker exec $(docker ps --format "{{.Names}}" | grep -E "^forgecad-" | grep -v postgres) grep -c "YOUR_KEYWORD" /app/dist-server/routes/files.js'
232
- ```
233
-
234
- Container names change on each deploy — always discover dynamically with `docker ps | grep forgecad`. The app dir is `/app/` with compiled output in `dist/`, `dist-server/`, `dist-cli/`.
235
-
236
- ### Restart
237
-
238
- Coolify auto-deploys on push to `mainline`. For manual restart:
239
-
240
- ```bash
241
- docker restart $(docker ps --format "{{.Names}}" | grep -E "^forgecad-" | grep -v postgres)
242
- ```
243
-
244
- ### System resources
245
-
246
- ```bash
247
- df -h # disk
248
- free -h # memory
249
- docker stats --no-stream # per-container CPU/memory
250
- ```
251
-
252
- ---
253
-
254
- ## API Endpoints Reference
255
-
256
- ### Public (no auth)
257
-
258
- | Method | Route | Purpose |
259
- |--------|-------|---------|
260
- | GET | `/api/health` | Server health + uptime |
261
- | GET | `/api/shares/:shareId` | Fetch a published model |
262
-
263
- ### Auth
264
-
265
- | Method | Route | Purpose |
266
- |--------|-------|---------|
267
- | POST | `/api/auth/register` | Create account |
268
- | POST | `/api/auth/login` | Login (returns cookies) |
269
- | POST | `/api/auth/refresh` | Refresh access token |
270
- | POST | `/api/auth/logout` | Clear session |
271
- | GET | `/api/auth/session` | Current user info |
272
- | GET | `/api/auth/providers` | OAuth provider URLs |
273
- | POST | `/api/auth/callback/:provider` | OAuth callback |
274
- | POST | `/api/auth/forgot-password` | Request password reset |
275
- | POST | `/api/auth/reset-password` | Apply password reset |
276
- | GET | `/api/auth/verify-email` | Confirm email |
277
- | POST | `/api/auth/resend-verification` | Resend verification email |
278
-
279
- ### Projects (all require auth)
280
-
281
- | Method | Route | Role | Purpose |
282
- |--------|-------|------|---------|
283
- | GET | `/api/projects` | — | List user's projects |
284
- | POST | `/api/projects` | — | Create project |
285
- | GET | `/api/projects/:id` | viewer | Project details |
286
- | PATCH | `/api/projects/:id` | owner | Update project |
287
- | DELETE | `/api/projects/:id` | owner | Delete project |
288
- | GET | `/api/projects/:id/members` | viewer | List members |
289
- | POST | `/api/projects/:id/members` | owner | Add member |
290
- | PATCH | `/api/projects/:id/members/:userId` | owner | Update member role |
291
- | DELETE | `/api/projects/:id/members/:userId` | owner | Remove member |
292
-
293
- ### Files (all require auth + project role)
294
-
295
- | Method | Route | Role | Purpose |
296
- |--------|-------|------|---------|
297
- | GET | `/api/projects/:id/watch` | viewer | SSE file watcher |
298
- | POST | `/api/projects/:id/save` | editor | Save file |
299
- | POST | `/api/projects/:id/delete` | editor | Delete file |
300
- | POST | `/api/projects/:id/mkdir` | editor | Create directory |
301
- | GET | `/api/projects/:id/read-binary` | viewer | Download mesh file |
302
-
303
- ### Shares (published models)
304
-
305
- | Method | Route | Auth | Purpose |
306
- |--------|-------|------|---------|
307
- | GET | `/api/shares/:shareId` | none | Fetch published model (public) |
308
- | GET | `/api/shares` | required | List user's published models |
309
- | POST | `/api/shares` | required | Publish or update a model |
310
- | DELETE | `/api/shares/:shareId` | required (owner) | Unpublish |
311
-
312
- ---
313
-
314
- ## Troubleshooting
315
-
316
- ### Server won't start
317
-
318
- | Symptom | Cause | Fix |
319
- |---------|-------|-----|
320
- | `pino-pretty` transport error | Missing dev dependency in worktree | Use `NODE_ENV=production` or install pino-pretty |
321
- | Port 5174 already in use | Another server instance running | `lsof -i :5174` then kill the PID |
322
- | `FORGE_DB_URL` missing | Env var not set | Use `npm run dev:server` which sets it automatically |
323
- | Connection refused on :5432 | Postgres not running | `npm run dev:db` |
324
-
325
- ### Auth issues
326
-
327
- | Symptom | Cause | Fix |
328
- |---------|-------|-----|
329
- | 500 on login/register | Missing `FORGE_JWT_SECRET` | Set it (any string for dev, `openssl rand -base64 32` for prod) |
330
- | 401 on authenticated endpoints | Expired access token (15 min) | Client should auto-refresh; check refresh token cookie |
331
- | CORS errors in browser | `FORGE_ALLOWED_ORIGINS` mismatch | Must match the frontend's origin exactly |
332
-
333
- ### Email issues
334
-
335
- | Symptom | Cause | Fix |
336
- |---------|-------|-----|
337
- | No verification/reset email received; logs show `[email] To: user@...` | `RESEND_API_KEY` is empty — falling back to console log | Set `RESEND_API_KEY` in Coolify → redeploy. See [guides/email-setup.md](guides/email-setup.md) |
338
-
339
- ### Database issues
340
-
341
- | Symptom | Cause | Fix |
342
- |---------|-------|-----|
343
- | Migration fails | Schema conflict from manual changes | Reset local DB (see above) |
344
- | `relation does not exist` | Migrations didn't run | Check `_migrations` table; restart server |
345
- | Quota errors on file save | User's `storage_used_bytes` exceeded 50MB | Check with `SELECT storage_used_bytes FROM users WHERE ...` |