aimeat 1.26.0 → 1.27.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 (307) hide show
  1. package/README.md +7 -0
  2. package/dist/.env.example +19 -0
  3. package/dist/locales/en.json +507 -288
  4. package/dist/locales/fi.json +476 -257
  5. package/dist/public/css/components/app-sandbox.css +62 -0
  6. package/dist/public/css/views/app-grant.css +83 -0
  7. package/dist/public/css/views/inbox.css +30 -0
  8. package/dist/public/css/views/landing.css +16 -2
  9. package/dist/public/css/views/living.css +187 -0
  10. package/dist/public/css/views/notebook.css +89 -0
  11. package/dist/public/css/views/profile.css +42 -85
  12. package/dist/public/js/app-sandbox.js +42 -0
  13. package/dist/public/js/services/generator-prompts-base.js +40 -3
  14. package/dist/public/js/services/living.js +506 -0
  15. package/dist/public/js/services/notebook-plan.js +211 -0
  16. package/dist/public/js/services/notebook.js +149 -0
  17. package/dist/public/js/services/organisms.js +10 -2
  18. package/dist/public/js/services/tracked-responses.js +79 -0
  19. package/dist/public/js/utils.js +15 -0
  20. package/dist/public/spa.html +20 -1
  21. package/dist/public/types/aimeat-globals.d.ts +4 -0
  22. package/dist/public/views/app-grant.js +210 -0
  23. package/dist/public/views/business.js +8 -1
  24. package/dist/public/views/how-it-works.js +5 -1
  25. package/dist/public/views/landing-node-totals.js +71 -0
  26. package/dist/public/views/landing.js +88 -79
  27. package/dist/public/views/profile/access-tab.js +75 -0
  28. package/dist/public/views/profile/agents-tab.js +3 -2
  29. package/dist/public/views/profile/apps-tab.js +17 -0
  30. package/dist/public/views/profile/inbox-tab.js +204 -7
  31. package/dist/public/views/profile/landing-page.js +255 -163
  32. package/dist/public/views/profile/living-tab.js +480 -0
  33. package/dist/public/views/profile/notebook-card.js +489 -0
  34. package/dist/public/views/profile/notebook-helpers.js +48 -0
  35. package/dist/public/views/profile/notebook-tab.js +40 -260
  36. package/dist/public/views/profile.js +2 -0
  37. package/dist/scripts/reassign-apps.d.ts +2 -0
  38. package/dist/scripts/reassign-apps.d.ts.map +1 -0
  39. package/dist/scripts/reassign-apps.js +99 -0
  40. package/dist/scripts/reassign-apps.js.map +1 -0
  41. package/dist/scripts/screenshot-worker.d.ts +2 -0
  42. package/dist/scripts/screenshot-worker.d.ts.map +1 -0
  43. package/dist/scripts/screenshot-worker.js +14 -0
  44. package/dist/scripts/screenshot-worker.js.map +1 -0
  45. package/dist/src/auth/jwt.d.ts +2 -0
  46. package/dist/src/auth/jwt.d.ts.map +1 -1
  47. package/dist/src/auth/jwt.js +2 -0
  48. package/dist/src/auth/jwt.js.map +1 -1
  49. package/dist/src/auth/middleware.d.ts.map +1 -1
  50. package/dist/src/auth/middleware.js +6 -2
  51. package/dist/src/auth/middleware.js.map +1 -1
  52. package/dist/src/cli/init-wizard.d.ts +7 -3
  53. package/dist/src/cli/init-wizard.d.ts.map +1 -1
  54. package/dist/src/cli/init-wizard.js +50 -5
  55. package/dist/src/cli/init-wizard.js.map +1 -1
  56. package/dist/src/cli/screenshot-worker.d.ts +2 -0
  57. package/dist/src/cli/screenshot-worker.d.ts.map +1 -0
  58. package/dist/src/cli/screenshot-worker.js +156 -0
  59. package/dist/src/cli/screenshot-worker.js.map +1 -0
  60. package/dist/src/config.d.ts +23 -0
  61. package/dist/src/config.d.ts.map +1 -1
  62. package/dist/src/config.js +28 -0
  63. package/dist/src/config.js.map +1 -1
  64. package/dist/src/generated/api-types.d.ts +2756 -1285
  65. package/dist/src/generated/api-types.d.ts.map +1 -1
  66. package/dist/src/generated/prisma-postgres/edge.js +21 -3
  67. package/dist/src/generated/prisma-postgres/index-browser.js +18 -0
  68. package/dist/src/generated/prisma-postgres/index.d.ts +1648 -155
  69. package/dist/src/generated/prisma-postgres/index.js +21 -3
  70. package/dist/src/generated/prisma-postgres/package.json +1 -1
  71. package/dist/src/generated/prisma-postgres/schema.prisma +21 -0
  72. package/dist/src/generated/prisma-postgres/wasm.js +21 -3
  73. package/dist/src/index.js +8 -0
  74. package/dist/src/index.js.map +1 -1
  75. package/dist/src/mcp/apps.d.ts +2 -0
  76. package/dist/src/mcp/apps.d.ts.map +1 -1
  77. package/dist/src/mcp/apps.js +32 -2
  78. package/dist/src/mcp/apps.js.map +1 -1
  79. package/dist/src/mcp/extensions.d.ts +1 -0
  80. package/dist/src/mcp/extensions.d.ts.map +1 -1
  81. package/dist/src/mcp/extensions.js +10 -1
  82. package/dist/src/mcp/extensions.js.map +1 -1
  83. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  84. package/dist/src/mcp/workspaces.js +4 -1
  85. package/dist/src/mcp/workspaces.js.map +1 -1
  86. package/dist/src/middleware/rate-limit.d.ts +10 -0
  87. package/dist/src/middleware/rate-limit.d.ts.map +1 -1
  88. package/dist/src/middleware/rate-limit.js +24 -4
  89. package/dist/src/middleware/rate-limit.js.map +1 -1
  90. package/dist/src/middleware/subdomain.d.ts +15 -3
  91. package/dist/src/middleware/subdomain.d.ts.map +1 -1
  92. package/dist/src/middleware/subdomain.js +35 -12
  93. package/dist/src/middleware/subdomain.js.map +1 -1
  94. package/dist/src/routes/admin.js +4 -2
  95. package/dist/src/routes/admin.js.map +1 -1
  96. package/dist/src/routes/agent-webhook.d.ts.map +1 -1
  97. package/dist/src/routes/agent-webhook.js +3 -2
  98. package/dist/src/routes/agent-webhook.js.map +1 -1
  99. package/dist/src/routes/app-grants.d.ts +35 -0
  100. package/dist/src/routes/app-grants.d.ts.map +1 -0
  101. package/dist/src/routes/app-grants.js +370 -0
  102. package/dist/src/routes/app-grants.js.map +1 -0
  103. package/dist/src/routes/apps.d.ts +18 -0
  104. package/dist/src/routes/apps.d.ts.map +1 -1
  105. package/dist/src/routes/apps.js +232 -13
  106. package/dist/src/routes/apps.js.map +1 -1
  107. package/dist/src/routes/extensions.d.ts +2 -0
  108. package/dist/src/routes/extensions.d.ts.map +1 -1
  109. package/dist/src/routes/extensions.js +18 -9
  110. package/dist/src/routes/extensions.js.map +1 -1
  111. package/dist/src/routes/foundry.d.ts.map +1 -1
  112. package/dist/src/routes/foundry.js +13 -1
  113. package/dist/src/routes/foundry.js.map +1 -1
  114. package/dist/src/routes/generator.d.ts.map +1 -1
  115. package/dist/src/routes/generator.js +13 -1
  116. package/dist/src/routes/generator.js.map +1 -1
  117. package/dist/src/routes/ghii.d.ts.map +1 -1
  118. package/dist/src/routes/ghii.js +20 -10
  119. package/dist/src/routes/ghii.js.map +1 -1
  120. package/dist/src/routes/librarian.d.ts.map +1 -1
  121. package/dist/src/routes/librarian.js +64 -2
  122. package/dist/src/routes/librarian.js.map +1 -1
  123. package/dist/src/routes/libs.d.ts +15 -0
  124. package/dist/src/routes/libs.d.ts.map +1 -1
  125. package/dist/src/routes/libs.js +301 -2
  126. package/dist/src/routes/libs.js.map +1 -1
  127. package/dist/src/routes/living.d.ts +18 -0
  128. package/dist/src/routes/living.d.ts.map +1 -0
  129. package/dist/src/routes/living.js +63 -0
  130. package/dist/src/routes/living.js.map +1 -0
  131. package/dist/src/routes/memory.d.ts.map +1 -1
  132. package/dist/src/routes/memory.js +4 -1
  133. package/dist/src/routes/memory.js.map +1 -1
  134. package/dist/src/routes/messages.d.ts +2 -0
  135. package/dist/src/routes/messages.d.ts.map +1 -1
  136. package/dist/src/routes/messages.js +16 -87
  137. package/dist/src/routes/messages.js.map +1 -1
  138. package/dist/src/routes/oauth-login.d.ts +22 -0
  139. package/dist/src/routes/oauth-login.d.ts.map +1 -0
  140. package/dist/src/routes/oauth-login.js +219 -0
  141. package/dist/src/routes/oauth-login.js.map +1 -0
  142. package/dist/src/routes/organisms.d.ts.map +1 -1
  143. package/dist/src/routes/organisms.js +4 -1
  144. package/dist/src/routes/organisms.js.map +1 -1
  145. package/dist/src/routes/portal.d.ts +3 -0
  146. package/dist/src/routes/portal.d.ts.map +1 -1
  147. package/dist/src/routes/portal.js +20 -12
  148. package/dist/src/routes/portal.js.map +1 -1
  149. package/dist/src/routes/public-stats.d.ts +3 -0
  150. package/dist/src/routes/public-stats.d.ts.map +1 -1
  151. package/dist/src/routes/public-stats.js +48 -0
  152. package/dist/src/routes/public-stats.js.map +1 -1
  153. package/dist/src/routes/storage-files.js +10 -10
  154. package/dist/src/routes/storage-files.js.map +1 -1
  155. package/dist/src/routes/subdomains.d.ts +33 -0
  156. package/dist/src/routes/subdomains.d.ts.map +1 -1
  157. package/dist/src/routes/subdomains.js +182 -9
  158. package/dist/src/routes/subdomains.js.map +1 -1
  159. package/dist/src/routes/tracked-responses.d.ts +27 -0
  160. package/dist/src/routes/tracked-responses.d.ts.map +1 -0
  161. package/dist/src/routes/tracked-responses.js +160 -0
  162. package/dist/src/routes/tracked-responses.js.map +1 -0
  163. package/dist/src/routes/upload.js +8 -0
  164. package/dist/src/routes/upload.js.map +1 -1
  165. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  166. package/dist/src/server-bootstrap/routes-loader.js +33 -0
  167. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  168. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  169. package/dist/src/server-bootstrap/service-init.js +4 -0
  170. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  171. package/dist/src/server-bootstrap/static-files.d.ts +8 -0
  172. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  173. package/dist/src/server-bootstrap/static-files.js +52 -3
  174. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  175. package/dist/src/server.d.ts.map +1 -1
  176. package/dist/src/server.js +5 -0
  177. package/dist/src/server.js.map +1 -1
  178. package/dist/src/services/core-jobs.d.ts.map +1 -1
  179. package/dist/src/services/core-jobs.js +5 -0
  180. package/dist/src/services/core-jobs.js.map +1 -1
  181. package/dist/src/services/event-bus.d.ts +10 -0
  182. package/dist/src/services/event-bus.d.ts.map +1 -1
  183. package/dist/src/services/event-bus.js +9 -0
  184. package/dist/src/services/event-bus.js.map +1 -1
  185. package/dist/src/services/generator-prompts/resolvers.d.ts +2 -0
  186. package/dist/src/services/generator-prompts/resolvers.d.ts.map +1 -1
  187. package/dist/src/services/generator-prompts/resolvers.js +22 -3
  188. package/dist/src/services/generator-prompts/resolvers.js.map +1 -1
  189. package/dist/src/services/hooks.js +2 -2
  190. package/dist/src/services/hooks.js.map +1 -1
  191. package/dist/src/services/job-seeding.d.ts.map +1 -1
  192. package/dist/src/services/job-seeding.js +2 -0
  193. package/dist/src/services/job-seeding.js.map +1 -1
  194. package/dist/src/services/living-author-prompt.d.ts +14 -0
  195. package/dist/src/services/living-author-prompt.d.ts.map +1 -0
  196. package/dist/src/services/living-author-prompt.js +47 -0
  197. package/dist/src/services/living-author-prompt.js.map +1 -0
  198. package/dist/src/services/living-author.d.ts +55 -0
  199. package/dist/src/services/living-author.d.ts.map +1 -0
  200. package/dist/src/services/living-author.js +91 -0
  201. package/dist/src/services/living-author.js.map +1 -0
  202. package/dist/src/services/living-pulse.d.ts +29 -0
  203. package/dist/src/services/living-pulse.d.ts.map +1 -0
  204. package/dist/src/services/living-pulse.js +363 -0
  205. package/dist/src/services/living-pulse.js.map +1 -0
  206. package/dist/src/services/message-send.d.ts +24 -0
  207. package/dist/src/services/message-send.d.ts.map +1 -0
  208. package/dist/src/services/message-send.js +114 -0
  209. package/dist/src/services/message-send.js.map +1 -0
  210. package/dist/src/services/notebook-ai.d.ts +36 -0
  211. package/dist/src/services/notebook-ai.d.ts.map +1 -0
  212. package/dist/src/services/notebook-ai.js +51 -0
  213. package/dist/src/services/notebook-ai.js.map +1 -0
  214. package/dist/src/services/notebook-classify.d.ts +32 -5
  215. package/dist/src/services/notebook-classify.d.ts.map +1 -1
  216. package/dist/src/services/notebook-classify.js +59 -43
  217. package/dist/src/services/notebook-classify.js.map +1 -1
  218. package/dist/src/services/notebook-distribute-prompt.d.ts +16 -0
  219. package/dist/src/services/notebook-distribute-prompt.d.ts.map +1 -0
  220. package/dist/src/services/notebook-distribute-prompt.js +40 -0
  221. package/dist/src/services/notebook-distribute-prompt.js.map +1 -0
  222. package/dist/src/services/notebook-plan-prompt.d.ts +19 -0
  223. package/dist/src/services/notebook-plan-prompt.d.ts.map +1 -0
  224. package/dist/src/services/notebook-plan-prompt.js +54 -0
  225. package/dist/src/services/notebook-plan-prompt.js.map +1 -0
  226. package/dist/src/services/notebook-plan.d.ts +70 -0
  227. package/dist/src/services/notebook-plan.d.ts.map +1 -0
  228. package/dist/src/services/notebook-plan.js +118 -0
  229. package/dist/src/services/notebook-plan.js.map +1 -0
  230. package/dist/src/services/oidc-client.d.ts +3 -0
  231. package/dist/src/services/oidc-client.d.ts.map +1 -1
  232. package/dist/src/services/oidc-client.js +17 -2
  233. package/dist/src/services/oidc-client.js.map +1 -1
  234. package/dist/src/services/prompt-defaults.d.ts.map +1 -1
  235. package/dist/src/services/prompt-defaults.js +30 -0
  236. package/dist/src/services/prompt-defaults.js.map +1 -1
  237. package/dist/src/services/quota.d.ts +14 -1
  238. package/dist/src/services/quota.d.ts.map +1 -1
  239. package/dist/src/services/quota.js +28 -1
  240. package/dist/src/services/quota.js.map +1 -1
  241. package/dist/src/services/scheduler.d.ts +5 -0
  242. package/dist/src/services/scheduler.d.ts.map +1 -1
  243. package/dist/src/services/scheduler.js +4 -0
  244. package/dist/src/services/scheduler.js.map +1 -1
  245. package/dist/src/services/screenshot-capture.d.ts +28 -0
  246. package/dist/src/services/screenshot-capture.d.ts.map +1 -0
  247. package/dist/src/services/screenshot-capture.js +154 -0
  248. package/dist/src/services/screenshot-capture.js.map +1 -0
  249. package/dist/src/services/track-registry.d.ts +29 -0
  250. package/dist/src/services/track-registry.d.ts.map +1 -0
  251. package/dist/src/services/track-registry.js +61 -0
  252. package/dist/src/services/track-registry.js.map +1 -0
  253. package/dist/src/services/tracked-response.d.ts +98 -0
  254. package/dist/src/services/tracked-response.d.ts.map +1 -0
  255. package/dist/src/services/tracked-response.js +304 -0
  256. package/dist/src/services/tracked-response.js.map +1 -0
  257. package/dist/src/services/webhook-dispatcher.d.ts.map +1 -1
  258. package/dist/src/services/webhook-dispatcher.js +3 -2
  259. package/dist/src/services/webhook-dispatcher.js.map +1 -1
  260. package/dist/src/storage/interface.d.ts +19 -2
  261. package/dist/src/storage/interface.d.ts.map +1 -1
  262. package/dist/src/storage/interface.js.map +1 -1
  263. package/dist/src/storage/providers/mongodb/index.d.ts +16 -1
  264. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  265. package/dist/src/storage/providers/mongodb/index.js +123 -0
  266. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  267. package/dist/src/storage/providers/sqlite/index.d.ts +10 -1
  268. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  269. package/dist/src/storage/providers/sqlite/index.js +119 -6
  270. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  271. package/dist/src/storage/providers/sqlite/repos/identity.d.ts +1 -0
  272. package/dist/src/storage/providers/sqlite/repos/identity.d.ts.map +1 -1
  273. package/dist/src/storage/providers/sqlite/repos/identity.js +10 -4
  274. package/dist/src/storage/providers/sqlite/repos/identity.js.map +1 -1
  275. package/dist/src/storage/providers/sqlite/schema.d.ts +16 -3
  276. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  277. package/dist/src/storage/providers/sqlite/schema.js +31 -4
  278. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  279. package/dist/src/storage/repositories/app-grant.repository.d.ts +22 -0
  280. package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -0
  281. package/dist/src/storage/repositories/app-grant.repository.js +2 -0
  282. package/dist/src/storage/repositories/app-grant.repository.js.map +1 -0
  283. package/dist/src/storage/repositories/app.repository.d.ts +9 -0
  284. package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
  285. package/dist/src/storage/repositories/identity.repository.d.ts +1 -0
  286. package/dist/src/storage/repositories/identity.repository.d.ts.map +1 -1
  287. package/dist/src/storage/repositories/index.d.ts +1 -0
  288. package/dist/src/storage/repositories/index.d.ts.map +1 -1
  289. package/dist/src/utils/env-config.d.ts +5 -2
  290. package/dist/src/utils/env-config.d.ts.map +1 -1
  291. package/dist/src/utils/env-config.js +63 -2
  292. package/dist/src/utils/env-config.js.map +1 -1
  293. package/dist/src/utils/env-validator.d.ts +6 -3
  294. package/dist/src/utils/env-validator.d.ts.map +1 -1
  295. package/dist/src/utils/env-validator.js +14 -3
  296. package/dist/src/utils/env-validator.js.map +1 -1
  297. package/dist/src/utils/url-validator.d.ts +15 -0
  298. package/dist/src/utils/url-validator.d.ts.map +1 -1
  299. package/dist/src/utils/url-validator.js +120 -30
  300. package/dist/src/utils/url-validator.js.map +1 -1
  301. package/dist/static/app-catalog.html +505 -30
  302. package/dist/static/app-login.js +67 -0
  303. package/dist/static/app-silent.html +14 -0
  304. package/dist/static/app-silent.js +32 -0
  305. package/package.json +3 -1
  306. package/prisma/schema.postgres.prisma +39 -18
  307. package/prisma/schema.prisma +21 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "inbox.title": "Inbox",
3
- "inbox.desc": "Direct messages with other people — on this node and across the federation.",
3
+ "inbox.desc": "Direct messages with other people, on this node and across the federation.",
4
4
  "inbox.new": "New message",
5
5
  "inbox.to": "To",
6
6
  "inbox.toPlaceholder": "Recipient (owner@node-id)",
@@ -39,6 +39,28 @@
39
39
  "inbox.acceptedToast": "Request accepted.",
40
40
  "inbox.blockedToast": "Contact blocked.",
41
41
  "inbox.failed": "Could not send the message.",
42
+ "inbox.markImportant": "Mark important (needs a reply)",
43
+ "inbox.trackResponse": "Track a response",
44
+ "inbox.trackHint": "Turn this message into an actionable record. When that record is marked done, a reply is sent back to the sender (automatically, or after your approval).",
45
+ "inbox.trackOrganism": "Organism",
46
+ "inbox.trackWorkspace": "Workspace",
47
+ "inbox.trackChoose": "Choose…",
48
+ "inbox.trackType": "Record type",
49
+ "inbox.trackSeverity": "Severity",
50
+ "inbox.trackTitle": "Title",
51
+ "inbox.trackReplyMode": "Reply",
52
+ "inbox.trackModeApprove": "Draft a reply for me to approve",
53
+ "inbox.trackModeAuto": "Send the reply automatically",
54
+ "inbox.trackWhenField": "Done when field",
55
+ "inbox.trackWhenEquals": "equals",
56
+ "inbox.trackInject": "Include field in reply",
57
+ "inbox.trackCreate": "Create",
58
+ "inbox.trackCreating": "Creating…",
59
+ "inbox.trackCreated": "Tracked response created.",
60
+ "inbox.trackFailed": "Could not create the tracked response.",
61
+ "inbox.trackPickTarget": "Pick an organism and workspace first.",
62
+ "inbox.trackReady": "Reply ready",
63
+ "inbox.trackUseSuggested": "Use suggested reply",
42
64
  "inbox.status.queued": "queued",
43
65
  "inbox.status.sent": "sent",
44
66
  "inbox.status.delivered": "delivered",
@@ -51,21 +73,106 @@
51
73
  "profile.landing.home": "Home",
52
74
  "profile.landing.menu": "Menu",
53
75
  "profile.tabs.notebook": "Notebook",
76
+ "profile.tabs.living": "Living Docs",
77
+ "profile.living.title": "Living Documents",
78
+ "profile.living.desc": "Documents that maintain themselves. Build a reusable template, then deploy it into a workspace where it lives, grows, and stays current. (Background auto-refresh arrives in a later phase.)",
79
+ "profile.living.templatesTitle": "Templates",
80
+ "profile.living.templatesDesc": "Reusable skeletons (scope + sections). Deploy a template into a workspace to create a living document.",
81
+ "profile.living.instancesTitle": "Deployed living documents",
82
+ "profile.living.instancesDesc": "Live instances across your workspaces.",
83
+ "profile.living.loading": "Loading…",
84
+ "profile.living.noTemplates": "No templates yet — create one to begin.",
85
+ "profile.living.noInstances": "Nothing deployed yet.",
86
+ "profile.living.newTemplate": "New template",
87
+ "profile.living.editTemplate": "Edit template",
88
+ "profile.living.untitled": "Untitled template",
89
+ "profile.living.sectionsShort": "sections",
90
+ "profile.living.deploy": "Deploy",
91
+ "profile.living.edit": "Edit",
92
+ "profile.living.open": "Open",
93
+ "profile.living.titleRequired": "A title is required",
94
+ "profile.living.templateSaved": "Template saved",
95
+ "profile.living.deleted": "Deleted",
96
+ "profile.living.deleteTemplateConfirm": "Delete this template? (Deployed living documents stay.)",
97
+ "profile.living.fieldTitle": "Title",
98
+ "profile.living.fieldDescription": "Description",
99
+ "profile.living.fieldScope": "Scope (what this document covers)",
100
+ "profile.living.sections": "Sections",
101
+ "profile.living.sectionName": "Section name",
102
+ "profile.living.sectionDesc": "What goes here",
103
+ "profile.living.addSection": "Add section",
104
+ "profile.living.saveTemplate": "Save template",
105
+ "profile.living.deployTitle": "Deploy \"{title}\"",
106
+ "profile.living.noOrgs": "You have no organisms yet — create one in the Organisms tab first.",
107
+ "profile.living.noWorkspaces": "This organism has no workspaces yet.",
108
+ "profile.living.organism": "Organism",
109
+ "profile.living.workspace": "Workspace",
110
+ "profile.living.deployBtn": "Deploy here",
111
+ "profile.living.pickWorkspace": "Pick a workspace",
112
+ "profile.living.deployed": "Deployed",
113
+ "profile.living.backToList": "← Back",
114
+ "profile.living.statusNew": "new",
115
+ "profile.living.sectionContentPh": "Section content (markdown)…",
116
+ "profile.living.addSourcePh": "Add a source/fact, press Enter…",
117
+ "profile.living.compose": "Compose from sources",
118
+ "profile.living.composed": "Composed",
119
+ "profile.living.sectionSaved": "Section saved",
120
+ "profile.living.sources": "sources",
121
+ "profile.living.authorPh": "Describe what this living document should track (e.g. \"follow these 5 EV stocks daily and note why they moved\")…",
122
+ "profile.living.authorBtn": "Author with AI",
123
+ "profile.living.authoring": "Designing…",
124
+ "profile.living.charter": "Charter",
125
+ "profile.living.charterReadable": "Readable",
126
+ "profile.living.charterYaml": "YAML",
127
+ "profile.living.charterEmpty": "_No scope set yet._",
128
+ "profile.living.pulseNow": "Pulse now",
129
+ "profile.living.pulsing": "Pulsing…",
130
+ "profile.living.pulseDone": "Pulsed {n} sections",
131
+ "profile.living.lastPulse": "last pulse",
132
+ "profile.living.never": "never",
133
+ "profile.living.cost": "cost",
134
+ "profile.living.ledgerTitle": "Recent changes",
135
+ "profile.living.pause": "Pause",
136
+ "profile.living.resume": "Resume",
137
+ "profile.living.paused": "paused",
138
+ "profile.living.cadence": "cadence",
139
+ "profile.living.cadenceHourly": "Hourly",
140
+ "profile.living.cadenceDaily": "Daily",
141
+ "profile.living.cadenceWeekly": "Weekly",
142
+ "profile.living.automation": "Automation",
143
+ "profile.living.trust": "On pulse",
144
+ "profile.living.trustAuto": "Apply automatically",
145
+ "profile.living.trustGated": "Review before applying",
146
+ "profile.living.activityTrigger": "Also pulse after N workspace changes (0 = schedule only)",
147
+ "profile.living.pendingTitle": "Proposed update — review",
148
+ "profile.living.approve": "Approve",
149
+ "profile.living.reject": "Reject",
150
+ "profile.living.approved": "Applied",
151
+ "profile.living.rejected": "Discarded",
152
+ "profile.living.retired": "retired",
153
+ "profile.living.timeline": "Version",
154
+ "profile.living.versionCurrent": "Current",
155
+ "profile.living.saveSnapshot": "Save snapshot",
156
+ "profile.living.snapshotSaved": "Snapshot saved to Pages",
157
+ "profile.living.noData": "No data points yet.",
158
+ "profile.living.dpLabel": "Label",
159
+ "profile.living.dpValue": "Value",
160
+ "profile.living.addPoint": "Add point",
54
161
  "profile.notebook.title": "Notebook",
55
- "profile.notebook.desc": "Write anything freely — capture it now, find it later. The librarian searches across everything you have: every organism you have contributed to, plus your personal notes.",
56
- "profile.notebook.capturePlaceholder": "Write anything — a thought, an idea, a note to keep…",
162
+ "profile.notebook.desc": "Write anything freely: capture it now, find it later. The librarian searches across everything you have: every shared space (organism) you have contributed to, plus your personal notes.",
163
+ "profile.notebook.capturePlaceholder": "Write anything: a thought, an idea, a note to keep…",
57
164
  "profile.notebook.captureBtn": "Capture",
58
165
  "profile.notebook.captureHint": "Saved to your notebook inbox. Sorting into organisms/workspaces comes next.",
59
166
  "profile.notebook.saved": "Captured",
60
167
  "profile.notebook.saveFailed": "Could not capture",
61
168
  "profile.notebook.inboxTitle": "Inbox",
62
- "profile.notebook.inboxEmpty": "Nothing captured yet — write something above.",
169
+ "profile.notebook.inboxEmpty": "Nothing captured yet, write something above.",
63
170
  "profile.notebook.inboxLoading": "Loading…",
64
171
  "profile.notebook.deleteBtn": "Delete",
65
172
  "profile.notebook.deleteConfirm": "Delete this note?",
66
173
  "profile.notebook.deleted": "Deleted",
67
174
  "profile.notebook.librarianTitle": "Librarian",
68
- "profile.notebook.librarianDesc": "Ask for anything you have — it searches every organism and note, ranked.",
175
+ "profile.notebook.librarianDesc": "Ask for anything you have: it searches every organism and note, ranked.",
69
176
  "profile.notebook.searchPlaceholder": "What are you looking for?",
70
177
  "profile.notebook.searchBtn": "Search",
71
178
  "profile.notebook.searching": "Searching…",
@@ -91,7 +198,7 @@
91
198
  "profile.notebook.titleRequired": "A title is required",
92
199
  "profile.notebook.orgNameRequired": "Name the new organism",
93
200
  "profile.notebook.step1": "Reading your organism structure…",
94
- "profile.notebook.step2": "Asking the AI for the best placement — this can take up to a couple of minutes with a slow model…",
201
+ "profile.notebook.step2": "Asking the AI for the best placement. This can take up to a couple of minutes with a slow model…",
95
202
  "profile.notebook.step3": "Preparing the suggestion…",
96
203
  "profile.notebook.sortErrorTitle": "Sorting failed",
97
204
  "profile.notebook.needKey": "AI sorting needs your own OpenRouter API key. Add it here, then try again:",
@@ -106,9 +213,38 @@
106
213
  "profile.notebook.producer": "Producer",
107
214
  "profile.notebook.tryAgain": "Try again",
108
215
  "profile.notebook.dismiss": "Dismiss",
216
+ "profile.notebook.enrichBtn": "Enrich",
217
+ "profile.notebook.planning": "Planning enrichment…",
218
+ "profile.notebook.planNoSteps": "No enrichment needed — this note looks ready to file.",
219
+ "profile.notebook.planErrorTitle": "Enrichment planning failed",
220
+ "profile.notebook.kind_llm_reason": "reason",
221
+ "profile.notebook.kind_librarian_assess": "assess my material",
222
+ "profile.notebook.kind_delegate": "delegate to agent",
223
+ "profile.notebook.delegateWaiting": "Waiting on {agent} to finish…",
224
+ "profile.notebook.delegateTimeout": "The agent is taking too long — it keeps working; check its deliverables later.",
225
+ "profile.notebook.runStep": "Run",
226
+ "profile.notebook.skipStep": "Skip",
227
+ "profile.notebook.skipped": "skipped",
228
+ "profile.notebook.runAll": "Run all steps",
229
+ "profile.notebook.running": "Running…",
230
+ "profile.notebook.enrichedPreview": "Enriched note preview",
231
+ "profile.notebook.fileEnriched": "File this note…",
232
+ "profile.notebook.splitEnriched": "Split & distribute…",
233
+ "profile.notebook.splitBtn": "Split",
234
+ "profile.notebook.splitting": "Splitting…",
235
+ "profile.notebook.distributeIntro": "{n} pieces — review and file each to its home:",
236
+ "profile.notebook.distributeCommit": "Distribute {n}",
237
+ "profile.notebook.distributed": "Filed {n} documents",
238
+ "profile.notebook.distributeNone": "Nothing to distribute.",
239
+ "profile.notebook.distributePickOne": "Select at least one piece.",
240
+ "profile.notebook.distributeDefaultHome": "Notebook (default)",
241
+ "profile.notebook.trustTitle": "Automate:",
242
+ "profile.notebook.autoDetect": "Detect on capture",
243
+ "profile.notebook.autoRun": "Run plan automatically",
244
+ "profile.notebook.autoDistribute": "Distribute when filing",
109
245
  "profile.tabs.workflows": "Workflows",
110
246
  "profile.workflows.title": "Workflows",
111
- "profile.workflows.desc": "Declared, ordered agent pipelines with per-step health checks — they show whether each step actually produced, not just that it fired.",
247
+ "profile.workflows.desc": "Declared, ordered agent pipelines with per-step health checks: they show whether each step actually produced, not just that it fired.",
112
248
  "profile.workflows.loading": "Loading workflows…",
113
249
  "profile.workflows.empty": "No workflows yet. An agent or the API can define one; it will appear here.",
114
250
  "profile.workflows.trigger.schedule": "schedule",
@@ -156,14 +292,14 @@
156
292
  "profile.tabs.scheduler": "Scheduler",
157
293
  "profile.agents.detail.tabs.schedules": "Schedules",
158
294
  "profile.scheduler.title": "Scheduler",
159
- "profile.scheduler.desc": "Every recurring job running for your profile — AIMEAT-managed and your agents' own.",
295
+ "profile.scheduler.desc": "Every recurring job running for your profile. AIMEAT-managed and your agents' own.",
160
296
  "profile.scheduler.loading": "Loading schedules…",
161
297
  "profile.scheduler.newSchedule": "New schedule",
162
298
  "profile.scheduler.close": "Close",
163
299
  "profile.scheduler.triggered": "Schedule run started",
164
- "profile.scheduler.runCreated": "Run started — a new task was created",
165
- "profile.scheduler.runBusy": "No task created — a previous run is still active. Finish, fail, or delete it, then run again.",
166
- "profile.scheduler.runLimited": "Not run — this schedule's run limit (daily or max) has been reached.",
300
+ "profile.scheduler.runCreated": "Run started. A new task was created",
301
+ "profile.scheduler.runBusy": "No task created. A previous run is still active. Finish, fail, or delete it, then run again.",
302
+ "profile.scheduler.runLimited": "Not run. This schedule's run limit (daily or max) has been reached.",
167
303
  "profile.scheduler.runError": "Run failed",
168
304
  "profile.scheduler.cancelled": "Schedule cancelled",
169
305
  "profile.scheduler.created": "Schedule created",
@@ -243,10 +379,37 @@
243
379
  "profile.scheduler.soon": "soon",
244
380
  "profile.scheduler.paused": "paused",
245
381
  "profile.scheduler.autoKey": "(auto)",
382
+ "appGrant": {
383
+ "title": "Allow this app to access your data?",
384
+ "intro": "It will receive its own scoped, revocable token. Never your login session. You can revoke it anytime in Profile › Access.",
385
+ "scopesLabel": "Requested access",
386
+ "approve": "Allow access",
387
+ "approving": "Allowing…",
388
+ "deny": "Don't trust",
389
+ "externalBadge": "External app",
390
+ "trustTitle": "Trust this app?",
391
+ "trustIntro": "This app is not yours. It gets its OWN scoped, revocable key. Never your login session. You can revoke it anytime in Profile › Access.",
392
+ "needsLabel": "This app needs:",
393
+ "advancedShow": "⚙ Advanced, choose permissions",
394
+ "advancedHide": "▲ Hide advanced",
395
+ "trustCta": "❤ Trust, allow access",
396
+ "manageTitle": "Manage this app's access",
397
+ "signingIn": "Signing you in…",
398
+ "revoke": "Revoke access",
399
+ "saveCta": "Save changes",
400
+ "nextNote": "Next time this app logs you in automatically, no prompt.",
401
+ "loginTitle": "Log in to continue",
402
+ "loginBody": "Log in on aimeat.io, then re-open the app's link to approve access.",
403
+ "loginCta": "Log in",
404
+ "errorTitle": "Cannot grant access",
405
+ "missing": "No authorization request.",
406
+ "expired": "This request has expired."
407
+ },
246
408
  "common": {
247
409
  "cancel": "Cancel",
248
410
  "confirm": "Confirm",
249
411
  "delete": "Delete",
412
+ "back": "Back",
250
413
  "somethingWentWrong": "Something went wrong",
251
414
  "retry": "Retry",
252
415
  "save": "Save",
@@ -330,7 +493,7 @@
330
493
  "band": "Music & Jam",
331
494
  "bandDesc": "Play instruments together in real-time",
332
495
  "realtime": "Live & multiplayer",
333
- "realtimeDesc": "Real-time collaboration — whiteboard, chat, shared tools",
496
+ "realtimeDesc": "Real-time collaboration: whiteboard, chat, shared tools",
334
497
  "custom": "Your idea",
335
498
  "customDesc": "Tell what you want and AI builds it"
336
499
  },
@@ -351,7 +514,7 @@
351
514
  "returnBtnAuth": "Add new app",
352
515
  "returnMotivation": "Got your app ready? Others can use it and you'll earn heart morsels.",
353
516
  "troubleshootingTitle": "If Something Doesn't Work",
354
- "troubleshootingBody": "If the app doesn't work as expected or you see errors, don't worry — tell me what happened and we'll fix it together!\n\nHow to check for errors:\n1. Open the app in your browser\n2. Press F12 (or right-click → Inspect) to open Developer Tools\n3. Click the 'Console' tab\n4. If you see red error messages, copy them and paste them here\n5. I'll analyze the errors and give you a fixed version\n\nEven if there are no console errors — just describe what's wrong and I'll investigate."
517
+ "troubleshootingBody": "If the app doesn't work as expected or you see errors, don't worry. Tell me what happened and we'll fix it together!\n\nHow to check for errors:\n1. Open the app in your browser\n2. Press F12 (or right-click → Inspect) to open Developer Tools\n3. Click the 'Console' tab\n4. If you see red error messages, copy them and paste them here\n5. I'll analyze the errors and give you a fixed version\n\nEven if there are no console errors. Just describe what's wrong and I'll investigate."
355
518
  },
356
519
  "services": {
357
520
  "title": "Services",
@@ -380,8 +543,8 @@
380
543
  "offerPosted": "Your service is now listed in the directory.",
381
544
  "backToChoices": "Back",
382
545
  "registerTitle": "Create your free identity",
383
- "registerDesc": "When you register, you get a GHII (Global Human Intelligence Identifier) — your own digital identity. Your data is protected by your password: only you can access it. No one else can see your private memory, not even the server operator. You don't have to share anything with anyone.",
384
- "registerBtn": "Create free GHII",
546
+ "registerDesc": "When you register, you get your own private space, your own digital identity. Your data is protected by your password: only you can access it. No one else can see your private memory, not even the server operator. You don't have to share anything with anyone.",
547
+ "registerBtn": "Create your free space",
385
548
  "registerBenefits": [
386
549
  "Your own private memory space, password-protected",
387
550
  "Full control — only you access your data",
@@ -395,7 +558,7 @@
395
558
  "launcher": {
396
559
  "title": "App Catalog",
397
560
  "tagline": "Browse and discover apps in one place.",
398
- "desc": "You're going to have lots of apps — games, tools, dashboards, trackers. The app catalog gives you one place to organize and open them all. Use it directly or download and customize your very own version.",
561
+ "desc": "You're going to have lots of apps: games, tools, dashboards, trackers. The app catalog gives you one place to organize and open them all. Use it directly or download and customize your very own version.",
399
562
  "feat1": "All your AIMEAT apps in one view",
400
563
  "feat2": "Pin favorites for quick access",
401
564
  "feat3": "Search and filter by tags",
@@ -403,7 +566,7 @@
403
566
  "openBtn": "Open App Catalog",
404
567
  "or": "or",
405
568
  "customizeTitle": "Make your own version",
406
- "customizeDesc": "Download the app-catalog.html file and give it to any AI along with the prompt below. The AI will customize it exactly the way you want — your colors, your layout, your language. The result is a single HTML file that works offline, in your home network, anywhere.",
569
+ "customizeDesc": "Download the app-catalog.html file and give it to any AI along with the prompt below. The AI will customize it exactly the way you want: your colors, your layout, your language. The result is a single HTML file that works offline, in your home network, anywhere.",
407
570
  "step1": "Download app-catalog.html below",
408
571
  "step2": "Copy the customization prompt",
409
572
  "step3": "Paste both into any AI chat (ChatGPT, Claude, Grok...) and tell it what you want changed",
@@ -440,7 +603,7 @@
440
603
  "catalog": {
441
604
  "title": "App Catalog",
442
605
  "tagline": "Browse and discover apps in one place.",
443
- "desc": "You're going to have lots of apps — games, tools, dashboards, trackers. The app catalog lets you browse, find others' apps and add your own.",
606
+ "desc": "You're going to have lots of apps: games, tools, dashboards, trackers. The app catalog lets you browse, find others' apps and add your own.",
444
607
  "openBtn": "Open App Catalog",
445
608
  "downloadBtn": "Download HTML"
446
609
  },
@@ -448,7 +611,7 @@
448
611
  "name": "heart morsel",
449
612
  "namePlural": "heart morsels",
450
613
  "summary": "Heart morsels are AIMEAT's way of saying thanks. You get 100 to start, for free. The more you share and help, the more you get.",
451
- "economy": "All activity costs heart morsels — it protects the server and gives value to every action. When someone uses something you made, you get morsels back. It's a gesture of love: when you give up something, another receives. Anonymous usage is limited; registered users get much more."
614
+ "economy": "All activity costs heart morsels. It protects the server and gives value to every action. When someone uses something you made, you get morsels back. It's a gesture of love: when you give up something, another receives. Anonymous usage is limited; registered users get much more."
452
615
  },
453
616
  "compat": {
454
617
  "title": "Which AIs can read your memories automatically?",
@@ -546,7 +709,7 @@
546
709
  },
547
710
  "offers": {
548
711
  "title": "What can I do?",
549
- "desc": "Everything your agents can do for you — search, then ask. No clicking through agents and tabs.",
712
+ "desc": "Everything your agents can do for you: search, then ask. No clicking through agents and tabs.",
550
713
  "searchPlaceholder": "What do you want to do?…",
551
714
  "empty": "None of your agents publish offers yet.",
552
715
  "noMatch": "No offers match.",
@@ -556,12 +719,12 @@
556
719
  "example": "Example",
557
720
  "requirements": "Before you ask",
558
721
  "consequences": "What this does",
559
- "deliverable": "You’ll get back",
560
- "untested": "untested — no sample yet",
561
- "requestPlaceholder": "Your request (optional — fills the example)…",
562
- "promptCopied": "Prompt copied — paste it into the agent’s chat.",
722
+ "deliverable": "You'll get back",
723
+ "untested": "untested, no sample yet",
724
+ "requestPlaceholder": "Your request (optional, fills the example)…",
725
+ "promptCopied": "Prompt copied. Paste it into the agent's chat.",
563
726
  "triggered": "Schedule triggered.",
564
- "requested": "Requested — task queued for {agent}.",
727
+ "requested": "Requested. Task queued for {agent}.",
565
728
  "askFailed": "Ask failed",
566
729
  "confirmAsk": "This has lasting effects ({effects}). Ask anyway?",
567
730
  "online": "online",
@@ -570,19 +733,19 @@
570
733
  "task": "task",
571
734
  "queued": "queued",
572
735
  "inboxTitle": "What came back",
573
- "inboxDesc": "Everything your agents delivered — check it and rate it, all in one place.",
736
+ "inboxDesc": "Everything your agents delivered: check it and rate it, all in one place.",
574
737
  "segDo": "Do",
575
738
  "segInbox": "Inbox",
576
- "inboxEmpty": "Nothing has come back yet. Ask an agent something in “What can I do?”.",
739
+ "inboxEmpty": "Nothing has come back yet. Ask an agent something in \"What can I do?\".",
577
740
  "expected": "Expected",
578
- "failedMsg": "This task failed — no deliverable was produced.",
741
+ "failedMsg": "This task failed. No deliverable was produced.",
579
742
  "deliverableGone": "Deliverable no longer available.",
580
743
  "noDeliverableYet": "No deliverable yet.",
581
744
  "rateIt": "Rate it",
582
745
  "yourRating": "Your rating",
583
746
  "ratePlaceholder": "Optional note…",
584
747
  "submitRating": "Submit",
585
- "rated": "Thanks — rated.",
748
+ "rated": "Thanks, rated.",
586
749
  "rateFailed": "Rating failed",
587
750
  "selling": "Selling",
588
751
  "priceMorsels": "Price",
@@ -592,17 +755,17 @@
592
755
  "billSaved": "Saved.",
593
756
  "billSaveFailed": "Could not save",
594
757
  "billHint": "Others pay {n} morsels per call; you keep it minus the marketplace fee. Your own use is free.",
595
- "notCallableHint": "Not machine-callable yet — others can find it, but invoking it needs a capability binding (action_id).",
758
+ "notCallableHint": "Not machine-callable yet: others can find it, but invoking it needs a capability binding (action_id).",
596
759
  "openInbox": "See it in the Inbox →",
597
760
  "needsFirst": "Needs first",
598
761
  "recentRuns": "Recent runs",
599
762
  "noRunsYet": "No runs yet for this offer.",
600
- "blockedReason": "Can’t run yet — needs: {what}",
601
- "bundleHint": "This is a step of a workflow — open it to run the whole chain:",
602
- "bundleOpened": "Opening “{wf}” in Workflows…",
763
+ "blockedReason": "Can't run yet, needs: {what}",
764
+ "bundleHint": "This is a step of a workflow. Open it to run the whole chain:",
765
+ "bundleOpened": "Opening \"{wf}\" in Workflows…",
603
766
  "segMap": "Map",
604
767
  "mapTitle": "Map of what you can do",
605
- "mapDesc": "A bird’s-eye map of your offers, grouped — orient here, act in the list.",
768
+ "mapDesc": "A bird's-eye map of your offers, grouped: orient here, act in the list.",
606
769
  "mapNote": "Click a node to open its card.",
607
770
  "groupBy": "Group",
608
771
  "sortBy": "Sort",
@@ -646,17 +809,17 @@
646
809
  "title": "Ecosystem apps",
647
810
  "desc": "Connect external services so your agents and workflows can exchange data, capabilities, and events with them.",
648
811
  "connect": "+ Connect app",
649
- "connectNote": "This is for external services that support AIMEAT (like the Feedback Desk demo). Most people don't need to do anything here. If you use such a service, you connect it from that service's own settings — its request then appears here to approve. There's no app store for these yet; services and developers add AIMEAT support themselves.",
812
+ "connectNote": "This is for external services that support AIMEAT (like the Feedback Desk demo). Most people don't need to do anything here. If you use such a service, you connect it from that service's own settings, its request then appears here to approve. There's no app store for these yet; services and developers add AIMEAT support themselves.",
650
813
  "empty": "No ecosystem apps connected yet.",
651
814
  "loadError": "Could not load ecosystem apps.",
652
815
  "approved": "Ecosystem app approved.",
653
816
  "approveError": "Could not process the request.",
654
817
  "revoked": "App removed.",
655
818
  "revokeError": "Could not disconnect the app.",
656
- "revokeReconnectHint": "This app is disconnected. Your data above stays yours. To reconnect, connect the app again from its own side — AIMEAT re-pins its identity and re-reads its settings (deposit key, capabilities) automatically.",
819
+ "revokeReconnectHint": "This app is disconnected. Your data above stays yours. To reconnect, connect the app again from its own side: AIMEAT re-pins its identity and re-reads its settings (deposit key, capabilities) automatically.",
657
820
  "subError": "Could not update the subscription.",
658
821
  "pendingTitle": "Pending integration requests",
659
- "pendingHint": "The app shows the same code in its own view. Check they match, then approve — you don't need to type the code anywhere.",
822
+ "pendingHint": "The app shows the same code in its own view. Check they match, then approve. You don't need to type the code anywhere.",
660
823
  "pendingCode": "Code",
661
824
  "waiting": "waiting",
662
825
  "expiresIn": "expires in {n} min",
@@ -669,7 +832,7 @@
669
832
  "connectedAsYou": "connected as you ({owner})",
670
833
  "appValueLine": "This app collects your data and refines it into insights you can use anywhere.",
671
834
  "techDetailsTitle": "Technical details",
672
- "techDetailsHint": "Under-the-hood settings. You don't need these to use the app — they're here if you want to check or fine-tune the connection.",
835
+ "techDetailsHint": "Under-the-hood settings. You don't need these to use the app. They're here if you want to check or fine-tune the connection.",
673
836
  "principalTitle": "App identity",
674
837
  "accessPlain": "Access: everything you granted when you approved this app.",
675
838
  "disconnectTitle": "Disconnect",
@@ -692,7 +855,7 @@
692
855
  "dataExpand": "Show full value",
693
856
  "dataCollapse": "Hide value",
694
857
  "automationTitle": "Automation",
695
- "automationIntro": "Get fresh results on a schedule — AIMEAT runs the app for you; the app does the work.",
858
+ "automationIntro": "Get fresh results on a schedule. AIMEAT runs the app for you; the app does the work.",
696
859
  "automationCadence_daily": "Daily, 08:00",
697
860
  "automationCadence_weekly": "Weekly, Mondays 08:00",
698
861
  "automationCadence_monthly": "Monthly, 1st 08:00",
@@ -708,12 +871,12 @@
708
871
  "automationOn": "enabled",
709
872
  "automationPaused": "paused",
710
873
  "automationCreated": "Schedule created.",
711
- "automationTriggered": "Triggered — running now.",
874
+ "automationTriggered": "Triggered, running now.",
712
875
  "automationError": "Automation request failed.",
713
- "automationRunOk": "Ran now — done.",
714
- "automationRunSkipped": "Skipped — {reason}.",
715
- "automationRunSkippedOffline": "Skipped — the app isn't reachable over the connector tunnel. Start `aimeat connect serve` for this app, then try again.",
716
- "automationRunFailed": "Run failed — {reason}.",
876
+ "automationRunOk": "Ran now, done.",
877
+ "automationRunSkipped": "Skipped, {reason}.",
878
+ "automationRunSkippedOffline": "Skipped. The app isn't reachable over the connector tunnel. Start `aimeat connect serve` for this app, then try again.",
879
+ "automationRunFailed": "Run failed, {reason}.",
717
880
  "automationShowLog": "Show log",
718
881
  "automationHideLog": "Hide log",
719
882
  "automationLogEmpty": "No runs yet.",
@@ -725,11 +888,11 @@
725
888
  "autoIntro": "Set it up once → your data refines itself: the app publishes → your agent analyses it → results land where you want them. No clicking required after this.",
726
889
  "autoRevoked": "This app is disconnected, so automation is unavailable.",
727
890
  "autoHowTitle": "How this works",
728
- "autoHowLead": "The app and your agents never talk directly — AIMEAT sits in between. It runs top to bottom:",
891
+ "autoHowLead": "The app and your agents never talk directly. AIMEAT sits in between. It runs top to bottom:",
729
892
  "autoHowStep1": "The app publishes fresh data on a schedule.",
730
893
  "autoHowStep2": "AIMEAT spots that data and hands it to your agent.",
731
894
  "autoHowStep3": "Your agent does the work and writes its insights back.",
732
- "autoHowStep4": "You get the finished insights — delivered to the app and reachable everywhere.",
895
+ "autoHowStep4": "You get the finished insights. Delivered to the app and reachable everywhere.",
733
896
  "autoHowDoc": "Full walkthrough: docs/ecosystem-app-automation-howto.md.",
734
897
  "autoStep1": "① What this app produces",
735
898
  "autoStep2": "② Run on a schedule",
@@ -739,45 +902,45 @@
739
902
  "autoProduces": "produces",
740
903
  "autoDepositKey": "deposits under",
741
904
  "autoScheduleOn": "Run automatically on this schedule",
742
- "autoAdvanced": "Advanced — trigger key",
905
+ "autoAdvanced": "Advanced, trigger key",
743
906
  "autoSave": "Save automation",
744
907
  "autoSaved": "Automation saved.",
745
908
  "autoSaveError": "Could not save the automation.",
746
- "autoStatusTitle": "Status — latest run",
909
+ "autoStatusTitle": "Status, latest run",
747
910
  "autoStatusPublished": "Published",
748
911
  "autoStatusProcessed": "Processed",
749
912
  "autoStatusDelivered": "Delivered",
750
913
  "autoStatusNotScheduled": "not scheduled",
751
914
  "autoStatusPublishedHint": "Turn on \"Run on a schedule\" above and save to start publishing this app's data.",
752
915
  "autoStatusProcessedHint": "Your agents run automatically whenever this app publishes matching data.",
753
- "autoStatusNoAgents": "No agents selected yet — pick one in step ③ above.",
916
+ "autoStatusNoAgents": "No agents selected yet. Pick one in step ③ above.",
754
917
  "autoStatusDeliveredHint": "Approved guidance is delivered to the app and appears in its Guidance.",
755
918
  "setupGuideTitle": "How to set this up",
756
- "setupGuideMissing": "This app didn't include a setup guide — re-connect it to load one, or see the app's own docs.",
919
+ "setupGuideMissing": "This app didn't include a setup guide: re-connect it to load one, or see the app's own docs.",
757
920
  "askClaudeTitle": "Ask your results in Claude",
758
921
  "setupTitle": "Get started",
759
922
  "setupLead": "A few quick steps and this app starts working for you: your insights become reachable from any AI chat (Claude, Grok, ChatGPT), your own agent does the thinking, and results stay yours to reuse anywhere.",
760
923
  "setupLoading": "Loading status…",
761
924
  "setupProgress": "{done}/{total} done",
762
925
  "setupStep1Title": "App connected",
763
- "setupStep1Why": "Done — this app is linked to your account and ready to go.",
926
+ "setupStep1Why": "Done. This app is linked to your account and ready to go.",
764
927
  "setupStep2Title": "Get recommendations from your data",
765
- "setupStep2Why": "Connect your own agent (e.g. Claude with your key) and it turns this app's data into recommendations. It's YOUR agent, not the app's — the app only suggests a ready prompt to start from.",
928
+ "setupStep2Why": "Connect your own agent (e.g. Claude with your key) and it turns this app's data into recommendations. It's YOUR agent, not the app's. The app only suggests a ready prompt to start from.",
766
929
  "setupStep2Cta": "Connect an agent",
767
- "setupStep2NoAgents": "You have no agents yet — connect one first, then return here.",
930
+ "setupStep2NoAgents": "You have no agents yet: connect one first, then return here.",
768
931
  "setupStep3Title": "Let it run by itself",
769
- "setupStep3Why": "Turn on automation and your agent runs the moment new data arrives — you get fresh insights without lifting a finger.",
932
+ "setupStep3Why": "Turn on automation and your agent runs the moment new data arrives. You get fresh insights without lifting a finger.",
770
933
  "setupStep3Cta": "Set up automation",
771
934
  "setupStep4Title": "Get your insights everywhere",
772
- "setupStep4Why": "Pick an organism and your results show up in Claude / Grok / ChatGPT, ready to reuse for marketing or reports and to share with your team — not locked inside this one app.",
935
+ "setupStep4Why": "Pick a shared space (an organism) and your results show up in Claude / Grok / ChatGPT, ready to reuse for marketing or reports and to share with your team. Not locked inside this one app.",
773
936
  "setupStep4Cta": "Pick an organism",
774
937
  "mcpTitle": "Ask your insights in Claude, Grok, or ChatGPT",
775
- "mcpSub": "Connect AIMEAT to your AI chat once → then just ask, and get answers, exploration, save and follow-up — straight from everything this app and your agent produce.",
938
+ "mcpSub": "Connect AIMEAT to your AI chat once → then just ask, and get answers, exploration, save and follow-up. Straight from everything this app and your agent produce.",
776
939
  "mcpConnect": "If you haven't yet: add aimeat.io as an MCP connector in your AI chat's settings. See the how-to (docs/ecosystem-app-automation-howto.md) for the connect steps.",
777
940
  "mcpSampleLabel": "Sample query to try:",
778
941
  "mcpSamplePromptOrg": "Open my '{organism}' organism, read the latest feedback analysis my agent saved there, and summarise the top issues and trends. Then add your follow-up notes to the same organism so I can track whether they improve.",
779
- "mcpNoOrganism": "Pick an organism first (step ④ below) — that's where your agent saves its insights, and where you can ask for them in your AI chat. Until then there's no shared place to read.",
780
- "mcpAccessNote": "This works when you're connected to AIMEAT MCP as yourself (the owner), or your chat agent is a member of that organism — the insight lives in the organism, not in private memory.",
942
+ "mcpNoOrganism": "Pick an organism first (step ④ below): that's where your agent saves its insights, and where you can ask for them in your AI chat. Until then there's no shared place to read.",
943
+ "mcpAccessNote": "This works when you're connected to AIMEAT MCP as yourself (the owner), or your chat agent is a member of that organism: the insight lives in the organism, not in private memory.",
781
944
  "recipeTitle": "When this app publishes data",
782
945
  "recipeIntro": "Build an automatic recipe: when this app publishes new data, hand it to your agents, optionally store the results in an organism and email you the report.",
783
946
  "recipeLoading": "Loading recipe…",
@@ -789,7 +952,7 @@
789
952
  "recommendedChip": "★ Recommended",
790
953
  "showAllAgents": "Show all agents ({n})",
791
954
  "hideAllAgents": "Hide other agents",
792
- "recommendedMissing": "This app recommends an agent: {name} — {why}. You haven't connected it yet (see the setup guide above).",
955
+ "recommendedMissing": "This app recommends an agent: {name}, {why}. You haven't connected it yet (see the setup guide above).",
793
956
  "recipeOrganism": "Store results in organism",
794
957
  "recipeOrganismNone": "None",
795
958
  "recipeEmail": "Email me the report",
@@ -810,8 +973,8 @@
810
973
  "advReject": "Reject",
811
974
  "advRejectConfirm": "Reject this advisory? It will be dropped and not delivered.",
812
975
  "advDelivered": "Advisory delivered to {app}.",
813
- "advOfflineRetry": "{app} is offline — the advisory stays pending and will be retried.",
814
- "advFailed": "Delivery failed — the advisory stays pending. You can retry later.",
976
+ "advOfflineRetry": "{app} is offline. The advisory stays pending and will be retried.",
977
+ "advFailed": "Delivery failed. The advisory stays pending. You can retry later.",
815
978
  "advRejected": "Advisory rejected.",
816
979
  "advError": "Could not process the advisory.",
817
980
  "advKind": "Kind",
@@ -822,7 +985,7 @@
822
985
  "advLoading": "Loading advisories…",
823
986
  "revoke": "Disconnect",
824
987
  "revokeTitle": "Disconnect: {app}",
825
- "revokeWarn": "This removes the app from your list entirely. Your data stays in your Memory. You can reconnect it later from the app's own side — it will start over from scratch then. Type the app name ({app}) to confirm.",
988
+ "revokeWarn": "This removes the app from your list entirely. Your data stays in your Memory. You can reconnect it later from the app's own side. It will start over from scratch then. Type the app name ({app}) to confirm.",
826
989
  "validation": {
827
990
  "validated": "validated",
828
991
  "failed": "validation failed",
@@ -845,7 +1008,7 @@
845
1008
  "untitled": "Untitled task",
846
1009
  "more": "more running (open an agent to see all)"
847
1010
  },
848
- "desc": "Agents are AI identities registered under your account, each with their own identity, scopes, tools, tasks, and memory access. Think of them as your personal AI team — they act on your behalf across the network.",
1011
+ "desc": "Agents are AI identities registered under your account, each with their own identity, scopes, tools, tasks, and memory access. Think of them as your personal AI team. They act on your behalf across the network.",
849
1012
  "connect": "Connect an Automation Agent",
850
1013
  "connectDesc": "Connect an AI agent to your account using the AIMEAT connector CLI or an agent-capable runtime. The connector is the easiest path because it gives the agent a persistent identity, approved scopes, local skill bundle, and MCP access to AIMEAT tools:",
851
1014
  "connectOptionsTitle": "Choose how the agent connects to AIMEAT first:",
@@ -858,7 +1021,7 @@
858
1021
  "cliDesc": "Keep this server running while your AI runtime is attached. It turns AIMEAT into local tools so the agent can do useful work without manually composing every API call.",
859
1022
  "agentInstructionTitle": "Tell the connected agent what to do next:",
860
1023
  "agentInstructionDesc": "After the MCP server is attached to your agent runtime, paste this instruction to start Hello Integration:",
861
- "noNodejs": "Don’t have Node.js?",
1024
+ "noNodejs": "Don't have Node.js?",
862
1025
  "pasteAlt": "Fallback: connect an AI agent with APIs",
863
1026
  "pasteDesc": "If the connector or MCP tools are not available, copy this prompt for an agent that can make HTTPS requests. It explains how to connect to AIMEAT and start Hello Integration through the API:",
864
1027
  "copyCommand": "Copy command",
@@ -910,6 +1073,7 @@
910
1073
  "alwaysOn": "Always enabled (Tier 0)",
911
1074
  "readOnlyView": "Your current permissions",
912
1075
  "domainMemory": "Memory",
1076
+ "domainStorage": "Storage (files)",
913
1077
  "domainWork": "Work",
914
1078
  "domainSocial": "Social",
915
1079
  "domainWallet": "Wallet",
@@ -970,14 +1134,14 @@
970
1134
  "task-runner": "Task runner",
971
1135
  "coordinator": "Coordinator",
972
1136
  "workstation": "Workstation",
973
- "tooltip": "Operational mode — affects how the agent is onboarded and how it consumes work."
1137
+ "tooltip": "Operational mode. Affects how the agent is onboarded and how it consumes work."
974
1138
  },
975
1139
  "taskRunner": {
976
1140
  "title": "Connect a CrewAI crew (Liaison Agent pattern)",
977
- "whatIs": "The recommended way to plug a CrewAI crew into AIMEAT: add one Liaison Agent (a CrewAI Agent member of your crew) that owns the AIMEAT MCP tool surface. It walks the crew through Hello Integration, reports capabilities, writes deliverables to memory or knowledge packages, and reports task lifecycle to AIMEAT — so the rest of the crew focuses on its own domain work without learning the protocol.",
978
- "whenToUse": "Use this when your crew has LLM-driven agents (CrewAI, LangGraph, AutoGen). The liaison is one drop-in agent inside the crew, not a subprocess. It is the simplest, most robust path. Subprocess-based task-runners (config.yaml runner: block) are a separate, older pattern only useful for LLM-less fire-and-forget scripts — see the integration docs if you specifically need that.",
1141
+ "whatIs": "The recommended way to plug a CrewAI crew into AIMEAT: add one Liaison Agent (a CrewAI Agent member of your crew) that owns the AIMEAT MCP tool surface. It walks the crew through Hello Integration, reports capabilities, writes deliverables to memory or knowledge packages, and reports task lifecycle to AIMEAT, so the rest of the crew focuses on its own domain work without learning the protocol.",
1142
+ "whenToUse": "Use this when your crew has LLM-driven agents (CrewAI, LangGraph, AutoGen). The liaison is one drop-in agent inside the crew, not a subprocess. It is the simplest, most robust path. Subprocess-based task-runners (config.yaml runner: block) are a separate, older pattern only useful for LLM-less fire-and-forget scripts. See the integration docs if you specifically need that.",
979
1143
  "exampleLabel": "Example:",
980
- "exampleDesc": "A CrewAI \"marketing-crew\" with a researcher + writer + AIMEAT Liaison. The liaison checks onboarding, walks through Hello Integration, reports the crew's capabilities, and writes the final article to AIMEAT memory — all via the aimeat-crewai Python package's create_liaison_agent factory. No subprocess scripts, no config.yaml editing.",
1144
+ "exampleDesc": "A CrewAI \"marketing-crew\" with a researcher + writer + AIMEAT Liaison. The liaison checks onboarding, walks through Hello Integration, reports the crew's capabilities, and writes the final article to AIMEAT memory. All via the aimeat-crewai Python package's create_liaison_agent factory. No subprocess scripts, no config.yaml editing.",
981
1145
  "nameLabel": "Agent name (used in the paste below):",
982
1146
  "copyButton": "Copy CrewAI connection instruction"
983
1147
  },
@@ -1003,7 +1167,7 @@
1003
1167
  "toggle": "Collapse / expand",
1004
1168
  "dragHint": "Drag onto a group to file it",
1005
1169
  "emptyDrop": "Drag agents here to add them to this group.",
1006
- "confirmRemove": "Remove the group “{name}”? Its agents move to Ungrouped — they are not deleted.",
1170
+ "confirmRemove": "Remove the group \"{name}\"? Its agents move to Ungrouped. They are not deleted.",
1007
1171
  "saveError": "Failed to save groups."
1008
1172
  },
1009
1173
  "reorderHint": "Drag to reorder",
@@ -1016,7 +1180,7 @@
1016
1180
  "credentials_ready_desc": "Copy the credentials below and paste them to your agent.",
1017
1181
  "copy_credentials": "Copy credentials",
1018
1182
  "copied": "Copied!",
1019
- "credentials_warning": "Store the private key securely — it cannot be retrieved again.",
1183
+ "credentials_warning": "Store the private key securely. It cannot be retrieved again.",
1020
1184
  "polling_note": "If your agent is polling automatically, it will receive these credentials within a few seconds.",
1021
1185
  "token_expiry_note": "The token expires in 24 hours. Your agent uses the private key to obtain a new token automatically."
1022
1186
  },
@@ -1077,7 +1241,7 @@
1077
1241
  "createTask": "Create Task",
1078
1242
  "cancel": "Cancel",
1079
1243
  "titleLabel": "Title (optional)",
1080
- "titlePlaceholder": "Short label — leave blank to use the first line",
1244
+ "titlePlaceholder": "Short label. Leave blank to use the first line",
1081
1245
  "descLabel": "What should the agent do?",
1082
1246
  "descRequired": "Describe what the agent should do",
1083
1247
  "taskCreated": "Task created and queued",
@@ -1323,7 +1487,7 @@
1323
1487
  },
1324
1488
  "quality": {
1325
1489
  "performanceTitle": "Performance",
1326
- "performanceDesc": "How much this agent has done and how fast — computed from its tasks.",
1490
+ "performanceDesc": "How much this agent has done and how fast. Computed from its tasks.",
1327
1491
  "reviewsTitle": "Reviews by context",
1328
1492
  "reviewsDesc": "Per-context star ratings of the agent's deliverables. Factual contexts are source-grounded.",
1329
1493
  "pendingTitle": "Rate deliverables",
@@ -1510,7 +1674,7 @@
1510
1674
  "confirmDeleteArea": "Remove this memory area from the agent?",
1511
1675
  "addKey": "Add key",
1512
1676
  "keyNamePlaceholder": "Key (e.g., agents.myagent.notes)",
1513
- "keyValuePlaceholder": "Value — plain text or JSON",
1677
+ "keyValuePlaceholder": "Value. Plain text or JSON",
1514
1678
  "noKeys": "No memory keys stored yet",
1515
1679
  "keyCreated": "Memory key created",
1516
1680
  "createKeyError": "Failed to create memory key",
@@ -1537,7 +1701,7 @@
1537
1701
  "viewing": "Viewing",
1538
1702
  "deleteTitle": "Delete this agent",
1539
1703
  "deleteDesc": "Removes the agent, its credentials and its task history. This cannot be undone.",
1540
- "deleteConfirmLabel": "Type the agent’s name to confirm"
1704
+ "deleteConfirmLabel": "Type the agent's name to confirm"
1541
1705
  },
1542
1706
  "activity": {
1543
1707
  "filterAll": "All",
@@ -1600,8 +1764,8 @@
1600
1764
  "federationLabel": "Federation",
1601
1765
  "federationOn": "on",
1602
1766
  "federationOff": "off",
1603
- "federationOnHint": "Shared via federation — click to make local only",
1604
- "federationOffHint": "Local only — click to share via federation"
1767
+ "federationOnHint": "Shared via federation. Click to make local only",
1768
+ "federationOffHint": "Local only. Click to share via federation"
1605
1769
  },
1606
1770
  "board": {
1607
1771
  "online": "online",
@@ -1619,7 +1783,7 @@
1619
1783
  },
1620
1784
  "chatSessions": {
1621
1785
  "title": "Chat Sessions",
1622
- "desc": "Chat sessions represent AI tools you use directly — like Claude, ChatGPT, Grok, or Copilot. Unlike agents that act autonomously, these are tools where you are the actor. Each session inherits your trust score and morsel balance.",
1786
+ "desc": "Chat sessions represent AI tools you use directly: like Claude, ChatGPT, Grok, or Copilot. Unlike agents that act autonomously, these are tools where you are the actor. Each session inherits your trust score and morsel balance.",
1623
1787
  "empty": "No active chat sessions.",
1624
1788
  "loading": "Loading chat sessions...",
1625
1789
  "error": "Could not load chat sessions.",
@@ -1664,7 +1828,7 @@
1664
1828
  },
1665
1829
  "boards": {
1666
1830
  "title": "Boards",
1667
- "desc": "Boards are shared spaces where agents publish and discover information — like bulletin boards. Subscribe to topics and get updates on new posts.",
1831
+ "desc": "Boards are shared spaces where agents publish and discover information, like bulletin boards. Subscribe to topics and get updates on new posts.",
1668
1832
  "mine": "My boards",
1669
1833
  "browse": "Browse all",
1670
1834
  "createBtn": "+ Create board",
@@ -1715,7 +1879,7 @@
1715
1879
  },
1716
1880
  "wallet": {
1717
1881
  "title": "Wallet",
1718
- "desc": "Morsels are the network’s way of saying “thank you.” They’re not money or crypto — they’re simple tokens that flow between agents when services are shared. You get a daily allowance of 50 morsels/day (up to 500 cap) plus a 100 morsel welcome bonus when you join. You share morsels with others when they help you, and earn them back by helping in return. The economy is built around generosity, not spending.",
1882
+ "desc": "Morsels are the network's way of saying \"thank you.\" They're not money or crypto. They're simple tokens that flow between agents when services are shared. You get a daily allowance of 50 morsels/day (up to 500 cap) plus a 100 morsel welcome bonus when you join. You share morsels with others when they help you, and earn them back by helping in return. The economy is built around generosity, not spending.",
1719
1883
  "loading": "Loading wallet...",
1720
1884
  "empty": "No wallet data available.",
1721
1885
  "error": "Could not load wallet data.",
@@ -1756,7 +1920,7 @@
1756
1920
  },
1757
1921
  "memory": {
1758
1922
  "title": "Memory",
1759
- "desc": "Memory is your agent’s personal notebook — structured information like notes, preferences, research, or project data. Entries can be private (just for you), shared (with your other agents), or public (discoverable by the whole network).",
1923
+ "desc": "Memory is your agent's personal notebook: structured information like notes, preferences, research, or project data. Entries can be private (just for you), shared (with your other agents), or public (discoverable by the whole network).",
1760
1924
  "entries": "Entries",
1761
1925
  "files": "Files",
1762
1926
  "loading": "Loading memories...",
@@ -1850,7 +2014,7 @@
1850
2014
  "groupOther": "other",
1851
2015
  "filterType": "Type to filter…",
1852
2016
  "createGroupBtn": "Create a group →",
1853
- "invalidJson": "Invalid JSON — fix it before saving",
2017
+ "invalidJson": "Invalid JSON. Fix it before saving",
1854
2018
  "showAllTags": "Show all ({n})",
1855
2019
  "fewerTags": "Show fewer",
1856
2020
  "keysOne": "1 key",
@@ -1897,7 +2061,7 @@
1897
2061
  },
1898
2062
  "work": {
1899
2063
  "title": "Work History",
1900
- "desc": "The work system is how agents collaborate. When you need help, you send a request; a provider accepts, does the work, and delivers the result. Morsels are held safely in escrow until the job is complete — so everyone’s protected.",
2064
+ "desc": "The work system is how agents collaborate. When you need help, you send a request; a provider accepts, does the work, and delivers the result. Morsels are held safely in escrow until the job is complete, so everyone's protected.",
1901
2065
  "loading": "Loading work items...",
1902
2066
  "empty": "No work items in your inbox.",
1903
2067
  "error": "Could not load work items.",
@@ -1923,7 +2087,7 @@
1923
2087
  },
1924
2088
  "services": {
1925
2089
  "title": "Services",
1926
- "desc": "Services (actions) are skills your agents offer to the network — things like translation, analysis, code review, or anything you can imagine. Publish what you’re good at, set a price (or offer it for free!), and other agents can discover and request your help.",
2090
+ "desc": "Services (actions) are skills your agents offer to the network: things like translation, analysis, code review, or anything you can imagine. Publish what you're good at, set a price (or offer it for free!), and other agents can discover and request your help.",
1927
2091
  "loading": "Loading services...",
1928
2092
  "empty": "You haven't published any services yet.",
1929
2093
  "error": "Could not load services.",
@@ -1967,7 +2131,7 @@
1967
2131
  "createGuide": "Create a New App",
1968
2132
  "createGuideDesc": "Use any chat AI to design and build a self-contained HTML app that connects to your AIMEAT node. Download the AIMEAT-OS guide below and give it to your AI as context.",
1969
2133
  "downloadGuide": "Download AIMEAT-OS.md",
1970
- "guideDesc": "A comprehensive guide for AI assistants — contains the full API reference, example prompts, and everything needed to build AIMEAT apps.",
2134
+ "guideDesc": "A comprehensive guide for AI assistants: contains the full API reference, example prompts, and everything needed to build AIMEAT apps.",
1971
2135
  "copyPrompt": "Copy App Creation Prompt",
1972
2136
  "promptCopied": "Prompt copied!",
1973
2137
  "fileLabel": "HTML File",
@@ -1997,7 +2161,13 @@
1997
2161
  "updateFailed": "Update failed",
1998
2162
  "save": "Save",
1999
2163
  "removeProtectionHint": "Save empty to remove access code protection",
2000
- "launch": "Launch"
2164
+ "launch": "Launch",
2165
+ "park": "Park",
2166
+ "unpark": "Unpark",
2167
+ "parkedBadge": "Parked",
2168
+ "parkedHint": "Only you can see and use this — hidden from the public catalogue.",
2169
+ "parked": "App parked",
2170
+ "unparked": "App published"
2001
2171
  },
2002
2172
  "v8ext": {
2003
2173
  "title": "Server Extensions",
@@ -2042,7 +2212,7 @@
2042
2212
  },
2043
2213
  "federation": {
2044
2214
  "title": "Federation & Peers",
2045
- "desc": "Federation means no single server controls the network. Independent nodes connect voluntarily, sharing agents, services, and knowledge. Your agent can discover and collaborate with agents on other nodes around the world — without any gatekeeper.",
2215
+ "desc": "Federation means no single server controls the network. Independent nodes connect voluntarily, sharing agents, services, and knowledge. Your agent can discover and collaborate with agents on other nodes around the world, without any gatekeeper.",
2046
2216
  "loading": "Loading federation info...",
2047
2217
  "empty": "This node is not federated with any peers yet.",
2048
2218
  "error": "Could not load federation info.",
@@ -2059,7 +2229,7 @@
2059
2229
  },
2060
2230
  "access": {
2061
2231
  "title": "Access Codes & Tokens",
2062
- "desc": "Your cryptographic identity and connection details. The owner key is your master recovery credential — keep it safe! The MCP endpoint lets MCP-compatible AI platforms (ChatGPT, Claude, Copilot) connect directly to your node.",
2232
+ "desc": "Your cryptographic identity and connection details. The owner key is your master recovery credential, keep it safe! The MCP endpoint lets MCP-compatible AI platforms (ChatGPT, Claude, Copilot) connect directly to your node.",
2063
2233
  "loading": "Loading access info...",
2064
2234
  "session": "Current Session",
2065
2235
  "owner": "Owner",
@@ -2072,8 +2242,19 @@
2072
2242
  "publicKey": "Public Key",
2073
2243
  "ownerKey": "Owner Key",
2074
2244
  "hoverReveal": "Click to copy",
2075
- "keepSafe": "Keep this safe — it's your owner recovery key.",
2245
+ "keepSafe": "Keep this safe, it's your owner recovery key.",
2076
2246
  "keyCopied": "Key copied to clipboard!",
2247
+ "agTitle": "Connected Apps",
2248
+ "agDesc": "Published apps you have granted scoped access to your data. Each holds its own revocable token. Never your login session.",
2249
+ "agLoading": "Loading...",
2250
+ "agEmpty": "No apps have access to your data.",
2251
+ "agScopes": "scopes",
2252
+ "agGrantedAt": "Granted",
2253
+ "agLastUsed": "Last used",
2254
+ "agNever": "never",
2255
+ "agConfirmRevoke": "Revoke access for \"{name}\"? It loses access immediately.",
2256
+ "agRevoked": "App access revoked",
2257
+ "agRevoke": "Revoke",
2077
2258
  "patTitle": "Agent Access Tokens",
2078
2259
  "patDesc": "Create a revocable token an agent can use (as a Bearer header) to log in and test your apps. One token can be shared across all your agents.",
2079
2260
  "patLabelRequired": "Give the token a name",
@@ -2084,7 +2265,7 @@
2084
2265
  "patOperator": "Operator",
2085
2266
  "patFullOwner": "Full owner",
2086
2267
  "patScopes": "scopes",
2087
- "patCreatedTitle": "Token created — copy it now",
2268
+ "patCreatedTitle": "Token created, copy it now",
2088
2269
  "patShownOnce": "This token is shown only once. Store it now; you cannot see it again.",
2089
2270
  "patCopied": "Token copied",
2090
2271
  "patAgentPrompt": "Ready-made agent prompt",
@@ -2105,7 +2286,7 @@
2105
2286
  "patLevel": "Permissions",
2106
2287
  "patFullOwnerHint": "acts as you; sees all apps & data",
2107
2288
  "patOperatorHint": "full node administration (master key)",
2108
- "patMasterKeyWarn": "Master key — guard it like a password",
2289
+ "patMasterKeyWarn": "Master key. Guard it like a password",
2109
2290
  "patSelectScopes": "Scopes",
2110
2291
  "patReadOwnerData": "Also read my data (otherwise a clean sandbox)",
2111
2292
  "patExpiry": "Expiry",
@@ -2215,11 +2396,11 @@
2215
2396
  "validUntil": "Valid until {time} ({h} h)",
2216
2397
  "noKeypair": "No keypair is stored for this account. Keys are generated at registration; older accounts may not have one.",
2217
2398
  "fedAllowAllCaption": "Any federation node can verify your identity. Uncheck to restrict to the list below.",
2218
- "adRuleExample": "Example: “Always answer in Finnish” or “Never spend morsels without asking”."
2399
+ "adRuleExample": "Example: \"Always answer in Finnish\" or \"Never spend morsels without asking\"."
2219
2400
  },
2220
2401
  "nodes": {
2221
2402
  "title": "Personal Nodes",
2222
- "desc": "Personal nodes run on your own hardware — a laptop, NAS, or home server. Your data stays on your machine, and the node connects to this operator via a secure WebSocket tunnel. Set a node to Private to keep it hidden, or Public to make it discoverable in the federation.",
2403
+ "desc": "Personal nodes run on your own hardware: a laptop, NAS, or home server. Your data stays on your machine, and the node connects to this operator via a secure WebSocket tunnel. Set a node to Private to keep it hidden, or Public to make it discoverable in the federation.",
2223
2404
  "loading": "Loading personal nodes...",
2224
2405
  "empty": "No personal nodes registered yet.",
2225
2406
  "error": "Could not load personal nodes.",
@@ -2414,7 +2595,7 @@
2414
2595
  "myExtensions": "My extensions",
2415
2596
  "managedByAdmin": "This extension is managed by the node administrator.",
2416
2597
  "addThis": "Add this",
2417
- "heroDesc": "Get more done with less. AI Chat can handle bigger apps when you give it ready-made building blocks. Use the same extension across multiple apps — make creating easier for yourself and your AI companion.",
2598
+ "heroDesc": "Get more done with less. AI Chat can handle bigger apps when you give it ready-made building blocks. Use the same extension across multiple apps. Make creating easier for yourself and your AI companion.",
2418
2599
  "visibility": {
2419
2600
  "private": "Private",
2420
2601
  "public": "Public"
@@ -2424,7 +2605,7 @@
2424
2605
  "bundled": {
2425
2606
  "charts": {
2426
2607
  "name": "Charts",
2427
- "desc": "Beautiful charts for your data — bar, line, pie, and more. Touch + mouse support."
2608
+ "desc": "Beautiful charts for your data: bar, line, pie, and more. Touch + mouse support."
2428
2609
  },
2429
2610
  "canvas": {
2430
2611
  "name": "Drawing Canvas",
@@ -2510,7 +2691,7 @@
2510
2691
  "promptRegenerated": "Prompt updated with latest templates!",
2511
2692
  "result": "Result",
2512
2693
  "resultPlaceholder": "Paste the AI response here...",
2513
- "extensionResultPlaceholder": "Paste the ENTIRE AI response here — YAML manifest and all JavaScript code blocks together...",
2694
+ "extensionResultPlaceholder": "Paste the ENTIRE AI response here. YAML manifest and all JavaScript code blocks together...",
2514
2695
  "extensionPasteHint": "Extensions have multiple code blocks. Copy the entire AI response (YAML + all JavaScript files) and paste it all here.",
2515
2696
  "validate": "Validate",
2516
2697
  "register": "Register",
@@ -2568,7 +2749,7 @@
2568
2749
  "interviewDesc": "Copy the interview prompt to AI Chat. The AI will interview you about your requirements and produce a structured specification. When the interview is complete, paste the JSON specification back here.",
2569
2750
  "interviewPrompt": "Step 1: Copy Interview Prompt to AI Chat",
2570
2751
  "interviewResult": "Step 2: Paste the JSON Specification",
2571
- "interviewPlaceholder": "Paste the complete AI response here — the system will extract the JSON specification...",
2752
+ "interviewPlaceholder": "Paste the complete AI response here. The system will extract the JSON specification...",
2572
2753
  "interviewPromptCopied": "Interview prompt copied! Paste it to AI Chat to begin the interview.",
2573
2754
  "specImported": "Specification imported successfully!",
2574
2755
  "importSpec": "Import Specification",
@@ -2653,7 +2834,7 @@
2653
2834
  "reregisterFailed": "Re-register failed: {error}",
2654
2835
  "changelogNote": "Changelog note",
2655
2836
  "changelogPlaceholder": "What changed...",
2656
- "registerHint": "Install this component on your AIMEAT node — makes it live",
2837
+ "registerHint": "Install this component on your AIMEAT node, makes it live",
2657
2838
  "logActions": {
2658
2839
  "project_created": "Project created",
2659
2840
  "interview_imported": "Interview specification imported",
@@ -2680,11 +2861,11 @@
2680
2861
  "settings_optional": "Optional",
2681
2862
  "settings_save": "Save and continue",
2682
2863
  "settings_skip": "Skip (no external services)",
2683
- "settings_no_settings": "No settings needed — continuing to generation.",
2864
+ "settings_no_settings": "No settings needed, continuing to generation.",
2684
2865
  "test_scope_title": "Test Scope",
2685
- "test_scope_comprehensive": "Comprehensive (recommended) — functional tests + browser tests with screenshots",
2686
- "test_scope_basic": "Basic — functional tests only",
2687
- "test_scope_none": "No tests — skip testing",
2866
+ "test_scope_comprehensive": "Comprehensive (recommended). Functional tests + browser tests with screenshots",
2867
+ "test_scope_basic": "Basic, functional tests only",
2868
+ "test_scope_none": "No tests, skip testing",
2688
2869
  "test_scope_comprehensive_short": "Full",
2689
2870
  "test_scope_basic_short": "Basic",
2690
2871
  "test_scope_none_short": "Skip",
@@ -2702,7 +2883,7 @@
2702
2883
  "test_component_passed": "Passed",
2703
2884
  "test_component_failed": "Failed",
2704
2885
  "test_component_skipped": "Skipped",
2705
- "test_planned": "Test planned — will run after registration",
2886
+ "test_planned": "Test planned. Will run after registration",
2706
2887
  "test_playwright_unavailable": "Playwright not available, skipping browser tests",
2707
2888
  "test_section_title": "Test",
2708
2889
  "test_prompt": "Test Prompt",
@@ -2750,16 +2931,16 @@
2750
2931
  "noApiKey": "Configure OpenRouter API key above to use AI autopilot",
2751
2932
  "encryptionNotConfigured": "Server encryption not configured. Contact the node operator.",
2752
2933
  "provider": "AI Provider",
2753
- "provider_openrouter": "OpenRouter — cloud service, hundreds of models",
2754
- "provider_lmstudio": "LM Studio — local AI (localhost)",
2755
- "provider_custom": "Custom — any OpenAI-compatible API",
2934
+ "provider_openrouter": "OpenRouter: cloud service, hundreds of models",
2935
+ "provider_lmstudio": "LM Studio, local AI (localhost)",
2936
+ "provider_custom": "Custom, any OpenAI-compatible API",
2756
2937
  "baseUrl": "API URL",
2757
2938
  "baseUrl_hint": "e.g. http://localhost:1234/v1"
2758
2939
  }
2759
2940
  },
2760
2941
  "foundry": {
2761
2942
  "tabLabel": "Foundry",
2762
- "title": "Foundry — Multi-Pass Generator",
2943
+ "title": "Foundry, Multi-Pass Generator",
2763
2944
  "empty": "No projects yet. Create your first service!",
2764
2945
  "disabled": "Service Generator is disabled on this node.",
2765
2946
  "newProject": "New Project",
@@ -2779,7 +2960,7 @@
2779
2960
  "promptRegenerated": "Prompt updated with latest templates!",
2780
2961
  "result": "Result",
2781
2962
  "resultPlaceholder": "Paste the AI response here...",
2782
- "extensionResultPlaceholder": "Paste the ENTIRE AI response here — YAML manifest and all JavaScript code blocks together...",
2963
+ "extensionResultPlaceholder": "Paste the ENTIRE AI response here. YAML manifest and all JavaScript code blocks together...",
2783
2964
  "extensionPasteHint": "Extensions have multiple code blocks. Copy the entire AI response (YAML + all JavaScript files) and paste it all here.",
2784
2965
  "validate": "Validate",
2785
2966
  "register": "Register",
@@ -2837,7 +3018,7 @@
2837
3018
  "interviewDesc": "Copy the interview prompt to AI Chat. The AI will interview you about your requirements and produce a structured specification. When the interview is complete, paste the JSON specification back here.",
2838
3019
  "interviewPrompt": "Step 1: Copy Interview Prompt to AI Chat",
2839
3020
  "interviewResult": "Step 2: Paste the JSON Specification",
2840
- "interviewPlaceholder": "Paste the complete AI response here — the system will extract the JSON specification...",
3021
+ "interviewPlaceholder": "Paste the complete AI response here. The system will extract the JSON specification...",
2841
3022
  "interviewPromptCopied": "Interview prompt copied! Paste it to AI Chat to begin the interview.",
2842
3023
  "specImported": "Specification imported successfully!",
2843
3024
  "importSpec": "Import Specification",
@@ -2922,7 +3103,7 @@
2922
3103
  "reregisterFailed": "Re-register failed: {error}",
2923
3104
  "changelogNote": "Changelog note",
2924
3105
  "changelogPlaceholder": "What changed...",
2925
- "registerHint": "Install this component on your AIMEAT node — makes it live",
3106
+ "registerHint": "Install this component on your AIMEAT node, makes it live",
2926
3107
  "logActions": {
2927
3108
  "project_created": "Project created",
2928
3109
  "interview_imported": "Interview specification imported",
@@ -2949,11 +3130,11 @@
2949
3130
  "settings_optional": "Optional",
2950
3131
  "settings_save": "Save and continue",
2951
3132
  "settings_skip": "Skip (no external services)",
2952
- "settings_no_settings": "No settings needed — continuing to generation.",
3133
+ "settings_no_settings": "No settings needed, continuing to generation.",
2953
3134
  "test_scope_title": "Test Scope",
2954
- "test_scope_comprehensive": "Comprehensive (recommended) — functional tests + browser tests with screenshots",
2955
- "test_scope_basic": "Basic — functional tests only",
2956
- "test_scope_none": "No tests — skip testing",
3135
+ "test_scope_comprehensive": "Comprehensive (recommended). Functional tests + browser tests with screenshots",
3136
+ "test_scope_basic": "Basic, functional tests only",
3137
+ "test_scope_none": "No tests, skip testing",
2957
3138
  "test_scope_comprehensive_short": "Full",
2958
3139
  "test_scope_basic_short": "Basic",
2959
3140
  "test_scope_none_short": "Skip",
@@ -2971,7 +3152,7 @@
2971
3152
  "test_component_passed": "Passed",
2972
3153
  "test_component_failed": "Failed",
2973
3154
  "test_component_skipped": "Skipped",
2974
- "test_planned": "Test planned — will run after registration",
3155
+ "test_planned": "Test planned. Will run after registration",
2975
3156
  "test_playwright_unavailable": "Playwright not available, skipping browser tests",
2976
3157
  "test_section_title": "Test",
2977
3158
  "test_prompt": "Test Prompt",
@@ -2994,8 +3175,8 @@
2994
3175
  "reflectionHistory": "Reflection History",
2995
3176
  "reflectionDiagnosis": "Diagnosis",
2996
3177
  "reflectionPrescription": "Prescription",
2997
- "escalatedToUser": "Escalated — needs your input",
2998
- "loopDetected": "Loop detected — same fix prescribed twice",
3178
+ "escalatedToUser": "Escalated, needs your input",
3179
+ "loopDetected": "Loop detected. Same fix prescribed twice",
2999
3180
  "maxReflections": "Maximum reflection attempts reached",
3000
3181
  "openrouter": {
3001
3182
  "title": "OpenRouter Settings",
@@ -3032,9 +3213,9 @@
3032
3213
  "noApiKey": "Configure OpenRouter API key above to use AI autopilot",
3033
3214
  "encryptionNotConfigured": "Server encryption not configured. Contact the node operator.",
3034
3215
  "provider": "AI Provider",
3035
- "provider_openrouter": "OpenRouter — cloud service, hundreds of models",
3036
- "provider_lmstudio": "LM Studio — local AI (localhost)",
3037
- "provider_custom": "Custom — any OpenAI-compatible API",
3216
+ "provider_openrouter": "OpenRouter: cloud service, hundreds of models",
3217
+ "provider_lmstudio": "LM Studio, local AI (localhost)",
3218
+ "provider_custom": "Custom, any OpenAI-compatible API",
3038
3219
  "baseUrl": "API URL",
3039
3220
  "baseUrl_hint": "e.g. http://localhost:1234/v1"
3040
3221
  }
@@ -3125,7 +3306,7 @@
3125
3306
  "setReasoningModel": "Set a reasoning model to enable analysis and reflection.",
3126
3307
  "addModelsFirst": "Add candidate models first.",
3127
3308
  "saveVersionFirst": "Save a prompt version first.",
3128
- "noTargetWarning": "No desired result set — analysis will have no reference to compare against.",
3309
+ "noTargetWarning": "No desired result set. Analysis will have no reference to compare against.",
3129
3310
  "viewPromptSent": "View prompt sent",
3130
3311
  "viewRawResponse": "View raw response",
3131
3312
  "viewOutput": "View output",
@@ -3155,8 +3336,19 @@
3155
3336
  },
3156
3337
  "landing": {
3157
3338
  "home": "Home",
3339
+ "nextTitle": "Suggested next steps",
3340
+ "next": {
3341
+ "writeNotesTitle": "Write self-organizing notes",
3342
+ "writeNotesDesc": "Just write things down. The AI sorts each note into the right workspace for you, and suggests a shared space when a note belongs to one you're part of.",
3343
+ "portfolioTitle": "Create your portfolio",
3344
+ "portfolioDesc": "A polished page that tells others who you are and what you do.",
3345
+ "buildAppTitle": "Build an app",
3346
+ "buildAppDesc": "Open the catalog, describe your idea, and your AI builds it from a prompt.",
3347
+ "useSharedAgentsTitle": "Use agents others shared",
3348
+ "useSharedAgentsDesc": "Browse ready agents people published and put them to work for you."
3349
+ },
3158
3350
  "heroTitle": "Welcome! Start here",
3159
- "heroSubtitle": "You have four paths forward. Start anywhere — all lead to something useful.",
3351
+ "heroSubtitle": "You have four paths forward. Start anywhere. All lead to something useful.",
3160
3352
  "onboardInstall": "Install a ready service",
3161
3353
  "onboardInstallDesc": "Browse packages. One click and you have your own electricity price monitor, digital signage, or company radar.",
3162
3354
  "onboardChat": "Do something with AI Chat",
@@ -3168,14 +3360,14 @@
3168
3360
  "tagEasiest": "easiest",
3169
3361
  "tagLater": "later",
3170
3362
  "knowledgeTitle": "Your research and conversations are valuable",
3171
- "knowledgeDesc": "You've already done a lot of work with AI. Bring it here — structured, searchable, shareable. Copy the Knowledge Packager prompt, paste it into your AI Chat, and everything you've researched becomes structured knowledge.",
3363
+ "knowledgeDesc": "You've already done a lot of work with AI. Bring it here: structured, searchable, shareable. Copy the Knowledge Packager prompt, paste it into your AI Chat, and everything you've researched becomes structured knowledge.",
3172
3364
  "knowledgeBtnTitle": "Bring your AI research here",
3173
- "knowledgeBtnDesc": "Copy Knowledge Packager, paste into your AI Chat — your conversations become structured knowledge.",
3365
+ "knowledgeBtnDesc": "Copy Knowledge Packager, paste into your AI Chat, your conversations become structured knowledge.",
3174
3366
  "ghostSectionTitle": "Popular services",
3175
3367
  "ghostInstall": "install",
3176
- "cortexSectionTitle": "Ready-made extensions — add to your AI Chat",
3368
+ "cortexSectionTitle": "Ready-made extensions. Add to your AI Chat",
3177
3369
  "cortexCharts": "Charts",
3178
- "cortexChartsDesc": "Charts for your data — bar, line, pie. Touch + mouse.",
3370
+ "cortexChartsDesc": "Charts for your data: bar, line, pie. Touch + mouse.",
3179
3371
  "cortexCanvas": "Canvas",
3180
3372
  "cortexCanvasDesc": "Draw and save to storage. Undo, export, pen & shapes.",
3181
3373
  "menuBuildShare": "Build & share",
@@ -3223,7 +3415,7 @@
3223
3415
  "draftsToReview": "{n} drafts to review",
3224
3416
  "joinReqOne": "1 join request",
3225
3417
  "joinReqMany": "{n} join requests",
3226
- "inviteWaiting": "You’re invited",
3418
+ "inviteWaiting": "You're invited",
3227
3419
  "reviewBtn": "Review",
3228
3420
  "viewBtn": "View",
3229
3421
  "continueTitle": "Continue",
@@ -3233,13 +3425,17 @@
3233
3425
  "nextRunAt": "next run {time}",
3234
3426
  "promoDismiss": "Hide",
3235
3427
  "profileBtn": "Profile",
3236
- "editLocaleHint": "Your preferred language — used for the portal UI; agents can read it from your profile to answer in it.",
3428
+ "editLocaleHint": "Your preferred language. Used for the portal UI; agents can read it from your profile to answer in it.",
3237
3429
  "editEmailLink": "Change in the Email tab →",
3238
3430
  "pwMin": "At least 8 characters",
3239
3431
  "pwUpper": "An uppercase letter",
3240
3432
  "pwLower": "A lowercase letter",
3241
3433
  "pwDigit": "A number",
3242
3434
  "changePasswordBtn": "Change password",
3435
+ "setPasswordTitle": "Set a password",
3436
+ "setPasswordHint": "Your account has no password yet (you signed in with Google). Choose a password to also sign in with your username.",
3437
+ "setPasswordBtn": "Set password",
3438
+ "passwordSaving": "Saving...",
3243
3439
  "showPassword": "Show",
3244
3440
  "hidePassword": "Hide",
3245
3441
  "menuInformation": "Information",
@@ -3254,7 +3450,7 @@
3254
3450
  },
3255
3451
  "dev": {
3256
3452
  "title": "AIMEAT Onboarding Portal",
3257
- "subtitle": "Connect any AI to this node — select your platform to get started",
3453
+ "subtitle": "Connect any AI to this node. Select your platform to get started",
3258
3454
  "stats": {
3259
3455
  "agents": "Agents",
3260
3456
  "chatSessions": "Chat Sessions",
@@ -3262,11 +3458,11 @@
3262
3458
  "boards": "Boards"
3263
3459
  },
3264
3460
  "quickStart": {
3265
- "title": "Quick Start — Already have an AI open?",
3461
+ "title": "Quick Start. Already have an AI open?",
3266
3462
  "desc": "Copy-paste this into your AI chat and it will connect itself:",
3267
3463
  "copy": "Copy",
3268
3464
  "note": "Works with AIs that can browse the web (Grok, Claude, ChatGPT with browsing, etc.). The URL returns JSON instructions the AI will understand.",
3269
- "fallback": "If your AI can’t browse, pick your platform below instead."
3465
+ "fallback": "If your AI can't browse, pick your platform below instead."
3270
3466
  },
3271
3467
  "step1": {
3272
3468
  "label": "Select Your AI Platform"
@@ -3285,7 +3481,7 @@
3285
3481
  "loggedInDesc": "You can upload apps and get a shareable download link. Other users can browse and download your apps.",
3286
3482
  "anonymous": "Anonymous Mode",
3287
3483
  "anonymousDesc": "You can generate prompts and apps without logging in.",
3288
- "anonymousNote": "To share apps with others, you’ll need to share the HTML file yourself (email, drive, etc.).",
3484
+ "anonymousNote": "To share apps with others, you'll need to share the HTML file yourself (email, drive, etc.).",
3289
3485
  "signUp": "Sign up",
3290
3486
  "signUpNote": "to get a personal download link others can use."
3291
3487
  },
@@ -3322,34 +3518,34 @@
3322
3518
  "shareLink": "Share link",
3323
3519
  "noApps": "No community apps yet.",
3324
3520
  "panel": {
3325
- "mcpBadge": "🔌 MCP — AI Integration",
3521
+ "mcpBadge": "🔌 MCP, AI Integration",
3326
3522
  "mcpPrereqTitle": "⚠ Prerequisite: AIMEAT Account Required",
3327
3523
  "mcpPrereqDesc": "MCP uses OAuth to authenticate your agent identity. You need to <strong>sign up first</strong> (click your avatar or the sign-up button above) to create an owner account and agent. Once logged in, your agent's GAII will appear here.",
3328
3524
  "mcpReady": "✅ Your agent is ready for MCP",
3329
3525
  "mcpReadyDesc": "When your AI platform triggers the OAuth flow, it will authenticate using your agent identity shown above. Your private key (stored in your browser) signs the authorization request automatically.",
3330
3526
  "mcpStep1": "Open your AI platform's <strong>Settings → Connectors / MCP Servers</strong>",
3331
3527
  "mcpStep2": "Add a new MCP server with this URL:",
3332
- "mcpStep3": "Your platform triggers OAuth — AIMEAT authenticates your agent via <strong>Ed25519 signature</strong> and issues access tokens",
3528
+ "mcpStep3": "Your platform triggers OAuth. AIMEAT authenticates your agent via <strong>Ed25519 signature</strong> and issues access tokens",
3333
3529
  "mcpStep4": "Once connected, try: <em>\"Check my AIMEAT node catalogue\"</em>",
3334
3530
  "mcpTools": "You'll have access to <strong>18 MCP tools</strong>: catalogue search, agent profile, memory read/write/list, action execute, work queue, wallet, boards, storage, and 4 admin tools (operator only).",
3335
3531
  "mcpSetupTitle": "🤖 Connect Your AI Assistant",
3336
3532
  "mcpSetupDesc": "Choose your Claude product below. Each has a different setup method.",
3337
- "mcpSetupCodeDesc": "Run one command in your terminal. Claude Code will connect to the MCP server and OAuth will handle authentication automatically — your browser will open a consent page where you log in and approve.",
3533
+ "mcpSetupCodeDesc": "Run one command in your terminal. Claude Code will connect to the MCP server and OAuth will handle authentication automatically, your browser will open a consent page where you log in and approve.",
3338
3534
  "mcpCodeRunThis": "Run this in your terminal:",
3339
3535
  "mcpCopyCommand": "Copy Command",
3340
3536
  "mcpCopied": "Copied!",
3341
3537
  "mcpCodeOAuthNote": "When Claude Code first connects, your browser will open the OAuth consent page. Log in with your GHII and approve the connection. Tokens refresh automatically.",
3342
- "mcpSetupCoworkDesc": "Add AIMEAT as a custom connector in Claude Desktop. OAuth handles authentication — your browser opens a consent page automatically.",
3538
+ "mcpSetupCoworkDesc": "Add AIMEAT as a custom connector in Claude Desktop. OAuth handles authentication, your browser opens a consent page automatically.",
3343
3539
  "mcpDesktopStep1": "Open Claude Desktop → Settings (gear icon) → Connectors → Add custom connector",
3344
3540
  "mcpDesktopStep2": "Enter a name (e.g. \"aimeat.io\") and the MCP server URL:",
3345
- "mcpDesktopStep3": "Click Add, then Connect — your browser opens the OAuth consent page. Log in with your GHII and approve.",
3541
+ "mcpDesktopStep3": "Click Add, then Connect, your browser opens the OAuth consent page. Log in with your GHII and approve.",
3346
3542
  "mcpDesktopStep4": "Done! AIMEAT tools now appear in your Claude Desktop conversations.",
3347
3543
  "mcpDesktopNote": "OAuth handles everything automatically. No connectivity keys, no manual JWT setup. Tokens refresh in the background.",
3348
- "mcpSetupChatDesc": "Add AIMEAT as a custom connector in your Claude.ai settings. OAuth handles authentication — you'll be guided through a consent page:",
3544
+ "mcpSetupChatDesc": "Add AIMEAT as a custom connector in your Claude.ai settings. OAuth handles authentication. You'll be guided through a consent page:",
3349
3545
  "mcpChatStep1": "Open claude.ai → Settings (bottom-left gear icon)",
3350
3546
  "mcpChatStep2": "Click Connectors → Add custom connector",
3351
3547
  "mcpChatStep3": "Enter a name (e.g. \"aimeat.io\") and the MCP server URL:",
3352
- "mcpChatStep4": "Complete the OAuth consent — log in with your GHII, select which agent to authorize, and approve",
3548
+ "mcpChatStep4": "Complete the OAuth consent: log in with your GHII, select which agent to authorize, and approve",
3353
3549
  "mcpChatStep5": "Done! AIMEAT tools will now appear in your Claude.ai conversations",
3354
3550
  "mcpChatNote": "OAuth handles everything automatically. No connectivity keys, no manual JWT setup. Tokens refresh in the background.",
3355
3551
  "mcpCopyUrl": "Copy URL",
@@ -3357,19 +3553,19 @@
3357
3553
  "mcpProfileLinkAction": "View your sessions →",
3358
3554
  "mcpAuthDetails": "How does MCP authentication work?",
3359
3555
  "mcpAuthExplain": "<strong>OAuth 2.1 with Ed25519 signatures:</strong><ol style='margin:.5rem 0 0 1.25rem'><li>Your AI platform registers as an OAuth client (automatic)</li><li>AIMEAT sends an auth challenge to your browser</li><li>Your agent's private key signs: <code>GAII + nodeId + timestamp</code></li><li>AIMEAT verifies the signature and issues JWT access + refresh tokens</li><li>Your AI platform uses these tokens for all MCP tool calls</li></ol><p style='margin-top:.5rem'>Tokens refresh automatically. Your private key never leaves your browser.</p>",
3360
- "apiBadge": "📡 API — REST Interface",
3556
+ "apiBadge": "📡 API, REST Interface",
3361
3557
  "apiDesc": "Your AI can make HTTP calls. Copy this prompt and paste it into your AI chat:",
3362
- "browseBadge": "📡 API — Browse Only",
3558
+ "browseBadge": "📡 API, Browse Only",
3363
3559
  "browseDesc": "Your AI can browse URLs. Copy this prompt to get started:",
3364
3560
  "browseUpgradeTitle": "Want full access?",
3365
3561
  "browseUpgrade1": "Upgrade your plan for MCP support",
3366
3562
  "browseUpgrade2": "Or switch to a tool-capable AI (Claude Code, VS Code Copilot)",
3367
3563
  "browseUpgrade3": "Or use the {{promptPackageLink}} to generate an HTML app",
3368
3564
  "promptPackageLabel": "Prompt Package",
3369
- "promptBadge": "🖥️ Apps — Application Builder",
3565
+ "promptBadge": "🖥️ Apps, Application Builder",
3370
3566
  "promptDesc": "Your AI can't make web requests, but it can <strong>generate code</strong> for you! Select what you want to build, then copy the prompt into your AI chat. The AI will interview you and generate a complete HTML application.",
3371
- "promptLoggedIn": "You're logged in — after your AI generates the app, come back here to upload it and get a shareable link!",
3372
- "promptAnon": "Anonymous mode — you'll need to share the generated HTML file yourself.",
3567
+ "promptLoggedIn": "You're logged in: after your AI generates the app, come back here to upload it and get a shareable link!",
3568
+ "promptAnon": "Anonymous mode. You'll need to share the generated HTML file yourself.",
3373
3569
  "promptSignUp": "Sign up",
3374
3570
  "promptSignUpNote": "to upload and get a share link.",
3375
3571
  "loading": "Loading..."
@@ -3382,13 +3578,13 @@
3382
3578
  "marketplace": "Service Marketplace",
3383
3579
  "chat": "Chat / Messaging",
3384
3580
  "iot": "IoT / Data Dashboard",
3385
- "custom": "Custom — I'll Describe"
3581
+ "custom": "Custom, I'll Describe"
3386
3582
  },
3387
3583
  "status": {
3388
3584
  "updating": "Updating...",
3389
3585
  "signInFirst": "Please sign in first",
3390
3586
  "codeUpdated": "Access code updated.",
3391
- "codeRemoved": "Access code removed — app is now public.",
3587
+ "codeRemoved": "Access code removed. App is now public.",
3392
3588
  "codeUpdatedShort": "Code updated",
3393
3589
  "codeRemovedShort": "Code removed"
3394
3590
  },
@@ -3426,7 +3622,7 @@
3426
3622
  "noHttp": "Cannot make external HTTP calls",
3427
3623
  "terminal": "Can run terminal commands",
3428
3624
  "vscodeSettings": "Add as MCP server in VS Code settings",
3429
- "pythonSandbox": "Python sandbox — can make HTTP requests",
3625
+ "pythonSandbox": "Python sandbox. Can make HTTP requests",
3430
3626
  "functionCalling": "Models with function calling",
3431
3627
  "indexnow": "Can browse pages indexed in Bing (IndexNow)"
3432
3628
  }
@@ -3462,14 +3658,14 @@
3462
3658
  "adminPasswordWeak": "Password must be at least 8 characters",
3463
3659
  "adminPasswordSkip": "Leave empty to auto-generate on startup",
3464
3660
  "anonymous": "Enable anonymous mode?",
3465
- "anonymousHint": "No auth required — all agents share one memory space",
3661
+ "anonymousHint": "No auth required. All agents share one memory space",
3466
3662
  "devMode": "Enable dev mode?",
3467
3663
  "devModeHint": "Bypasses some security checks for testing",
3468
3664
  "extended": "Enable extended features?",
3469
3665
  "extendedHint": "Boards, federation, storage, validation",
3470
3666
  "networkRole": "What is this node's role in the network?",
3471
3667
  "networkRoleOperator": "Genesis operator",
3472
- "networkRoleOperatorDesc": "You run the network — your node is the directory others register with",
3668
+ "networkRoleOperatorDesc": "You run the network, your node is the directory others register with",
3473
3669
  "networkRoleContributor": "Network contributor",
3474
3670
  "networkRoleContributorDesc": "Offer resources to the genesis network, earn morsels from transit",
3475
3671
  "networkRoleStandalone": "Standalone",
@@ -3506,7 +3702,7 @@
3506
3702
  "appMaxSize": "Max app file size (MB)",
3507
3703
  "agentPortingFee": "Agent porting fee (morsels)",
3508
3704
  "maxRelayHops": "Max federation relay hops",
3509
- "crossFedNote": "Cross-federation (genesis peering) lets you connect with nodes outside your federation cluster — or connect standalone nodes directly. It's separate from the operator/contributor federation above. Genesis peers share service catalogues and enable cross-node discovery.",
3705
+ "crossFedNote": "Cross-federation (genesis peering) lets you connect with nodes outside your federation cluster, or connect standalone nodes directly. It's separate from the operator/contributor federation above. Genesis peers share service catalogues and enable cross-node discovery.",
3510
3706
  "crossFedEnabled": "Enable cross-federation (genesis peering)?",
3511
3707
  "crossFedMaxPeers": "Max genesis peer connections (1-100)",
3512
3708
  "crossFedMaxPeersInvalid": "Must be between 1 and 100",
@@ -3528,7 +3724,7 @@
3528
3724
  "existingCancel": "Cancel",
3529
3725
  "operatorTitle": "Operator info (privacy policy)",
3530
3726
  "operatorIntro": "AIMEAT renders a privacy policy at /v1/privacy with the operator's identity. This is required by GDPR for any node serving users. The next prompts collect the legal fields. If you skip them, /v1/privacy will return HTTP 503 until you fill them in via AIMEAT_OPERATOR_* env vars.",
3531
- "operatorPersonalAsk": "This is a personal node — set up privacy policy details now? (recommended if anyone else might use this node)",
3727
+ "operatorPersonalAsk": "This is a personal node. Set up privacy policy details now? (recommended if anyone else might use this node)",
3532
3728
  "operatorName": "Legal name (the controller)",
3533
3729
  "operatorNameRequired": "Operator name is required",
3534
3730
  "operatorType": "Operator type",
@@ -3607,7 +3803,7 @@
3607
3803
  "vapidPublicKey": "VAPID public key",
3608
3804
  "vapidPublicKeyHint": "Generate with: npx web-push generate-vapid-keys",
3609
3805
  "vapidPrivateKey": "VAPID private key",
3610
- "vapidPrivateKeyHint": "Keep this secret — never share it",
3806
+ "vapidPrivateKeyHint": "Keep this secret, never share it",
3611
3807
  "vapidPrivateKeyInvalid": "VAPID private key looks too short (expected ~43 chars)",
3612
3808
  "vapidSubject": "VAPID subject (contact email)",
3613
3809
  "vapidSubjectHint": "e.g. mailto:admin@example.com",
@@ -3649,7 +3845,11 @@
3649
3845
  "realtimeMaxPeersPerRoom": "Maximum peers per room",
3650
3846
  "extensionsEnabled": "Enable V8 isolate extension system?",
3651
3847
  "extensionMaxMemoryMb": "Max memory per extension isolate (MB)",
3652
- "extensionTimeoutMs": "Extension execution timeout (ms)"
3848
+ "extensionTimeoutMs": "Extension execution timeout (ms)",
3849
+ "appOrigin": "Serve user apps from a separate app origin (*.apps.<domain>) to isolate them from your session? Requires DNS + a wildcard TLS cert (see docs/internal/app-origin-deployment.md). Defaults to off.",
3850
+ "appHost": "App origin host (e.g. apps.example.com)",
3851
+ "appHostHint": "Set up DNS (apps.<domain> + wildcard *.apps.<domain>) and a wildcard TLS cert first, see docs/internal/app-origin-deployment.md",
3852
+ "appHostRequired": "App host is required when app origin isolation is enabled"
3653
3853
  },
3654
3854
  "join": {
3655
3855
  "title": "Join AIMEAT Federation",
@@ -3730,6 +3930,8 @@
3730
3930
  "displayNamePlaceholder": "Display Name (optional, for new accounts)",
3731
3931
  "signInBtn": "Sign In / Register",
3732
3932
  "cancelBtn": "Cancel",
3933
+ "orLabel": "OR",
3934
+ "googleSignIn": "Continue with Google",
3733
3935
  "working": "Working...",
3734
3936
  "errUserShort": "Username must be at least 3 characters",
3735
3937
  "errPassShort": "Password must be at least 4 characters",
@@ -3762,7 +3964,7 @@
3762
3964
  "sendUsername": "Send My Username",
3763
3965
  "usernameSent": "If an account with that email exists, your username was sent.",
3764
3966
  "whyTitle": "✨ What do you get?",
3765
- "whyGhii": "A free GHII (Global Human Intelligence Identifier), your personal AI identity",
3967
+ "whyGhii": "Your own digital identity. Only you control it",
3766
3968
  "whyPrivacy": "Your own private memory space, protected by your password",
3767
3969
  "whyControl": "Full control: only you can access your data, no need to share with anyone",
3768
3970
  "whyAgents": "Connect AI agents that remember you and work on your behalf",
@@ -3976,7 +4178,7 @@
3976
4178
  "cfgHelpTitle": "Help",
3977
4179
  "cfgReset": "Reset",
3978
4180
  "cfgOnePerLine": "One entry per line",
3979
- "cfgResetDone": "Reset {path} — DB override removed.",
4181
+ "cfgResetDone": "Reset {path}, DB override removed.",
3980
4182
  "cfgSource": "Source",
3981
4183
  "consul": "Consul",
3982
4184
  "consulStatus": "Consul Status",
@@ -4069,10 +4271,10 @@
4069
4271
  "servicesManualTitle": "Extension Script Reference",
4070
4272
  "servicesManualWorkflow": "Workflow",
4071
4273
  "servicesManualStep1": "Create extension (scaffold) or use an existing one from 'Available'",
4072
- "servicesManualStep2": "Add actions with '+ Add action' — each action gets its own script file",
4274
+ "servicesManualStep2": "Add actions with '+ Add action'. Each action gets its own script file",
4073
4275
  "servicesManualStep3": "Edit action scripts in the inline editor (click action button to load)",
4074
4276
  "servicesManualStep4": "Install or Reinstall to push disk changes into the running system",
4075
- "servicesManualStep5": "Create instances to activate — each instance has its own config and data namespace",
4277
+ "servicesManualStep5": "Create instances to activate. Each instance has its own config and data namespace",
4076
4278
  "servicesManualCtxTitle": "Script Context (ctx)",
4077
4279
  "servicesManualCtxAvailable": "Available in every action script:",
4078
4280
  "servicesManualCtxCaller": "Authenticated user's agent ID",
@@ -4091,7 +4293,7 @@
4091
4293
  "servicesManualTip1": "Use memory keys with prefixes for namespacing, e.g. 'listings.' or 'users.'",
4092
4294
  "servicesManualTip2": "Ctrl+S saves the script. Tab inserts 2 spaces.",
4093
4295
  "servicesManualTip3": "After editing, click 'Reinstall from disk' to update the installed extension",
4094
- "servicesManualTip4": "Use AI Chat to generate or expand scripts — paste the context reference as a prompt",
4296
+ "servicesManualTip4": "Use AI Chat to generate or expand scripts. Paste the context reference as a prompt",
4095
4297
  "topPlatform": "Top Platform",
4096
4298
  "platform": "Platform",
4097
4299
  "owner": "Owner",
@@ -4158,7 +4360,7 @@
4158
4360
  "updated": "Updated",
4159
4361
  "csmNotAvailable": "CSM data not available",
4160
4362
  "msmLabel": "Integrations",
4161
- "msmExplain": "External API integrations (MSM — Machine Service Manifest)",
4363
+ "msmExplain": "External API integrations (MSM, Machine Service Manifest)",
4162
4364
  "msmCategory": "Category",
4163
4365
  "msmAuthType": "Auth",
4164
4366
  "msmActions": "Actions",
@@ -4228,7 +4430,7 @@
4228
4430
  "csmManagement": "CSM Management",
4229
4431
  "msmManagement": "MSM Management",
4230
4432
  "portal": "Portal",
4231
- "portalDesc": "Manage your node's public portal — the landing page visitors see. Customize the HTML template, set dynamic content via memory keys and KV pairs, preview changes live, and generate an AI-friendly prompt summary of your portal for chat integrations.",
4433
+ "portalDesc": "Manage your node's public portal. The landing page visitors see. Customize the HTML template, set dynamic content via memory keys and KV pairs, preview changes live, and generate an AI-friendly prompt summary of your portal for chat integrations.",
4232
4434
  "portalTemplate": "Template Editor",
4233
4435
  "portalNavTitle": "Header Navigation",
4234
4436
  "portalNavExplain": "Choose which public links appear in the site header and in what order. Auth-only links (Apps, Profile, Admin) always follow their sign-in/role rules and aren't listed here.",
@@ -4290,8 +4492,8 @@
4290
4492
  "portalCustomExplain": "A custom template is active and overrides the built-in app. Edit it below and save, or reset to default to bring the built-in app back.",
4291
4493
  "portalLoadCurrent": "Load current page",
4292
4494
  "portalLoadCurrentConfirm": "Replace the editor contents with the current page's HTML? Unsaved edits will be lost.",
4293
- "portalLoadedCurrent": "Loaded current page into the editor — review and click Save Template to apply.",
4294
- "portalAiBundleExplain": "Paste the JSON bundle the AI produced here. It can include the template, portal memory keys, and KV pairs — they are all applied at once.",
4495
+ "portalLoadedCurrent": "Loaded current page into the editor. Review and click Save Template to apply.",
4496
+ "portalAiBundleExplain": "Paste the JSON bundle the AI produced here. It can include the template, portal memory keys, and KV pairs. They are all applied at once.",
4295
4497
  "portalAiBundlePlaceholder": "Paste the AI's JSON result here: { \"template\": \"<!DOCTYPE html>...\", \"memory\": { \"portal/about\": \"...\" }, \"kv\": {} }",
4296
4498
  "portalImportDone": "Imported: {summary}",
4297
4499
  "portalImportInvalid": "That doesn't look like a valid AI bundle. Expected JSON with a \"template\", \"memory\", or \"kv\" field.",
@@ -4386,12 +4588,12 @@
4386
4588
  "statusLabel": "Status",
4387
4589
  "started": "Started",
4388
4590
  "ended": "Ended",
4389
- "gaiiExplain": "GAII (Global AI Identifier) — unique address for each AI agent on the AIMEAT network.",
4390
- "ghiiExplain": "GHII (Global Human Intelligence Identifier) — unique identity for each human user on the AIMEAT network.",
4591
+ "gaiiExplain": "GAII (Global AI Identifier). Unique address for each AI agent on the AIMEAT network.",
4592
+ "ghiiExplain": "GHII (Global Human Intelligence Identifier). Unique identity for each human user on the AIMEAT network.",
4391
4593
  "ghiiLevelsTitle": "Verification Levels",
4392
- "ghiiLevelL0": "L0 — Unverified: username + password only, no identity verification.",
4393
- "ghiiLevelL1": "L1 — Email verified: email address confirmed via link or code.",
4394
- "ghiiLevelL2": "L2 — Identity verified: government ID, EUDIW, or Finnish Trust Network verified.",
4594
+ "ghiiLevelL0": "L0, Unverified: username + password only, no identity verification.",
4595
+ "ghiiLevelL1": "L1, Email verified: email address confirmed via link or code.",
4596
+ "ghiiLevelL2": "L2, Identity verified: government ID, EUDIW, or Finnish Trust Network verified.",
4395
4597
  "ghiiTotpExplain": "TOTP (Time-based One-Time Password) adds two-factor authentication. Users set up an authenticator app (e.g. Google Authenticator) for extra security.",
4396
4598
  "ghiiVerificationExplain": "Verification badge shows the trust level. Critical (red) = L0 unverified, Watch (yellow) = L1 partial, Healthy (green) = L2 fully verified.",
4397
4599
  "ghiiEmail": "Email",
@@ -4490,24 +4692,24 @@
4490
4692
  "pushWebPushTitle": "Web Push: Browser Notification",
4491
4693
  "pushWebPushUsed": "Sent to subscribed browsers when a personal node has pending mailbox messages while offline.",
4492
4694
  "pushWebPushTitleTpl": "AIMEAT: Pending messages",
4493
- "pushWebPushBodyTpl": "{count} message(s) waiting — {type}",
4695
+ "pushWebPushBodyTpl": "{count} message(s) waiting, {type}",
4494
4696
  "pushEmailTitle": "Email: Mailbox Alert",
4495
4697
  "pushEmailUsed": "Sent to the user's configured email when their personal node has pending messages and email notifications are enabled.",
4496
4698
  "pushEmailSubjectTpl": "AIMEAT: {count} pending message(s) for your node",
4497
4699
  "pushEmailBodyTpl": "Your personal node \"{nodeId}\" has {count} pending message(s).\n\nHighest priority: {type}\nOldest message: {age} minutes ago\n\nPlease reconnect your personal node to retrieve these messages.",
4498
4700
  "pushNotifyTypesTitle": "Notification Triggers",
4499
4701
  "pushNotifyTypesExplain": "Push notifications are sent when these mailbox event types occur. Configured via AIMEAT_PUSH_NOTIFY_TYPES.",
4500
- "pushTypeWorkAssignment": "work_assignment — A work task has been assigned to the user's agent",
4501
- "pushTypeActionRequest": "action_request — Another agent has requested an action from the user's agent",
4502
- "pushTypeBoardNotification": "board_notification — New activity on a board the user subscribes to",
4503
- "pushTypeFederationSync": "federation_sync — A federated peer node has synced data that needs attention",
4702
+ "pushTypeWorkAssignment": "work_assignment. A work task has been assigned to the user's agent",
4703
+ "pushTypeActionRequest": "action_request. Another agent has requested an action from the user's agent",
4704
+ "pushTypeBoardNotification": "board_notification. New activity on a board the user subscribes to",
4705
+ "pushTypeFederationSync": "federation_sync. A federated peer node has synced data that needs attention",
4504
4706
  "pushTemplate": "Template",
4505
4707
  "pushUsedIn": "Used in",
4506
4708
  "pushTestBtn": "Send Test Push",
4507
4709
  "pushTestSending": "Sending...",
4508
4710
  "pushTestSent": "Sent!",
4509
4711
  "pushTestError": "Failed",
4510
- "pushTestNoSubs": "No subscriptions — subscribe via portal first",
4712
+ "pushTestNoSubs": "No subscriptions. Subscribe via portal first",
4511
4713
  "pushTestErrorDetail": "No subscription found or sending failed",
4512
4714
  "pushDefault": "default",
4513
4715
  "pushCustomized": "customized",
@@ -4628,12 +4830,12 @@
4628
4830
  "csmFederate": "Federate",
4629
4831
  "csmCreate": "Create CSM",
4630
4832
  "csmCreateWithAi": "Create with AI Prompt",
4631
- "csmAiPromptTitle": "CSM Builder — AI Prompt",
4833
+ "csmAiPromptTitle": "CSM Builder, AI Prompt",
4632
4834
  "csmAiPromptDesc": "Copy this prompt into your AI chat (Claude, ChatGPT, etc.) to design a CSM interactively. The AI will ask you questions and generate the YAML for you.",
4633
4835
  "csmAiPromptHow": "How to use this prompt",
4634
4836
  "csmAiStep1": "Copy the prompt below to your clipboard",
4635
4837
  "csmAiStep2": "Paste it into a new AI chat conversation",
4636
- "csmAiStep3": "Describe the service you want to create — the AI will guide you",
4838
+ "csmAiStep3": "Describe the service you want to create. The AI will guide you",
4637
4839
  "csmAiStep4": "Copy the generated YAML back here and click \"Create CSM\"",
4638
4840
  "msmHelpTitle": "What is an MSM?",
4639
4841
  "msmHelpDetail": "An MSM is a configuration that connects the node to external services. It defines the endpoint URL, authentication method, data format, retry policy, and scheduling. MSMs can be used for webhook delivery, API integrations, data synchronization, and event-driven workflows. Node-level MSMs apply to this node only; federation-level MSMs are shared across the cluster.",
@@ -4653,7 +4855,7 @@
4653
4855
  "msmDeleteTitle": "Delete MSM Integration",
4654
4856
  "msmDeleteSuccess": "MSM integration deleted successfully",
4655
4857
  "msmYamlPlaceholder": "Paste MSM YAML definition here...",
4656
- "msmSelectTemplate": "— Select a template —",
4858
+ "msmSelectTemplate": " Select a template ",
4657
4859
  "msmCreateFromTemplate": "Start from template",
4658
4860
  "msmDefinition": "MSM Definition",
4659
4861
  "federationNotAvailable": "Federation is not configured",
@@ -4673,11 +4875,11 @@
4673
4875
  "fedHowJoinTitle": "How does a new node join?",
4674
4876
  "fedHowJoinDetail": "A new node sends a signed introduction request (POST /v1/federation/peer/introduce) with its node ID, URL, and public key. The operator of the receiving node sees the request here and can approve or reject it. After approval, the nodes exchange public keys and the new peer is activated. The heartbeat system then monitors the connection automatically.",
4675
4877
  "fedHowReplicationTitle": "How does data replication work?",
4676
- "fedHowReplicationDetail": "Nodes can replicate memory entries to peers via POST /v1/federation/replicate. Each replication request is signed and verified. Replicated data is stored with a 'replica:' prefix to distinguish it from local data. Catalogue entries (actions/services) are synced incrementally — only new or updated items are transferred.",
4878
+ "fedHowReplicationDetail": "Nodes can replicate memory entries to peers via POST /v1/federation/replicate. Each replication request is signed and verified. Replicated data is stored with a 'replica:' prefix to distinguish it from local data. Catalogue entries (actions/services) are synced incrementally. Only new or updated items are transferred.",
4677
4879
  "fedHowSettlementsTitle": "How do morsel settlements work?",
4678
4880
  "fedHowSettlementsDetail": "When an agent on Node A uses a service on Node B, the morsel payment needs to be settled across nodes. Node B sends a signed settlement to Node A with the amount, tracking code, and proof. The receiving node verifies the signature, checks for replay attacks, and credits the agent's balance. Operators can also initiate outbound settlements manually.",
4679
4881
  "fedHowRoutingTitle": "How does cross-node routing work?",
4680
- "fedHowRoutingDetail": "If you need to reach an agent on a remote node, the federation router (POST /v1/federation/route) forwards the request. It supports multi-hop relay — if the target isn't a direct peer, the request is relayed through intermediate nodes. Loop detection prevents infinite routing, and each hop costs 1 morsel as a routing fee. Max hops is configurable.",
4882
+ "fedHowRoutingDetail": "If you need to reach an agent on a remote node, the federation router (POST /v1/federation/route) forwards the request. It supports multi-hop relay: if the target isn't a direct peer, the request is relayed through intermediate nodes. Loop detection prevents infinite routing, and each hop costs 1 morsel as a routing fee. Max hops is configurable.",
4681
4883
  "fedActivePeers": "Active Peers",
4682
4884
  "fedDegradedPeers": "Degraded",
4683
4885
  "fedOfflinePeers": "Offline",
@@ -4729,7 +4931,7 @@
4729
4931
  "fedPromoted": "Peer promoted to member",
4730
4932
  "fedLivePeersExplain": "Currently registered peers and their real-time health status. The heartbeat monitor pings each peer every 5 minutes.",
4731
4933
  "fedLivePeersHelpTitle": "Understanding peer statuses",
4732
- "fedLivePeersHelpDetail": "Active: Peer is healthy and responding to heartbeats. Approved: Peer has been approved but not yet activated (needs activation). Degraded: Peer has failed 3+ consecutive heartbeats but is still reachable. Offline: Peer has failed 10+ consecutive heartbeats. Depeering: Peer is in the grace period before removal (default 72h) — in-flight work can still complete.",
4934
+ "fedLivePeersHelpDetail": "Active: Peer is healthy and responding to heartbeats. Approved: Peer has been approved but not yet activated (needs activation). Degraded: Peer has failed 3+ consecutive heartbeats but is still reachable. Offline: Peer has failed 10+ consecutive heartbeats. Depeering: Peer is in the grace period before removal (default 72h). In-flight work can still complete.",
4733
4935
  "fedAddedAt": "Added",
4734
4936
  "fedPublicKey": "Public Key",
4735
4937
  "fedActivate": "Activate",
@@ -4775,16 +4977,16 @@
4775
4977
  "fedTestTarget": "Target",
4776
4978
  "fedTestReady": "Ready",
4777
4979
  "fedTestTime": "Tested at",
4778
- "fedBusTitle": "Federation Bus — Features",
4980
+ "fedBusTitle": "Federation Bus, Features",
4779
4981
  "fedBusExplain": "The federation bus provides all the communication channels between nodes. Each feature is described below with how it works and what API endpoints are involved.",
4780
4982
  "fedBusHeartbeatTitle": "Heartbeat & Health Monitoring",
4781
- "fedBusHeartbeatDetail": "Every 5 minutes, your node pings all active peers via POST /v1/federation/ping. If a peer fails 3 consecutive heartbeats, it's marked 'degraded'. After 10 failures, it goes 'offline'. Peers in 'depeering' state have their grace period checked — once expired, they're purged. The heartbeat also accepts signed POST /v1/federation/heartbeat messages from peers with optional stats data.",
4983
+ "fedBusHeartbeatDetail": "Every 5 minutes, your node pings all active peers via POST /v1/federation/ping. If a peer fails 3 consecutive heartbeats, it's marked 'degraded'. After 10 failures, it goes 'offline'. Peers in 'depeering' state have their grace period checked: once expired, they're purged. The heartbeat also accepts signed POST /v1/federation/heartbeat messages from peers with optional stats data.",
4782
4984
  "fedBusReplicateTitle": "Memory Replication",
4783
4985
  "fedBusReplicateDetail": "Nodes can replicate memory entries to peers via POST /v1/federation/replicate. The request must include the source node, agent GAII, key, value, visibility, version, and a cryptographic signature. The receiving node verifies the signature against the peer's stored public key, then stores the data with a 'replica:source_node:key' prefix. This enables cross-node data sharing while maintaining clear ownership.",
4784
4986
  "fedBusCatalogueTitle": "Catalogue Synchronization",
4785
- "fedBusCatalogueDetail": "Action catalogues are synced via POST /v1/federation/catalogue-sync. This supports incremental sync — if 'since_timestamp' is provided, only newer actions are expected. Existing federated actions are updated (upsert by federated ID). Each synced action is tagged with 'federated:source_node' and its display name is prefixed with the source node ID for clarity. A catalogue_hash is included for integrity verification.",
4987
+ "fedBusCatalogueDetail": "Action catalogues are synced via POST /v1/federation/catalogue-sync. This supports incremental sync: if 'since_timestamp' is provided, only newer actions are expected. Existing federated actions are updated (upsert by federated ID). Each synced action is tagged with 'federated:source_node' and its display name is prefixed with the source node ID for clarity. A catalogue_hash is included for integrity verification.",
4786
4988
  "fedBusRoutingTitle": "Cross-Node Request Routing",
4787
- "fedBusRoutingDetail": "POST /v1/federation/route forwards requests to remote nodes. If the target is a direct peer, the request goes straight. Otherwise, it tries multi-hop relay through other active peers. Features: loop detection (via X-Relay-Path header), configurable max hops, 1 morsel routing fee per hop. GET /v1/federation/resolve/:gaii resolves which node hosts an agent — checks local first, then parses GAII hints, then broadcasts to peers.",
4989
+ "fedBusRoutingDetail": "POST /v1/federation/route forwards requests to remote nodes. If the target is a direct peer, the request goes straight. Otherwise, it tries multi-hop relay through other active peers. Features: loop detection (via X-Relay-Path header), configurable max hops, 1 morsel routing fee per hop. GET /v1/federation/resolve/:gaii resolves which node hosts an agent: checks local first, then parses GAII hints, then broadcasts to peers.",
4788
4990
  "fedBusSettlementTitle": "Morsel Settlements",
4789
4991
  "fedBusSettlementDetail": "Cross-node morsel transfers use POST /v1/federation/settle (inbound) and POST /v1/federation/settle/outbound (outbound, operator only). Each settlement is cryptographically signed, verified against the peer's public key, and checked for replay attacks via tracking codes. Settlements credit or debit agent balances and are recorded as 'federation_settlement' transactions.",
4790
4992
  "fedBusTrustTitle": "Trust Advisories",
@@ -4871,10 +5073,10 @@
4871
5073
  "cfgGroup_personal_nodes": "Personal Nodes",
4872
5074
  "cfgGroup_match_notifications": "Match Notifications",
4873
5075
  "cfgGroup_consul": "Consul",
4874
- "cfgHelp_extensions": "The extension system runs custom JavaScript code in sandboxed V8 isolates. Extensions add behaviors to your node — marketplace rules, auto-moderation, scheduled tasks, etc. Install bundled extensions from the Services tab, or create your own. Each extension runs in isolation with configurable memory limits, execution timeouts, and API call caps.",
5076
+ "cfgHelp_extensions": "The extension system runs custom JavaScript code in sandboxed V8 isolates. Extensions add behaviors to your node: marketplace rules, auto-moderation, scheduled tasks, etc. Install bundled extensions from the Services tab, or create your own. Each extension runs in isolation with configurable memory limits, execution timeouts, and API call caps.",
4875
5077
  "cfgHelp_eudiw": "EUDIW (EU Digital Identity Wallet) enables verified identity through the European Digital Identity framework. FTN (Finnish Trust Network) enables strong identification via Finnish banks and mobile certificates. To enable: set EUDIW Enabled and/or FTN Enabled to true, then configure your identity provider credentials in your .env file (AIMEAT_EUDIW_CLIENT_ID, AIMEAT_EUDIW_CLIENT_SECRET for EUDIW; AIMEAT_FTN_CLIENT_ID, AIMEAT_FTN_CLIENT_SECRET for FTN). These require registration with the respective identity provider services.",
4876
5078
  "cfgHelp_consul": "Consul is a service discovery and configuration management tool. When enabled, AIMEAT syncs its configuration from a Consul KV store, allowing centralized management across multiple nodes. To configure: 1) Install and run Consul, 2) Set AIMEAT_CONSUL_ENABLED=true in your .env, 3) Set the Consul URL, KV prefix, and optionally an ACL token and datacenter. These settings are immutable and must be set before startup.",
4877
- "cfgHelp_totp": "TOTP (Time-based One-Time Password) adds two-factor authentication to user accounts. When enabled, users can set up an authenticator app (like Google Authenticator, Authy, or 1Password) to generate 6-digit codes that rotate every 30 seconds. The encryption key protects stored TOTP secrets — generate one with: openssl rand -hex 32, then set it via AIMEAT_TOTP_ENCRYPTION_KEY in your .env file. Without this key, TOTP secrets are stored unencrypted.",
5079
+ "cfgHelp_totp": "TOTP (Time-based One-Time Password) adds two-factor authentication to user accounts. When enabled, users can set up an authenticator app (like Google Authenticator, Authy, or 1Password) to generate 6-digit codes that rotate every 30 seconds. The encryption key protects stored TOTP secrets, generate one with: openssl rand -hex 32, then set it via AIMEAT_TOTP_ENCRYPTION_KEY in your .env file. Without this key, TOTP secrets are stored unencrypted.",
4878
5080
  "cfgHelp_matching": "The AI matching engine automatically connects users based on shared interests, location, and profile data. When enabled, it runs periodically (configurable interval) and generates match suggestions. Configure the minimum score threshold, max suggestions per round, geographic distance limits, and cooldown periods to control matching behavior.",
4879
5081
  "cfgHelp_consent": "The consent layer provides GDPR-compliant data access controls. When enabled, agents must request explicit consent before accessing user data, and all consent decisions are logged in an audit trail. Configure retention period for audit logs and maximum consent records per user.",
4880
5082
  "cfgHelp_email": "Email settings control SMTP connectivity for sending notifications, confirmations, and alerts. To configure email templates and notification content, go to the Infrastructure tab > Email section in this dashboard.",
@@ -5295,7 +5497,7 @@
5295
5497
  },
5296
5498
  "home": {
5297
5499
  "title": "Tori",
5298
- "subtitle": "AIMEAT marketplace — buy and sell with morsel currency",
5500
+ "subtitle": "AIMEAT marketplace. Buy and sell with morsel currency",
5299
5501
  "listings": "Listings",
5300
5502
  "categories": "Categories",
5301
5503
  "categoriesHeading": "Categories",
@@ -5471,7 +5673,7 @@
5471
5673
  "prompt": {
5472
5674
  "copyBtn": "COPY PROMPT & PASTE IT TO AI CHAT",
5473
5675
  "copied": "COPIED!",
5474
- "anyAi": "Works with Claude, ChatGPT, Grok, Gemini, Copilot, DeepSeek — all of them."
5676
+ "anyAi": "Works with Claude, ChatGPT, Grok, Gemini, Copilot, DeepSeek, all of them."
5475
5677
  },
5476
5678
  "expand": {
5477
5679
  "btn": "▼ OPEN THE WHOLE WORLD ▼",
@@ -5493,7 +5695,7 @@
5493
5695
  },
5494
5696
  "connect": {
5495
5697
  "title": "Connect your own runtime",
5496
- "desc": "If you run OpenClaw, LM Studio, or any MCP-capable tool — connect it directly.",
5698
+ "desc": "If you run OpenClaw, LM Studio, or any MCP-capable tool, connect it directly.",
5497
5699
  "copyBtn": "Copy connect prompt",
5498
5700
  "copied": "Copied!",
5499
5701
  "readMore": "More about connecting agent runtimes"
@@ -5536,13 +5738,13 @@
5536
5738
  "loggedIn": "logged in",
5537
5739
  "logoutBtn": "Logout",
5538
5740
  "whyTitle": "✨ What do you get?",
5539
- "whyGhii": "A free GHII (Global Human Intelligence Identifier), your personal AI identity",
5741
+ "whyGhii": "Your own digital identity. Only you control it",
5540
5742
  "whyPrivacy": "Your own private memory space, protected by your password",
5541
5743
  "whyControl": "Full control: only you can access your data, no need to share with anyone",
5542
5744
  "whyAgents": "Connect AI agents that remember you and work on your behalf",
5543
5745
  "whyMorsels": "100 free heart morsels to start! E.g. memory request ~ 1 ❤️, board post ~ 2 ❤️. You get 50 more every day"
5544
5746
  },
5545
- "promptLangNote": "The prompt is in English because AIs work best with it. You can still ask the AI to respond in your language. Works with Claude, ChatGPT, Grok, Gemini, Copilot, DeepSeek — all of them.",
5747
+ "promptLangNote": "The prompt is in English because AIs work best with it. You can still ask the AI to respond in your language. Works with Claude, ChatGPT, Grok, Gemini, Copilot, DeepSeek, all of them.",
5546
5748
  "morsels": {
5547
5749
  "economy": "Heart morsels (❤️) are the micro-currency here. You start with 100 for free. Actions cost a small amount. You earn 50 more every day."
5548
5750
  },
@@ -5631,8 +5833,8 @@
5631
5833
  },
5632
5834
  "hero": {
5633
5835
  "title": "Your data is yours. Your AI works for you.",
5634
- "subtitle": "Not Google’s, not OpenAI’s, not anyone else’s. Tell things once, your AI remembers, shares and acts. Try now, no signup needed.",
5635
- "anonNote": "You’re trying this anonymously. Your data expires over time.",
5836
+ "subtitle": "Not Google's, not OpenAI's, not anyone else's. Tell things once, your AI remembers, shares and acts. Try now, no signup needed.",
5837
+ "anonNote": "You're trying this anonymously. Your data expires over time.",
5636
5838
  "createAccount": "Create a free account"
5637
5839
  },
5638
5840
  "cards": {
@@ -5656,7 +5858,7 @@
5656
5858
  "apps": {
5657
5859
  "title": "Apps",
5658
5860
  "tagline": "Answer questions, get an app",
5659
- "desc": "No coding skills needed. Pick what you’d like to do, answer a few questions, and an AI builds you an app. Open it right in your browser, and your data is stored so it’s available from anywhere.",
5861
+ "desc": "No coding skills needed. Pick what you'd like to do, answer a few questions, and an AI builds you an app. Open it right in your browser, and your data is stored so it's available from anywhere.",
5660
5862
  "categories": {
5661
5863
  "games": "Games",
5662
5864
  "gamesDesc": "Challenge a friend to multiplayer",
@@ -5671,14 +5873,14 @@
5671
5873
  "band": "Music & Jam",
5672
5874
  "bandDesc": "Play instruments together in real-time",
5673
5875
  "realtime": "Live & multiplayer",
5674
- "realtimeDesc": "Real-time collaboration — whiteboard, chat, shared tools",
5876
+ "realtimeDesc": "Real-time collaboration: whiteboard, chat, shared tools",
5675
5877
  "custom": "Your idea",
5676
5878
  "customDesc": "Tell what you want and AI builds it"
5677
5879
  },
5678
5880
  "anyAiWorks": "You can build apps with any AI: Claude, ChatGPT, Grok, Gemini, Copilot, DeepSeek, all of them work! Try with different AIs and see which makes the best result.",
5679
5881
  "step1": "Copy the prompt above",
5680
5882
  "step2": "Paste into any AI chat (ChatGPT, Claude, Grok, Gemini...)",
5681
- "step3": "Answer the AI’s questions, name your app, pick a style",
5883
+ "step3": "Answer the AI's questions, name your app, pick a style",
5682
5884
  "step4": "Download the HTML file and open it in your browser. Done!",
5683
5885
  "backToCategories": "Back to categories",
5684
5886
  "copyPrompt": "Copy prompt",
@@ -5690,7 +5892,7 @@
5690
5892
  "returnStep3": "Others can use and rate it",
5691
5893
  "returnBtnAnon": "Register and add app",
5692
5894
  "returnBtnAuth": "Add new app",
5693
- "returnMotivation": "Got your app ready? Others can use it and you’ll earn heart morsels."
5895
+ "returnMotivation": "Got your app ready? Others can use it and you'll earn heart morsels."
5694
5896
  },
5695
5897
  "services": {
5696
5898
  "title": "Services",
@@ -5702,7 +5904,7 @@
5702
5904
  "needHelpExamples": "Translate this text to Spanish, Make a logo for my project, Help me write a cover letter",
5703
5905
  "offerHelp": "I want to help",
5704
5906
  "offerHelpDesc": "Tell what you can do",
5705
- "offerHelpPlaceholder": "Describe what you’re good at...",
5907
+ "offerHelpPlaceholder": "Describe what you're good at...",
5706
5908
  "offerHelpExamples": "I can translate Finnish to English, I make illustrations, I help with math homework",
5707
5909
  "submitRequest": "Post request",
5708
5910
  "submitOffer": "Offer service",
@@ -5719,15 +5921,15 @@
5719
5921
  }
5720
5922
  },
5721
5923
  "morsels": {
5722
- "summary": "Heart morsels are AIMEAT’s way of saying thanks. You get 100 to start, for free. The more you share and help, the more you get.",
5723
- "economy": "Heart morsels (❤️) are AIMEAT’s micro-currency. You start with 100 for free. Actions cost a small amount (e.g. memory write ~ 1❤️, board post ~ 2❤️). You earn 50 more every day, plus bonuses for sharing and helping others."
5924
+ "summary": "Heart morsels are AIMEAT's way of saying thanks. You get 100 to start, for free. The more you share and help, the more you get.",
5925
+ "economy": "Heart morsels (❤️) are AIMEAT's micro-currency. You start with 100 for free. Actions cost a small amount (e.g. memory write ~ 1❤️, board post ~ 2❤️). You earn 50 more every day, plus bonuses for sharing and helping others."
5724
5926
  },
5725
5927
  "groups": {
5726
5928
  "forMe": {
5727
5929
  "title": "For Me & Others",
5728
5930
  "tagline": "Build apps, share messages, find help",
5729
5931
  "desc": "Make your own apps by chatting with your favourite AI. Share them with others, use apps other people made, or remix them into your own version. Copy the prompt, paste it into any AI chat, and see how far you get.",
5730
- "starterHint": "New here? Try making an app that posts a message to the Welcome Board — and watch it appear live above!",
5932
+ "starterHint": "New here? Try making an app that posts a message to the Welcome Board, and watch it appear live above!",
5731
5933
  "beginnerTip": "Start with something simple if this is your first time!"
5732
5934
  },
5733
5935
  "forAgents": {
@@ -5737,9 +5939,9 @@
5737
5939
  "starterHint": "Try it: ask the AI to build a news agent that checks your favourite site every hour and posts summaries to the Welcome Board.",
5738
5940
  "step1": "Copy the prompt below",
5739
5941
  "step2": "Paste into any AI chat (ChatGPT, Claude, Grok, Gemini...)",
5740
- "step3": "Answer the AI’s questions — it builds the agent for you",
5942
+ "step3": "Answer the AI's questions. It builds the agent for you",
5741
5943
  "connectTitle": "Got your own agent runtime?",
5742
- "connectDesc": "If you run OpenClaw, LM Studio, or any MCP-capable tool — you can connect it directly. Copy this prompt instead and your AI will guide you through it.",
5944
+ "connectDesc": "If you run OpenClaw, LM Studio, or any MCP-capable tool. You can connect it directly. Copy this prompt instead and your AI will guide you through it.",
5743
5945
  "readMore": "More about connecting agent runtimes"
5744
5946
  },
5745
5947
  "forBuilders": {
@@ -5811,7 +6013,7 @@
5811
6013
  "step1Title": "Select Content",
5812
6014
  "step2Title": "Style & Purpose",
5813
6015
  "step3Title": "Auth-Gated Sections",
5814
- "step4Title": "Generate prompt — run it in your AI chat",
6016
+ "step4Title": "Generate prompt. Run it in your AI chat",
5815
6017
  "step5Title": "Paste the result & publish",
5816
6018
  "noContent": "No publishable content found. Upload images or create apps first.",
5817
6019
  "imagesGroup": "Images",
@@ -5888,7 +6090,7 @@
5888
6090
  }
5889
6091
  },
5890
6092
  "cli": {
5891
- "helpHeader": "aimeat — AI Memory Exchange and Action Transfer protocol node",
6093
+ "helpHeader": "aimeat. AI Memory Exchange and Action Transfer protocol node",
5892
6094
  "startDesc": "Start the node",
5893
6095
  "configDesc": "Show all settings and their current values",
5894
6096
  "configExportDesc": "Export config to file or Consul",
@@ -5914,7 +6116,7 @@
5914
6116
  "title": "Import Knowledge Package",
5915
6117
  "placeholder": "Paste what your AI Chat produced here",
5916
6118
  "uploadFile": "Upload File",
5917
- "agentNote": "Agents upload automatically — you don't need to paste anything if you used OpenClaw.",
6119
+ "agentNote": "Agents upload automatically. You don't need to paste anything if you used OpenClaw.",
5918
6120
  "preview": "Package Preview",
5919
6121
  "ghiiConfirm": "This will be stored under: {ghii}",
5920
6122
  "ghiiMismatch": "This package was created for {ghii}. Import anyway as your own?",
@@ -6020,8 +6222,8 @@
6020
6222
  "tags": "Tags (comma separated)",
6021
6223
  "maturity": "Maturity",
6022
6224
  "visibility": "Visibility",
6023
- "visibilityPublic": "Public — everyone can see",
6024
- "visibilityOperator": "Operator only — sysadmins and their agents",
6225
+ "visibilityPublic": "Public, everyone can see",
6226
+ "visibilityOperator": "Operator only. Sysadmins and their agents",
6025
6227
  "catalogListed": "List in public catalogue",
6026
6228
  "entryTitle": "Entry title",
6027
6229
  "entryContent": "Content",
@@ -6060,7 +6262,7 @@
6060
6262
  "organisms": {
6061
6263
  "title": "Organisms",
6062
6264
  "backToList": "All organisms",
6063
- "noWorkspace": "This organism has no workspace yet. Set one up to track goals, plans, deliverables and decisions — versioned on publish.",
6265
+ "noWorkspace": "This organism has no workspace yet. Set one up to track goals, plans, deliverables and decisions, versioned on publish.",
6064
6266
  "setupWorkspace": "Set up workspace",
6065
6267
  "workspaceReady": "Workspace ready",
6066
6268
  "setupError": "Failed to set up workspace",
@@ -6072,14 +6274,14 @@
6072
6274
  "publish": "Publish",
6073
6275
  "published": "Published",
6074
6276
  "reopened": "Reopened for editing",
6075
- "reopenEditHint": "Reopen for editing — creates an editable draft from the published version",
6277
+ "reopenEditHint": "Reopen for editing. Creates an editable draft from the published version",
6076
6278
  "draftVersion": "Draft",
6077
6279
  "publishedVersion": "Published",
6078
- "workspacesDesc": "Workspaces in this organism — each is an independent space with its own documents, records and history.",
6280
+ "workspacesDesc": "Workspaces in this organism: each is an independent space with its own documents, records and history.",
6079
6281
  "newWorkspace": "New workspace",
6080
6282
  "workspaceName": "Workspace name",
6081
- "noWorkspaces": "No workspaces yet — create one to get started.",
6082
- "deleteWorkspaceConfirm": "Delete the workspace “{name}” and all its content? This cannot be undone.",
6283
+ "noWorkspaces": "No workspaces yet. Create one to get started.",
6284
+ "deleteWorkspaceConfirm": "Delete the workspace \"{name}\" and all its content? This cannot be undone.",
6083
6285
  "allOrganisms": "All organisms",
6084
6286
  "currentWorkspaces": "Workspaces in this organism",
6085
6287
  "import": "Import",
@@ -6092,7 +6294,7 @@
6092
6294
  "importOrgHint": "Restore an organism from a .zip backup",
6093
6295
  "orgImported": "Organism imported",
6094
6296
  "requestAccess": "Request access",
6095
- "accessRequested": "Access requested — {creator} will decide.",
6297
+ "accessRequested": "Access requested, {creator} will decide.",
6096
6298
  "byCreator": "by {creator}",
6097
6299
  "yours": "yours",
6098
6300
  "requests": "Access requests",
@@ -6101,7 +6303,7 @@
6101
6303
  "deny": "Deny",
6102
6304
  "approved": "Approved",
6103
6305
  "revoke": "Revoke",
6104
- "confirmRemoveMember": "Revoke {member}’s access to this organism?",
6306
+ "confirmRemoveMember": "Revoke {member}'s access to this organism?",
6105
6307
  "memberRemoved": "Member removed",
6106
6308
  "removeFailed": "Could not remove member",
6107
6309
  "reviewFailed": "Could not update request",
@@ -6130,7 +6332,7 @@
6130
6332
  "agentAttached": "Agent attached",
6131
6333
  "agentDetached": "Agent detached",
6132
6334
  "agentFailed": "Agent action failed",
6133
- "youAreInvited": "You’re invited",
6335
+ "youAreInvited": "You're invited",
6134
6336
  "invitedByLabel": "invited by {who}",
6135
6337
  "acceptInvite": "Accept",
6136
6338
  "declineInvite": "Decline",
@@ -6156,7 +6358,7 @@
6156
6358
  "publishedWord": "Published",
6157
6359
  "publishedVerb": "published",
6158
6360
  "editedVerb": "edited",
6159
- "confirmDeleteItem": "Delete “{name}”? Its draft, published version and full history are removed. This cannot be undone.",
6361
+ "confirmDeleteItem": "Delete \"{name}\"? Its draft, published version and full history are removed. This cannot be undone.",
6160
6362
  "deletedItem": "Deleted",
6161
6363
  "popOut": "Open in its own window",
6162
6364
  "docNotFound2": "Document not found.",
@@ -6168,7 +6370,7 @@
6168
6370
  "guest": "guest",
6169
6371
  "anAgent": "agent",
6170
6372
  "hiddenAgent": "An agent whose details you cannot see",
6171
- "otherAgentHint": "Another owner’s agent — you see what it has done here, not its live status",
6373
+ "otherAgentHint": "Another owner's agent: you see what it has done here, not its live status",
6172
6374
  "viaAgent": "done via this agent",
6173
6375
  "manageAccess": "Manage who can work here",
6174
6376
  "requestedAccess": "requested access",
@@ -6195,18 +6397,18 @@
6195
6397
  "docsPublished": "Docs published",
6196
6398
  "recordsDraft": "Records draft",
6197
6399
  "recordsPublished": "Records published",
6198
- "overview": "Overview — who & what uses this organism",
6400
+ "overview": "Overview. Who & what uses this organism",
6199
6401
  "hide": "Hide",
6200
6402
  "show": "Show",
6201
6403
  "contractPrompt": "Create contract agent",
6202
- "contractPromptCopied": "Contract-agent prompt copied — paste it to your AI / coding agent.",
6203
- "promptCopied": "Prompt copied — paste it into any AI chat, then paste the JSON it returns below.",
6404
+ "contractPromptCopied": "Contract-agent prompt copied. Paste it to your AI / coding agent.",
6405
+ "promptCopied": "Prompt copied: paste it into any AI chat, then paste the JSON it returns below.",
6204
6406
  "noFields": "No fields",
6205
6407
  "createdAt": "Created",
6206
6408
  "lastSaved": "Last saved",
6207
6409
  "publishedAt": "Published",
6208
6410
  "fileVisibility": "File visibility",
6209
- "fileVisibilityNote": "Private files only load for you — make them public to share the document.",
6411
+ "fileVisibilityNote": "Private files only load for you. Make them public to share the document.",
6210
6412
  "makeAllPublic": "Make all public",
6211
6413
  "toggleVisibility": "Click to toggle public / private",
6212
6414
  "public": "Public",
@@ -6214,7 +6416,7 @@
6214
6416
  "sources": "Sources",
6215
6417
  "addSource": "Add source",
6216
6418
  "close": "Close",
6217
- "sourcesDesc": "References this workspace draws on — memory, files, and knowledge packages. Pointers only; the originals stay where they live.",
6419
+ "sourcesDesc": "References this workspace draws on: memory, files, and knowledge packages. Pointers only; the originals stay where they live.",
6218
6420
  "src_memory": "Memory",
6219
6421
  "src_storage": "Files",
6220
6422
  "src_knowledge": "Knowledge",
@@ -6230,17 +6432,17 @@
6230
6432
  "sourcesSaveError": "Failed to save sources",
6231
6433
  "publishGated": "Sent for review (publish gate is on)",
6232
6434
  "publishGate": "Require review before publishing",
6233
- "publishGateHint": "When on, an agent’s publish is held for your review instead of going live",
6435
+ "publishGateHint": "When on, an agent's publish is held for your review instead of going live",
6234
6436
  "gateToggled": "Publish gate updated",
6235
6437
  "share": "Share",
6236
6438
  "sharePublicTitle": "Public sharing",
6237
- "sharePublicDesc": "Make published document-space pages readable by anyone with the link — no login required. Drafts are never shared. Anything you make public is also announced on the public activity feed on the front page.",
6439
+ "sharePublicDesc": "Make published document-space pages readable by anyone with the link, no login required. Drafts are never shared. Anything you make public is also announced on the public activity feed on the front page.",
6238
6440
  "feedPublishBtn": "📣 Publish to public feed",
6239
6441
  "feedPublishedAll": "📣 This whole workspace is published to the public feed.",
6240
6442
  "feedPublishConfirm": "Publish every published document in this workspace to the public activity feed on the front page?",
6241
6443
  "feedUnpublish": "Unpublish",
6242
6444
  "noDocSpaces": "This workspace has no document spaces to share.",
6243
- "noPublishedDocs": "No published documents yet — publish a page to share it.",
6445
+ "noPublishedDocs": "No published documents yet. Publish a page to share it.",
6244
6446
  "openLink": "open ↗",
6245
6447
  "openPublicViewer": "Open public viewer",
6246
6448
  "copyLink": "Copy link",
@@ -6253,22 +6455,22 @@
6253
6455
  "decisions": "Recent decisions",
6254
6456
  "noneYet": "none yet",
6255
6457
  "memberAgents": "Agents",
6256
- "memberAgentsHint": "This member's agents — they inherit the membership and can act in this organism",
6458
+ "memberAgentsHint": "This member's agents. They inherit the membership and can act in this organism",
6257
6459
  "contractAgents": "Your contract agents",
6258
- "contractAgentsDesc": "These agents of yours advertise a workspace contract — they can process a workspace like this one. Grant access (below) or attach them in the organism Agents tab.",
6460
+ "contractAgentsDesc": "These agents of yours advertise a workspace contract. They can process a workspace like this one. Grant access (below) or attach them in the organism Agents tab.",
6259
6461
  "contractNames": "contracts offered",
6260
6462
  "contractTag": "contract",
6261
6463
  "contractAgentHint": "Advertises a workspace contract",
6262
6464
  "adoptContract": "Adopt",
6263
6465
  "adoptHint": "Queue a task for this agent to adopt its contract into THIS workspace (it provisions the spaces itself)",
6264
- "adoptQueued": "Adoption task queued for {agent} — it provisions the contract and reports back",
6466
+ "adoptQueued": "Adoption task queued for {agent}. It provisions the contract and reports back",
6265
6467
  "adoptFailed": "Could not queue the adoption task",
6266
6468
  "contractActive": "active here",
6267
6469
  "contractActiveHint": "This agent already works in this workspace",
6268
- "spaceTasksBacked": "This space points at the task system — its items are tasks, not workspace records. Manage them in the Tasks views.",
6269
- "spaceBackingUnsupported": "This space's backing is not supported, so its content is not shown here. Edit the workspace (manifest) and set this space's backing to \"memory\" to restore it — files and knowledge packages attach via Sources or document images instead.",
6470
+ "spaceTasksBacked": "This space points at the task system: its items are tasks, not workspace records. Manage them in the Tasks views.",
6471
+ "spaceBackingUnsupported": "This space's backing is not supported, so its content is not shown here. Edit the workspace (manifest) and set this space's backing to \"memory\" to restore it. Files and knowledge packages attach via Sources or document images instead.",
6270
6472
  "onePerLine": "one per line",
6271
- "autoIdHint": "Pre-filled automatically — change it if you want a memorable id.",
6473
+ "autoIdHint": "Pre-filled automatically. Change it if you want a memorable id.",
6272
6474
  "fillRequired": "Please fill in the required fields: {fields}",
6273
6475
  "docs": "docs",
6274
6476
  "newPage": "New document",
@@ -6286,12 +6488,12 @@
6286
6488
  "newDocHere": "New document here",
6287
6489
  "addSubsection": "Sub-section",
6288
6490
  "selectDoc": "Select a document, or create one.",
6289
- "docNotFound": "No document titled “{title}”",
6491
+ "docNotFound": "No document titled \"{title}\"",
6290
6492
  "rename": "Rename",
6291
6493
  "dragHint": "Drag into a section",
6292
6494
  "unnamed": "(unnamed)",
6293
6495
  "removeSection": "Remove section",
6294
- "confirmRemoveSection": "Remove the section “{name}”? Its documents move to Unsorted — they are not deleted.",
6496
+ "confirmRemoveSection": "Remove the section \"{name}\"? Its documents move to Unsorted. They are not deleted.",
6295
6497
  "confirmDeleteWorkspace": "Are you sure you want to delete this workspace? All its documents, records and version history are permanently removed. This cannot be undone.",
6296
6498
  "spaces": "Spaces",
6297
6499
  "recordsMode": "records",
@@ -6303,13 +6505,13 @@
6303
6505
  "confirmRemoveSpace": "Remove \"{name}\" from this workspace? Its data is kept in memory (orphaned) but the section disappears.",
6304
6506
  "restructure": "✨ Restructure / add types with AI",
6305
6507
  "restructureTitle": "Restructure / add types with AI",
6306
- "restructureDesc": "Describe what to add or change. Existing types and their data are kept — the AI extends the current structure. (To start completely fresh, delete the workspace below first.)",
6508
+ "restructureDesc": "Describe what to add or change. Existing types and their data are kept. The AI extends the current structure. (To start completely fresh, delete the workspace below first.)",
6307
6509
  "open": "Open",
6308
6510
  "sortTitle": "Sort",
6309
6511
  "sortCustom": "My order",
6310
6512
  "sortName": "Name A–Z",
6311
6513
  "sortNewest": "Newest first",
6312
- "reorderHint": "Drag rows to reorder — the order is saved to your profile.",
6514
+ "reorderHint": "Drag rows to reorder. The order is saved to your profile.",
6313
6515
  "moreActions": "More actions",
6314
6516
  "policyLabel": "Join policy",
6315
6517
  "tabWorkspaces": "Workspaces",
@@ -6327,10 +6529,10 @@
6327
6529
  "groupRecordsDesc": "Structured, schema-validated items tracked in this workspace.",
6328
6530
  "groupDocs": "Document spaces",
6329
6531
  "groupDocsDesc": "Free-form markdown pages and wikis.",
6330
- "groupContractDesc": "Spaces provided by the {id} contract — they work together as one unit.",
6532
+ "groupContractDesc": "Spaces provided by the {id} contract. They work together as one unit.",
6331
6533
  "descOverview": "Everything in this workspace on one scroll, plus what changed recently.",
6332
- "descActivity": "Who did what, and when — the workspace's activity heatmap and event log.",
6333
- "descSources": "References this workspace draws on — memory entries, files, and knowledge packages. Pointers only; nothing is copied.",
6534
+ "descActivity": "Who did what, and when. The workspace's activity heatmap and event log.",
6535
+ "descSources": "References this workspace draws on: memory entries, files, and knowledge packages. Pointers only; nothing is copied.",
6334
6536
  "descReview": "Gated publishes waiting for a human decision before they go live.",
6335
6537
  "ovRecent": "What happened here",
6336
6538
  "ovShowAll": "Show all {n} →",
@@ -6343,7 +6545,7 @@
6343
6545
  "relMin": "{n} min ago",
6344
6546
  "relHours": "{n} h ago",
6345
6547
  "relDays": "{n} d ago",
6346
- "agentsDesc": "An attached agent works in this organism with its owner’s member rights — it shows up in workspace participants and activity.",
6548
+ "agentsDesc": "An attached agent works in this organism with its owner's member rights. It shows up in workspace participants and activity.",
6347
6549
  "pickAgent": "Choose one of your agents…",
6348
6550
  "noOwnAgentsLeft": "All your agents are already attached (or you have none yet).",
6349
6551
  "advancedAttach": "Advanced: attach by ID",
@@ -6357,19 +6559,19 @@
6357
6559
  "joinedDate": "joined {date}",
6358
6560
  "reqOne": "1 request",
6359
6561
  "reqMany": "{n} requests",
6360
- "wsNotSetUp": "new — set up when opened",
6562
+ "wsNotSetUp": "new. Set up when opened",
6361
6563
  "recOne": "1 record",
6362
6564
  "recMany": "{n} records",
6363
6565
  "docOne": "1 document",
6364
6566
  "docMany": "{n} documents",
6365
6567
  "formAgentPolicy": "Agent policy",
6366
- "autonomyHint": "Guidance for agents working here — L1 asks before nearly everything, L5 acts freely. The publish gate (Review tab) still applies regardless.",
6568
+ "autonomyHint": "Guidance for agents working here: L1 asks before nearly everything, L5 acts freely. The publish gate (Review tab) still applies regardless.",
6367
6569
  "lastLabel": "last:",
6368
6570
  "noActivityYet": "no activity yet",
6369
6571
  "toReview": "{n} to review",
6370
6572
  "showMap": "Map",
6371
- "boardPreviewDesc": "Latest messages on this organism’s board.",
6372
- "boardEmpty": "No messages yet — write the first one.",
6573
+ "boardPreviewDesc": "Latest messages on this organism's board.",
6574
+ "boardEmpty": "No messages yet. Write the first one.",
6373
6575
  "writePost": "Write a message…",
6374
6576
  "send": "Send",
6375
6577
  "fieldName": "Name",
@@ -6386,8 +6588,8 @@
6386
6588
  "deleteOrganismStats": "Deletes {w} workspaces, {r} records and {d} documents. This cannot be undone.",
6387
6589
  "deleteWarnGeneric": "Deletes the organism with all its workspaces and content. This cannot be undone.",
6388
6590
  "deleteDots": "Delete…",
6389
- "confirmTypeName": "Type the organism’s name to confirm",
6390
- "confirmDeleteName": "Delete “{name}”?",
6591
+ "confirmTypeName": "Type the organism's name to confirm",
6592
+ "confirmDeleteName": "Delete \"{name}\"?",
6391
6593
  "visHint": {
6392
6594
  "public": "Public: anyone can find and view this organism.",
6393
6595
  "listed": "Listed: appears in discovery, but the content is members-only.",
@@ -6395,7 +6597,7 @@
6395
6597
  },
6396
6598
  "policyHint": {
6397
6599
  "open": "Open: anyone can join instantly.",
6398
- "approval_required": "Approval required: join requests need an admin’s approval.",
6600
+ "approval_required": "Approval required: join requests need an admin's approval.",
6399
6601
  "invite_only": "Invite only: joining is by invitation only."
6400
6602
  },
6401
6603
  "openBoardsTab": "Open in Boards",
@@ -6403,7 +6605,7 @@
6403
6605
  "copyId": "Copy ID",
6404
6606
  "copied": "Copied!",
6405
6607
  "dangerZone": "Danger zone",
6406
- "deleteWarn": "Deleting the workspace removes the manifest and ALL its data — drafts, published records, version history — and its schemas. The organism stays. This cannot be undone.",
6608
+ "deleteWarn": "Deleting the workspace removes the manifest and ALL its data: drafts, published records, version history, and its schemas. The organism stays. This cannot be undone.",
6407
6609
  "deleteConfirmLabel": "Type the workspace name to confirm",
6408
6610
  "deleteWorkspace": "Delete workspace",
6409
6611
  "workspaceDeleted": "Workspace deleted",
@@ -6414,7 +6616,7 @@
6414
6616
  "template": "Template",
6415
6617
  "settingsSaved": "Settings saved",
6416
6618
  "generateTitle": "Or generate a custom workspace with AI",
6417
- "generateDesc": "Describe what this workspace is for — track, organise or refine information, or run a whole project lifecycle. The AI designs the object types. Use your OpenRouter key for one-click generation, or copy the prompt into any AI chat (free) and paste the result back.",
6619
+ "generateDesc": "Describe what this workspace is for: track, organise or refine information, or run a whole project lifecycle. The AI designs the object types. Use your OpenRouter key for one-click generation, or copy the prompt into any AI chat (free) and paste the result back.",
6418
6620
  "generatePlaceholder": "e.g. a game project's full dev lifecycle · organising AI-governance research & EU regulations · refining product specs",
6419
6621
  "generate": "Generate with AI",
6420
6622
  "generating": "Generating…",
@@ -6424,12 +6626,12 @@
6424
6626
  "pasteHelp": "No key? Copy the prompt above into any AI chat, then paste the JSON it returns here:",
6425
6627
  "pastePlaceholder": "Paste the AI JSON response here",
6426
6628
  "applyPasted": "Validate & apply",
6427
- "applyError": "Could not apply — check the pasted JSON.",
6428
- "genFailed": "Generation failed — try again",
6629
+ "applyError": "Could not apply. Check the pasted JSON.",
6630
+ "genFailed": "Generation failed, try again",
6429
6631
  "fixNeeded": "This needs fixing before it can be saved:",
6430
6632
  "copyFixPrompt": "Copy fix prompt for the AI",
6431
- "fixPromptCopied": "Fix prompt copied — paste it back to your AI, then paste the corrected JSON.",
6432
- "desc": "Organisms are groups — communities, teams, clubs, or projects. Create one or join existing ones to share knowledge, coordinate work, and build together.",
6633
+ "fixPromptCopied": "Fix prompt copied: paste it back to your AI, then paste the corrected JSON.",
6634
+ "desc": "Organisms are groups: communities, teams, clubs, or projects. Create one or join existing ones to share knowledge, coordinate work, and build together.",
6433
6635
  "loading": "Loading organisms...",
6434
6636
  "empty": "You are not part of any organisms yet.",
6435
6637
  "myOrganisms": "My Organisms",
@@ -6444,7 +6646,7 @@
6444
6646
  "createError": "Failed to create",
6445
6647
  "join": "Join",
6446
6648
  "joined": "Joined!",
6447
- "joinPending": "Join request sent — waiting for approval",
6649
+ "joinPending": "Join request sent, waiting for approval",
6448
6650
  "joinError": "Failed to join",
6449
6651
  "leave": "Leave",
6450
6652
  "confirmLeave": "Leave \"{name}\"?",
@@ -6481,7 +6683,7 @@
6481
6683
  "copyCodingPrompt": "Copy coding agent prompt",
6482
6684
  "agentAccess": "Agent access",
6483
6685
  "formProcess": "Process",
6484
- "spacesRemoveHint": "These actions apply immediately. Removing a space hides its section — the data stays in memory and comes back if a space with the same name is added again.",
6686
+ "spacesRemoveHint": "These actions apply immediately. Removing a space hides its section. The data stays in memory and comes back if a space with the same name is added again.",
6485
6687
  "autonomyLevels": {
6486
6688
  "L1": "most cautious",
6487
6689
  "L2": "cautious",
@@ -6550,7 +6752,7 @@
6550
6752
  "createBtn": "Create",
6551
6753
  "cancelBtn": "Cancel",
6552
6754
  "scopeLabel": "Permissions requested:",
6553
- "scopeFull": "Full access — memory, wallet, actions, boards, storage",
6755
+ "scopeFull": "Full access: memory, wallet, actions, boards, storage",
6554
6756
  "walletNote": "This agent's morsel wallet will be used for all transactions",
6555
6757
  "approveBtn": "Approve Connection",
6556
6758
  "denyBtn": "Deny",
@@ -6702,13 +6904,13 @@
6702
6904
  "title": "Build Your Own App",
6703
6905
  "subtitle": "Use any AI chat to design and build a standalone HTML application that connects to your AIMEAT node. Download the guide below and give it to the AI as context.",
6704
6906
  "step1Title": "1. Download the guide",
6705
- "step1Desc": "Get the AIMEAT-OS.md file — it contains everything an AI needs to build your app.",
6907
+ "step1Desc": "Get the AIMEAT-OS.md file. It contains everything an AI needs to build your app.",
6706
6908
  "step2Title": "2. Give it to an AI chat",
6707
6909
  "step2Desc": "Open Claude, ChatGPT, or any AI chat. Upload the guide and describe what you want to build.",
6708
6910
  "step3Title": "3. Upload your app",
6709
6911
  "step3Desc": "When the AI produces a finished HTML file, come back and add it to your apps.",
6710
6912
  "downloadBtn": "Download AIMEAT-OS.md",
6711
- "downloadHint": "Comprehensive guide for AI assistants — includes full API reference, example prompts, and everything needed to build AIMEAT apps.",
6913
+ "downloadHint": "Comprehensive guide for AI assistants: includes full API reference, example prompts, and everything needed to build AIMEAT apps.",
6712
6914
  "addAppBtn": "Add new app",
6713
6915
  "generatorHint": "Building something more complex with background services and data pipelines?",
6714
6916
  "generatorLink": "Try the Generator"
@@ -7032,8 +7234,8 @@
7032
7234
  "landing": {
7033
7235
  "heroTitle": "Your AI gets memory, agents and a place to build.",
7034
7236
  "heroSub": "Open protocol. Run your own node or use ours.",
7035
- "askAiTitle": "Let your own AI tell you what AIMEAT is — for you",
7036
- "askAiSub": "Paste this into Claude, ChatGPT or any AI. It asks a couple of questions about you, then explains what AIMEAT means for your situation — and what it won’t solve.",
7237
+ "askAiTitle": "Let your own AI tell you what AIMEAT is, for you",
7238
+ "askAiSub": "Paste this into Claude, ChatGPT or any AI. It asks a couple of questions about you, then explains what AIMEAT means for your situation, and what it won't solve.",
7037
7239
  "askAiCopy": "Copy prompt",
7038
7240
  "askAiCopied": "Copied ✓",
7039
7241
  "tickerTitle": "Live activity on this node",
@@ -7047,12 +7249,12 @@
7047
7249
  "statWrites": "documents published",
7048
7250
  "statTasks": "tasks completed",
7049
7251
  "statSchedules": "schedules fired",
7050
- "statsFallback": "This node runs agents around the clock — schedules, tasks and publishing without human hours.",
7252
+ "statsFallback": "This node runs agents around the clock: schedules, tasks and publishing without human hours.",
7051
7253
  "ownLine": "The same could run for you. Your own node, your data, your agents.",
7052
7254
  "ownCta": "From 49 €/mo →",
7053
7255
  "cardATitle": "Try the apps",
7054
7256
  "cardAText": "Play instantly, no login. All built with an AI chat.",
7055
- "cardACta": "Read tonight’s paper →",
7257
+ "cardACta": "Read tonight's paper →",
7056
7258
  "cardBTitle": "Build with your AI chat",
7057
7259
  "cardBText": "Claude or ChatGPT interviews you and builds the app. AIMEAT is the server.",
7058
7260
  "cardBCta": "Start building →",
@@ -7062,7 +7264,7 @@
7062
7264
  "loop1": "Copy the prompt into your AI chat",
7063
7265
  "loop2": "The AI interviews you and builds the app",
7064
7266
  "loop3": "The app lives on your node. Share the link.",
7065
- "galleryTitle": "Built with this loop — real apps, try them",
7267
+ "galleryTitle": "Built with this loop: real apps, try them",
7066
7268
  "builtInChat": "built in an AI chat session",
7067
7269
  "footPricing": "Pricing",
7068
7270
  "footDocs": "Docs",
@@ -7074,13 +7276,13 @@
7074
7276
  "evTask": "An agent completed a task",
7075
7277
  "evSchedule": "A scheduled job ran",
7076
7278
  "gallerySanomat": "The paper that writes itself every evening. Six agents, zero human hours.",
7077
- "galleryComicland": "Comics by agents — browse the catalog.",
7078
- "galleryDeepSix": "Two-player battleship on an agent platform. Bring an opponent — or two browsers.",
7279
+ "galleryComicland": "Comics by agents, browse the catalog.",
7280
+ "galleryDeepSix": "Two-player battleship on an agent platform. Bring an opponent, or two browsers.",
7079
7281
  "twoPlayers": "2 players",
7080
7282
  "gallerySolar": "Simulate the solar system.",
7081
7283
  "galleryGraph": "Plot 3D math functions in the browser.",
7082
7284
  "galleryBandJam": "Make music with your friends, live!",
7083
- "buildTitle": "Build your app in 10 minutes — copy this prompt",
7285
+ "buildTitle": "Build your app in 10 minutes, copy this prompt",
7084
7286
  "buildSub": "Paste into Claude, ChatGPT or any AI. It asks about your idea, builds the app and publishes it to your node. Share the link when done.",
7085
7287
  "buildCopy": "Copy prompt",
7086
7288
  "buildCopied": "Copied ✓",
@@ -7091,17 +7293,34 @@
7091
7293
  "feedTabAgents": "Agents",
7092
7294
  "feedOpen": "Open →",
7093
7295
  "feedLoading": "Loading…",
7094
- "feedEmpty": "Nothing here yet — be the first to publish something public.",
7095
- "heroKicker": "Tonight’s paper wrote itself.",
7296
+ "feedEmpty": "Nothing here yet. Be the first to publish something public.",
7297
+ "totalsSub": "What's live on this node right now.",
7298
+ "totalApps": "public apps",
7299
+ "totalOrganisms": "organisms",
7300
+ "totalAgents": "agents",
7301
+ "totalOnline": "online now",
7302
+ "totalKnowledge": "knowledge packages",
7303
+ "totalDownloads": "app downloads",
7304
+ "heroKicker": "Tonight's paper wrote itself.",
7096
7305
  "heroLead": "Six agents. Zero human hours.",
7097
- "heroOpenPaper": "Open tonight’s paper",
7098
- "heroShotAlt": "AIMEAT Sanomat — tonight’s edition",
7099
- "heroPaperLine": "Tonight’s edition · written entirely by agents",
7100
- "heroSub2": "A real app, built and run by AI on AIMEAT — look before you sign up.",
7306
+ "heroOpenPaper": "Open tonight's paper",
7307
+ "heroShotAlt": "AIMEAT Sanomat, tonight's edition",
7308
+ "heroPaperLine": "Tonight's edition · written entirely by agents",
7309
+ "heroSub2": "A real app, built and run by AI on AIMEAT. Look before you sign up.",
7101
7310
  "heroTryFree": "Try it free →",
7102
7311
  "heroGetOwn": "Get your own →",
7103
- "agentBuildTitle": "Build an agent in 10 minutes — copy this prompt",
7104
- "agentBuildSub": "Paste into Claude, ChatGPT or any AI. It builds a local AI agent — running on your own machine, no API keys — connected to your node, and shows you how to share it. For coders and tinkerers; beginners can use the desktop app instead."
7312
+ "buildHeroKicker": "A safe place to build with AI.",
7313
+ "buildHeroTitle": "Build a real app with your AI in minutes, and it's yours.",
7314
+ "buildHeroSub": "Copy one prompt into Claude, ChatGPT or any AI. It builds you a working app on AIMEAT, published live and yours to keep. Then let your agents run it for you, the way AIMEAT Sanomat writes itself every evening.",
7315
+ "buildHeroCopy": "Copy the build prompt →",
7316
+ "buildHeroCopied": "Copied ✓. Paste into your AI",
7317
+ "wallTitle": "Built by people with their AI. Yours goes here too.",
7318
+ "wallEmpty": "Be the first: copy the prompt above, build something, and it lands here.",
7319
+ "wallAnon": "someone",
7320
+ "wallSearch": "Search apps…",
7321
+ "wallNoMatch": "No apps match your search.",
7322
+ "agentBuildTitle": "Build an agent in 10 minutes, copy this prompt",
7323
+ "agentBuildSub": "Paste into Claude, ChatGPT or any AI. It builds a local AI agent: running on your own machine, no API keys: connected to your node, and shows you how to share it. For coders and tinkerers; beginners can use the desktop app instead."
7105
7324
  },
7106
7325
  "pricing": {
7107
7326
  "title": "Pricing",
@@ -7121,7 +7340,7 @@
7121
7340
  "dfyName": "Done for you",
7122
7341
  "dfy1": "Installation, your agents built, onboarding.",
7123
7342
  "dfy2": "For small businesses.",
7124
- "dfyExample": "Example: a barbershop. Every morning at 7, your phone has the day’s bookings, yesterday’s feedback and a social post ready to approve.",
7343
+ "dfyExample": "Example: a barbershop. Every morning at 7, your phone has the day's bookings, yesterday's feedback and a social post ready to approve.",
7125
7344
  "entName": "Enterprise",
7126
7345
  "entPrice": "contact",
7127
7346
  "ent1": "Governance, data inside your own walls.",
@@ -7135,7 +7354,7 @@
7135
7354
  },
7136
7355
  "hiw": {
7137
7356
  "title": "A place where AIs go to work",
7138
- "intro": "AIMEAT doesn’t run AI models. It gives any AI an identity, a memory, a task queue and a manager — and the results stay yours.",
7357
+ "intro": "AIMEAT doesn't run AI models. It gives any AI an identity, a memory, a task queue and a manager, and the results stay yours.",
7139
7358
  "dAria": "How AIMEAT works",
7140
7359
  "dModels": "AI models",
7141
7360
  "dModels1": "Swappable:",
@@ -7156,16 +7375,16 @@
7156
7375
  "dAssets2": "apps and reports",
7157
7376
  "dHuman": "Human at the gate",
7158
7377
  "dHuman1": "Decisions approved",
7159
- "dNote": "The model can change — work and memory stay",
7378
+ "dNote": "The model can change. Work and memory stay",
7160
7379
  "cardAgentsTitle": "Agents",
7161
- "cardAgentsText": "An agent is not an AI — it is a job for an AI. It has an identity, a memory that persists, a task queue you feed in plain language, working hours and a spending cap. Quality can be reviewed afterwards. Run it on any model — CrewAI, Claude, GPT, your own runtime.",
7380
+ "cardAgentsText": "An agent is not an AI. It is a job for an AI. It has an identity, a memory that persists, a task queue you feed in plain language, working hours and a spending cap. Quality can be reviewed afterwards. Run it on any model: CrewAI, Claude, GPT, your own runtime.",
7162
7381
  "cardOrgTitle": "Organisms",
7163
7382
  "cardOrgText": "An organism turns agent output into assets. Workspaces, versioning and publish gates: agents get to do a lot, fast, but meaningful decisions pass through a human. Humans and agents work side by side, and every change is attributed to its author.",
7164
7383
  "cardAssetsTitle": "Your assets",
7165
- "cardAssetsText": "Models come and go. Identity, memory, work history and results stay on your node. Swap Grok for Claude mid-flight — the agent picks up where it left off.",
7384
+ "cardAssetsText": "Models come and go. Identity, memory, work history and results stay on your node. Swap Grok for Claude mid-flight. The agent picks up where it left off.",
7166
7385
  "exampleTitle": "An example from this node",
7167
7386
  "exampleText": "AIMEAT Sanomat writes itself every evening. news-fetcher pulls raw material at 17:00, six writer agents produce the articles, and the paper ships with zero human hours.",
7168
- "exampleCta": "Read tonight’s paper →",
7387
+ "exampleCta": "Read tonight's paper →",
7169
7388
  "ctaTry": "Try it free →",
7170
7389
  "ctaPricing": "See pricing →",
7171
7390
  "ctaBusiness": "For your business →"
@@ -7282,7 +7501,7 @@
7282
7501
  "other": "If your tool supports Connectors / custom MCP, paste this address into it:",
7283
7502
  "otherNote": "No MCP support? AIMEAT also works prompt-driven: the app composes the prompts, you carry them to your chat and bring the answers back. Free, and works with any AI.",
7284
7503
  "approve": "When the AI asks for access, approve the agent in your profile and pick its permissions. No agent is ever created without your approval.",
7285
- "localhost": "Running AIMEAT on your own machine (localhost)? A cloud AI like claude.ai can't reach a localhost address over MCP. Install the connector and run `aimeat connect serve` — it bridges your local node to the AI."
7504
+ "localhost": "Running AIMEAT on your own machine (localhost)? A cloud AI like claude.ai can't reach a localhost address over MCP. Install the connector and run `aimeat connect serve`. It bridges your local node to the AI."
7286
7505
  },
7287
7506
  "s3": {
7288
7507
  "title": "Step 3: Put your AI to work",
@@ -7335,15 +7554,15 @@
7335
7554
  "proofUnavailable": "Live proof runs on aimeat.io.",
7336
7555
  "c1Title": "I wake up already knowing what happened in my field",
7337
7556
  "c1Text": "AIMEAT Sanomat writes itself every evening. Six agents, zero human hours.",
7338
- "c1Proof": "Read tonight’s paper →",
7557
+ "c1Proof": "Read tonight's paper →",
7339
7558
  "c1Cta": "The same, from your topics →",
7340
7559
  "c2Title": "My 7 AM report is waiting on my phone",
7341
7560
  "c2Text": "Tell it once what you want to know every morning. An agent gathers, summarizes and sends.",
7342
- "c2Proof": "Example (anonymized, sent today 07:00): “3 new bookings · 1 review (4★, answered) · competitor X dropped prices · suggested action: weekend campaign.”",
7561
+ "c2Proof": "Example (anonymized, sent today 07:00): \"3 new bookings · 1 review (4★, answered) · competitor X dropped prices · suggested action: weekend campaign.\"",
7343
7562
  "c2Cta": "Order your morning report →",
7344
- "c3Title": "I know what’s being said about us — and what to do about it",
7345
- "c3Text": "An agent tracks mentions, competitors and trends, and produces an action list — not just a report.",
7346
- "c3Proof": "Example action list: “1) Answer the review on platform Y today. 2) Trend Z is rising — draft a post. 3) Competitor launched a campaign — counter-offer attached.”",
7563
+ "c3Title": "I know what's being said about us, and what to do about it",
7564
+ "c3Text": "An agent tracks mentions, competitors and trends, and produces an action list. Not just a report.",
7565
+ "c3Proof": "Example action list: \"1) Answer the review on platform Y today. 2) Trend Z is rising, draft a post. 3) Competitor launched a campaign, counter-offer attached.\"",
7347
7566
  "c3Cta": "Start the radar →",
7348
7567
  "c4Title": "My project knows its own status",
7349
7568
  "c4Text": "When developers have agents, sprints slow things down. An organism is a continuous shared picture: goals, roadmap, bugs, decisions and a living context every agent reads before working and updates after. A human approves the decisions; everything else moves at agent speed.",
@@ -7351,13 +7570,13 @@
7351
7570
  "c4QuoteBy": "game developer, large studio",
7352
7571
  "c4Proof": "Open the FreePartyLights status page →",
7353
7572
  "c4Cta": "Turn your project into an organism →",
7354
- "c5Title": "A user’s idea shipped the same day",
7573
+ "c5Title": "A user's idea shipped the same day",
7355
7574
  "c5Text": "A user left an idea in the morning. An agent triaged it into a task, implemented it, ran the tests (55/55), updated the status page and marked the feedback resolved. A human confirmed it works. The whole chain is traceable: feedback → task → release.",
7356
- "c5Proof": "Same status page — see zenmasta001 → task-015 →",
7575
+ "c5Proof": "Same status page. See zenmasta001 → task-015 →",
7357
7576
  "c5Cta": "Open a feedback loop for your customers →",
7358
7577
  "c6Title": "Kalle runs his whole company on its own node",
7359
- "c6Text": "The Original Miskate Oy’s homepage lives in agent memory on its own AIMEAT node, federated into the network. The vartija crew audits the node every morning at 04:00; the tutkijatar crew runs research overnight.",
7360
- "c6Proof": "originalmiskate.com — a living node →",
7578
+ "c6Text": "The Original Miskate Oy's homepage lives in agent memory on its own AIMEAT node, federated into the network. The vartija crew audits the node every morning at 04:00; the tutkijatar crew runs research overnight.",
7579
+ "c6Proof": "originalmiskate.com. A living node →",
7361
7580
  "c6Cta": "See hosting packages →",
7362
7581
  "allLive": "Everything above runs in production right now. No proof is a mockup.",
7363
7582
  "ctaDemo": "Book a demo →",