@knotpad/app 0.1.0 → 0.1.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 (341) hide show
  1. package/bin/brief.js +165 -78
  2. package/package.json +3 -17
  3. package/app/(app)/calendar/page.tsx +0 -57
  4. package/app/(app)/error.tsx +0 -35
  5. package/app/(app)/graph/page.tsx +0 -32
  6. package/app/(app)/guide/page.tsx +0 -21
  7. package/app/(app)/kanban/loading.tsx +0 -24
  8. package/app/(app)/kanban/page.tsx +0 -59
  9. package/app/(app)/layout.tsx +0 -122
  10. package/app/(app)/list/loading.tsx +0 -21
  11. package/app/(app)/list/page.tsx +0 -137
  12. package/app/(app)/loading.tsx +0 -18
  13. package/app/(app)/notes/[noteId]/page.tsx +0 -84
  14. package/app/(app)/notes/layout.tsx +0 -30
  15. package/app/(app)/notes/page.tsx +0 -39
  16. package/app/(app)/page.tsx +0 -5
  17. package/app/(app)/settings/agent-token/page.tsx +0 -59
  18. package/app/(app)/settings/backup/page.tsx +0 -49
  19. package/app/(app)/settings/billing/page.tsx +0 -53
  20. package/app/(app)/settings/calendar/page.tsx +0 -41
  21. package/app/(app)/settings/layout.test.tsx +0 -39
  22. package/app/(app)/settings/layout.tsx +0 -71
  23. package/app/(app)/settings/page.tsx +0 -4
  24. package/app/(app)/settings/security/page.tsx +0 -43
  25. package/app/(app)/settings/team/page.tsx +0 -74
  26. package/app/(app)/settings/workspace/page.tsx +0 -27
  27. package/app/(app)/tasks/[taskId]/page.tsx +0 -79
  28. package/app/(auth)/forgot-password/page.tsx +0 -106
  29. package/app/(auth)/guest/page.tsx +0 -56
  30. package/app/(auth)/layout.tsx +0 -13
  31. package/app/(auth)/login/page.tsx +0 -14
  32. package/app/(auth)/register/page.tsx +0 -193
  33. package/app/(auth)/reset-password/page.tsx +0 -138
  34. package/app/api/account/claim/route.tsx +0 -135
  35. package/app/api/admin/backfill-encryption/route.tsx +0 -43
  36. package/app/api/admin/license/route.tsx +0 -42
  37. package/app/api/auth/2fa/route.tsx +0 -148
  38. package/app/api/auth/[...nextauth]/route.tsx +0 -3
  39. package/app/api/auth/change-password/route.tsx +0 -61
  40. package/app/api/auth/check-2fa/route.tsx +0 -19
  41. package/app/api/auth/forgot-password/route.tsx +0 -65
  42. package/app/api/auth/reset-password/route.tsx +0 -52
  43. package/app/api/auth/verify-2fa/route.tsx +0 -88
  44. package/app/api/backup/download/db/route.ts +0 -29
  45. package/app/api/backup/download/notes/route.ts +0 -25
  46. package/app/api/backup/settings/route.ts +0 -92
  47. package/app/api/billing/checkout/route.tsx +0 -81
  48. package/app/api/billing/migrate/route.tsx +0 -163
  49. package/app/api/billing/portal/route.tsx +0 -24
  50. package/app/api/billing/setup-intent/route.tsx +0 -55
  51. package/app/api/billing/status/route.tsx +0 -36
  52. package/app/api/billing/subscribe/route.tsx +0 -85
  53. package/app/api/billing/webhook/route.tsx +0 -199
  54. package/app/api/calendar-feeds/[feedId]/route.tsx +0 -67
  55. package/app/api/calendar-feeds/[feedId]/sync/route.tsx +0 -37
  56. package/app/api/calendar-feeds/events/route.tsx +0 -82
  57. package/app/api/calendar-feeds/route.tsx +0 -52
  58. package/app/api/calendar-feeds/sync-all/route.tsx +0 -34
  59. package/app/api/cron/calendar-feeds/route.tsx +0 -31
  60. package/app/api/cron/stale-tasks/route.tsx +0 -51
  61. package/app/api/cron/sync/route.tsx +0 -34
  62. package/app/api/devices/[deviceId]/route.tsx +0 -25
  63. package/app/api/devices/route.tsx +0 -41
  64. package/app/api/export/route.tsx +0 -40
  65. package/app/api/feedback/route.tsx +0 -54
  66. package/app/api/folders/[folderId]/route.tsx +0 -51
  67. package/app/api/folders/route.tsx +0 -37
  68. package/app/api/graph/route.tsx +0 -242
  69. package/app/api/guest/route.tsx +0 -58
  70. package/app/api/health/route.tsx +0 -10
  71. package/app/api/holidays/countries/route.tsx +0 -14
  72. package/app/api/holidays/route.tsx +0 -49
  73. package/app/api/holidays/states/route.tsx +0 -21
  74. package/app/api/invites/[token]/route.tsx +0 -131
  75. package/app/api/invites/route.tsx +0 -74
  76. package/app/api/mcp/generate-token/route.tsx +0 -55
  77. package/app/api/mcp/revoke-token/[tokenId]/route.tsx +0 -30
  78. package/app/api/mcp/update-alias/[tokenId]/route.tsx +0 -22
  79. package/app/api/notes/[noteId]/export/route.tsx +0 -45
  80. package/app/api/notes/[noteId]/route.tsx +0 -360
  81. package/app/api/notes/route.tsx +0 -112
  82. package/app/api/notifications/route.tsx +0 -44
  83. package/app/api/register/route.tsx +0 -67
  84. package/app/api/restore/route.tsx +0 -148
  85. package/app/api/sync/conflicts/[conflictId]/route.tsx +0 -134
  86. package/app/api/sync/conflicts/route.tsx +0 -48
  87. package/app/api/sync/status/route.tsx +0 -49
  88. package/app/api/sync/trigger/route.tsx +0 -15
  89. package/app/api/tasks/[taskId]/detail/route.tsx +0 -68
  90. package/app/api/tasks/[taskId]/route.tsx +0 -259
  91. package/app/api/tasks/bulk/route.tsx +0 -133
  92. package/app/api/tasks/route.tsx +0 -36
  93. package/app/api/workspace/active/route.tsx +0 -39
  94. package/app/api/workspace/create-team/route.tsx +0 -42
  95. package/app/api/workspace/kanban-statuses/route.tsx +0 -71
  96. package/app/api/workspace/members/[memberId]/route.tsx +0 -69
  97. package/app/api/workspace/route.tsx +0 -24
  98. package/app/download/page.tsx +0 -170
  99. package/app/favicon.ico +0 -0
  100. package/app/generated/prisma/client.d.ts +0 -1
  101. package/app/generated/prisma/client.js +0 -5
  102. package/app/generated/prisma/default.d.ts +0 -1
  103. package/app/generated/prisma/default.js +0 -5
  104. package/app/generated/prisma/edge.d.ts +0 -1
  105. package/app/generated/prisma/edge.js +0 -497
  106. package/app/generated/prisma/index-browser.js +0 -523
  107. package/app/generated/prisma/index.d.ts +0 -46376
  108. package/app/generated/prisma/index.js +0 -497
  109. package/app/generated/prisma/package.json +0 -144
  110. package/app/generated/prisma/query_compiler_fast_bg.js +0 -2
  111. package/app/generated/prisma/query_compiler_fast_bg.wasm +0 -0
  112. package/app/generated/prisma/query_compiler_fast_bg.wasm-base64.js +0 -2
  113. package/app/generated/prisma/runtime/client.d.ts +0 -3386
  114. package/app/generated/prisma/runtime/client.js +0 -86
  115. package/app/generated/prisma/runtime/index-browser.d.ts +0 -90
  116. package/app/generated/prisma/runtime/index-browser.js +0 -6
  117. package/app/generated/prisma/runtime/wasm-compiler-edge.js +0 -76
  118. package/app/generated/prisma/schema.prisma +0 -456
  119. package/app/generated/prisma/wasm-edge-light-loader.mjs +0 -5
  120. package/app/generated/prisma/wasm-worker-loader.mjs +0 -5
  121. package/app/globals.css +0 -54
  122. package/app/invite/[token]/page.tsx +0 -52
  123. package/app/layout.tsx +0 -90
  124. package/app/mcp/route.tsx +0 -430
  125. package/app/opengraph-image.tsx +0 -120
  126. package/app/page.tsx +0 -398
  127. package/app/privacy/page.tsx +0 -69
  128. package/app/robots.tsx +0 -25
  129. package/app/sitemap.tsx +0 -36
  130. package/app/terms/page.tsx +0 -69
  131. package/app/upgrade/page.tsx +0 -75
  132. package/auth.config.ts +0 -33
  133. package/auth.ts +0 -79
  134. package/components/auth/login-form.tsx +0 -302
  135. package/components/auth/password-checklist.tsx +0 -31
  136. package/components/auth/password-input.tsx +0 -36
  137. package/components/auth/switch-account-button.test.tsx +0 -22
  138. package/components/auth/switch-account-button.tsx +0 -19
  139. package/components/auth/two-factor-input.tsx +0 -116
  140. package/components/billing/billing-dashboard.tsx +0 -265
  141. package/components/billing/card-form.tsx +0 -210
  142. package/components/billing/claim-account-form.tsx +0 -99
  143. package/components/branding/app-logo.test.tsx +0 -20
  144. package/components/branding/app-logo.tsx +0 -25
  145. package/components/calendar/calendar-agenda.tsx +0 -150
  146. package/components/calendar/calendar-drag.test.tsx +0 -177
  147. package/components/calendar/calendar-grid.tsx +0 -357
  148. package/components/calendar/calendar-hooks.test.tsx +0 -27
  149. package/components/calendar/calendar-hooks.ts +0 -351
  150. package/components/calendar/calendar-toolbar.test.tsx +0 -68
  151. package/components/calendar/calendar-toolbar.tsx +0 -291
  152. package/components/calendar/calendar-types.ts +0 -148
  153. package/components/calendar/calendar-view.test.tsx +0 -295
  154. package/components/calendar/calendar-view.tsx +0 -307
  155. package/components/calendar/day-detail-popover.tsx +0 -174
  156. package/components/calendar/task-chip.tsx +0 -86
  157. package/components/command/command-palette.test.tsx +0 -33
  158. package/components/command/command-palette.tsx +0 -310
  159. package/components/download-cta.tsx +0 -87
  160. package/components/feedback/feedback-popup.tsx +0 -207
  161. package/components/graph/graph-draw.ts +0 -337
  162. package/components/graph/graph-overlays.tsx +0 -160
  163. package/components/graph/graph-page.test.tsx +0 -131
  164. package/components/graph/graph-page.tsx +0 -263
  165. package/components/graph/graph-types.ts +0 -47
  166. package/components/graph/graph-view.tsx +0 -322
  167. package/components/guide/guide-view.tsx +0 -522
  168. package/components/kanban/kanban-board.test.tsx +0 -128
  169. package/components/kanban/kanban-board.tsx +0 -361
  170. package/components/kanban/kanban-card-menu.tsx +0 -102
  171. package/components/kanban/kanban-card.tsx +0 -227
  172. package/components/kanban/kanban-column.tsx +0 -49
  173. package/components/kanban/kanban-status-context.tsx +0 -28
  174. package/components/landing/calendar-sandbox.test.tsx +0 -15
  175. package/components/landing/calendar-sandbox.tsx +0 -107
  176. package/components/landing/graph-sandbox.test.tsx +0 -27
  177. package/components/landing/graph-sandbox.tsx +0 -80
  178. package/components/landing/kanban-sandbox.test.tsx +0 -24
  179. package/components/landing/kanban-sandbox.tsx +0 -101
  180. package/components/landing/landing-showcase.test.tsx +0 -21
  181. package/components/landing/landing-showcase.tsx +0 -54
  182. package/components/landing/list-sandbox.tsx +0 -86
  183. package/components/landing/mock-workspace.ts +0 -168
  184. package/components/landing/notes-sandbox.test.tsx +0 -14
  185. package/components/landing/notes-sandbox.tsx +0 -88
  186. package/components/layout/app-shell.tsx +0 -83
  187. package/components/layout/backup-scheduler.tsx +0 -122
  188. package/components/layout/bottom-nav.tsx +0 -43
  189. package/components/layout/icon-bar.test.tsx +0 -29
  190. package/components/layout/icon-bar.tsx +0 -118
  191. package/components/layout/mobile-top-bar.tsx +0 -68
  192. package/components/layout/notes-panel-folder.tsx +0 -127
  193. package/components/layout/notes-panel-note-item.tsx +0 -140
  194. package/components/layout/notes-panel-task-tab.tsx +0 -63
  195. package/components/layout/notes-panel-types.ts +0 -44
  196. package/components/layout/notes-panel.tsx +0 -476
  197. package/components/layout/notification-bell.tsx +0 -251
  198. package/components/layout/paywall-screen.tsx +0 -41
  199. package/components/layout/pro-banner.tsx +0 -76
  200. package/components/layout/sw-register.tsx +0 -27
  201. package/components/layout/workspace-switcher.tsx +0 -90
  202. package/components/notes/mobile-bottom-sheet.tsx +0 -99
  203. package/components/notes/note-editor-context-menu.tsx +0 -47
  204. package/components/notes/note-editor-dom.ts +0 -33
  205. package/components/notes/note-editor-dropdowns.tsx +0 -484
  206. package/components/notes/note-editor-hooks.ts +0 -692
  207. package/components/notes/note-editor-keyboard.ts +0 -305
  208. package/components/notes/note-editor-overlay.tsx +0 -90
  209. package/components/notes/note-editor.test.tsx +0 -372
  210. package/components/notes/note-editor.tsx +0 -662
  211. package/components/notes/note-preview-pane.tsx +0 -156
  212. package/components/notes/note-tabs.tsx +0 -120
  213. package/components/notes/note-types.tsx +0 -157
  214. package/components/settings/accept-invite.tsx +0 -108
  215. package/components/settings/agent-token-settings.tsx +0 -369
  216. package/components/settings/backup-restore-settings.test.tsx +0 -25
  217. package/components/settings/backup-restore-settings.tsx +0 -327
  218. package/components/settings/calendar-feeds-settings.tsx +0 -489
  219. package/components/settings/calendar-general-settings.tsx +0 -174
  220. package/components/settings/confirm-danger-action.test.tsx +0 -215
  221. package/components/settings/confirm-danger-action.tsx +0 -65
  222. package/components/settings/security-settings.tsx +0 -252
  223. package/components/settings/settings-guidance.test.tsx +0 -98
  224. package/components/settings/team-settings.tsx +0 -319
  225. package/components/settings/two-factor-auth.tsx +0 -296
  226. package/components/settings/workspace-settings-client.tsx +0 -363
  227. package/components/settings/workspace-settings-form.tsx +0 -73
  228. package/components/sync/conflict-viewer.tsx +0 -247
  229. package/components/sync/sync-indicator.tsx +0 -171
  230. package/components/tasks/snippet-thread.tsx +0 -119
  231. package/components/tasks/status-dot.tsx +0 -47
  232. package/components/tasks/task-badge.tsx +0 -43
  233. package/components/tasks/task-detail.test.tsx +0 -187
  234. package/components/tasks/task-detail.tsx +0 -458
  235. package/components/tasks/task-list-filters.test.tsx +0 -75
  236. package/components/tasks/task-list-filters.tsx +0 -163
  237. package/components/tasks/task-list-types.ts +0 -20
  238. package/components/tasks/task-list.test.tsx +0 -175
  239. package/components/tasks/task-list.tsx +0 -481
  240. package/components/tasks/task-row.tsx +0 -85
  241. package/components/tasks/task-table-row.tsx +0 -259
  242. package/components/ui/skeleton.tsx +0 -3
  243. package/components/ui/toast.test.tsx +0 -42
  244. package/components/ui/toast.tsx +0 -70
  245. package/electron/main.ts +0 -251
  246. package/electron/preload.ts +0 -56
  247. package/instrumentation.tsx +0 -23
  248. package/lib/api-error.ts +0 -50
  249. package/lib/backup/backup-runner.test.ts +0 -32
  250. package/lib/backup/backup-runner.ts +0 -19
  251. package/lib/backup/backup-schedule.test.ts +0 -23
  252. package/lib/backup/backup-schedule.ts +0 -55
  253. package/lib/backup/backup-settings.test.ts +0 -30
  254. package/lib/backup/backup-settings.ts +0 -27
  255. package/lib/backup/export-notes-zip.test.ts +0 -26
  256. package/lib/backup/export-notes-zip.ts +0 -82
  257. package/lib/backup/export-workspace-backup.test.ts +0 -17
  258. package/lib/backup/export-workspace-backup.ts +0 -77
  259. package/lib/backup/restore-workspace-from-export.test.ts +0 -18
  260. package/lib/backup/restore-workspace-from-export.ts +0 -183
  261. package/lib/backup/types.ts +0 -14
  262. package/lib/brand-icons.ts +0 -1
  263. package/lib/calendar-feed-crypto.ts +0 -38
  264. package/lib/calendar-feed.ts +0 -239
  265. package/lib/client/online-status.ts +0 -47
  266. package/lib/conflict-resolver.test.ts +0 -57
  267. package/lib/conflict-resolver.ts +0 -240
  268. package/lib/db-init.ts +0 -79
  269. package/lib/email.ts +0 -159
  270. package/lib/encryption.test.ts +0 -41
  271. package/lib/encryption.ts +0 -98
  272. package/lib/extract-snippet.test.ts +0 -123
  273. package/lib/extract-snippet.ts +0 -69
  274. package/lib/kanban-status.ts +0 -55
  275. package/lib/license.ts +0 -21
  276. package/lib/limits.ts +0 -31
  277. package/lib/mcp-auth.test.ts +0 -58
  278. package/lib/mcp-auth.ts +0 -65
  279. package/lib/mcp-contract.test.ts +0 -25
  280. package/lib/mcp-contract.ts +0 -210
  281. package/lib/mcp-handler.ts +0 -31
  282. package/lib/mcp-url.test.ts +0 -12
  283. package/lib/mcp-url.ts +0 -7
  284. package/lib/mentions.test.ts +0 -45
  285. package/lib/mentions.ts +0 -73
  286. package/lib/note-crypto.ts +0 -108
  287. package/lib/note-sync.ts +0 -201
  288. package/lib/note-title.ts +0 -93
  289. package/lib/prisma.ts +0 -193
  290. package/lib/pro-flush.ts +0 -292
  291. package/lib/rate-limit.ts +0 -57
  292. package/lib/stripe.ts +0 -38
  293. package/lib/sync-worker.ts +0 -388
  294. package/lib/task-parser.test.ts +0 -91
  295. package/lib/task-parser.ts +0 -81
  296. package/lib/task-utils.ts +0 -52
  297. package/lib/use-is-electron.ts +0 -19
  298. package/lib/use-is-mobile.ts +0 -22
  299. package/lib/validation/calendar-feed.ts +0 -31
  300. package/lib/validation/note.ts +0 -27
  301. package/lib/validation/task.ts +0 -26
  302. package/lib/view-preferences.test.ts +0 -54
  303. package/lib/view-preferences.ts +0 -28
  304. package/lib/workspace.ts +0 -66
  305. package/next.config.ts +0 -21
  306. package/postcss.config.mjs +0 -7
  307. package/prisma/migrations/20260519021916_init/migration.sql +0 -388
  308. package/prisma/migrations/20260519061113_drop_sync_password/migration.sql +0 -8
  309. package/prisma/migrations/20260520065016_add_task_start_date/migration.sql +0 -2
  310. package/prisma/migrations/20260529010600_remove_encryption_fields/migration.sql +0 -12
  311. package/prisma/migrations/20260529020000_restore_encryption_salt/migration.sql +0 -3
  312. package/prisma/migrations/20260529030000_add_folders/migration.sql +0 -17
  313. package/prisma/migrations/20260605000000_deferred_fixes/migration.sql +0 -31
  314. package/prisma/migrations/20260605020806_add_pending_sync_to_note_and_task/migration.sql +0 -5
  315. package/prisma/migrations/20260605063634_add_stripe_webhook_event_sync_lock/migration.sql +0 -14
  316. package/prisma/migrations/20260605100000_add_prod_indexes/migration.sql +0 -26
  317. package/prisma/migrations/20260608081404_add_kanban_statuses/migration.sql +0 -23
  318. package/prisma/migrations/20260611032723_add_calendar_feeds/migration.sql +0 -43
  319. package/prisma/migrations/20260611040000_add_calendar_feed_color/migration.sql +0 -2
  320. package/prisma/migrations/20260611050000_add_task_priority/migration.sql +0 -14
  321. package/prisma/migrations/20260612060000_add_critical_priority/migration.sql +0 -2
  322. package/prisma/migrations/20260613090000_add_backup_settings/migration.sql +0 -25
  323. package/prisma/migrations/20260614160000_add_feedback/migration.sql +0 -20
  324. package/prisma/migrations/20260614210000_add_2fa/migration.sql +0 -4
  325. package/prisma/migrations/migration_lock.toml +0 -3
  326. package/prisma/schema.prisma +0 -457
  327. package/public/Logo_icon.svg +0 -1
  328. package/public/file.svg +0 -1
  329. package/public/globe.svg +0 -1
  330. package/public/icon-192.png +0 -0
  331. package/public/icon-512.png +0 -0
  332. package/public/icon.svg +0 -4
  333. package/public/icon_dark.svg +0 -1
  334. package/public/knotpad_icon.svg +0 -1
  335. package/public/knotpad_logo_full.svg +0 -1
  336. package/public/manifest.json +0 -14
  337. package/public/next.svg +0 -1
  338. package/public/sw.js +0 -137
  339. package/public/vercel.svg +0 -1
  340. package/public/window.svg +0 -1
  341. package/tsconfig.json +0 -35
package/app/page.tsx DELETED
@@ -1,398 +0,0 @@
1
- import { auth } from "@/auth";
2
- import { redirect } from "next/navigation";
3
- import Link from "next/link";
4
- import { AppLogo } from "@/components/branding/app-logo";
5
- import DownloadCTA from "@/components/download-cta";
6
- import { LandingShowcase } from "@/components/landing/landing-showcase";
7
-
8
- export default async function RootPage() {
9
- const session = await auth();
10
- if (session) redirect("/notes");
11
-
12
- // Local mode (NPX / Electron): skip the marketing landing — go straight
13
- // to the login page which offers "Start writing" (guest, no account needed).
14
- if (process.env.IS_CLOUD !== "true") redirect("/login");
15
-
16
- return <LandingPage />;
17
- }
18
-
19
- function LandingPage() {
20
- const jsonLd = {
21
- "@context": "https://schema.org",
22
- "@type": "SoftwareApplication",
23
- name: "Knotpad",
24
- description:
25
- "Note-first project management with AI agent task routing. Write the note — the tasks come with it.",
26
- url: "https://knotpad.app",
27
- applicationCategory: "ProductivityApplication",
28
- operatingSystem: "Windows, macOS, Linux, Web",
29
- offers: [
30
- {
31
- "@type": "Offer",
32
- name: "Personal Free",
33
- price: "0",
34
- priceCurrency: "USD",
35
- description: "Notes, tasks, Kanban, calendar, graph — fully offline",
36
- },
37
- {
38
- "@type": "Offer",
39
- name: "Personal Pro",
40
- price: "5",
41
- priceCurrency: "USD",
42
- billingPeriod: "month",
43
- description: "Cloud sync across devices with AES-256 encryption",
44
- },
45
- {
46
- "@type": "Offer",
47
- name: "Team Pro",
48
- price: "5",
49
- priceCurrency: "USD",
50
- billingPeriod: "month per seat",
51
- description: "Shared team workspace with cloud-only notes",
52
- },
53
- ],
54
- publisher: {
55
- "@type": "Organization",
56
- name: "Nexstrive Services",
57
- url: "https://knotpad.app",
58
- },
59
- };
60
-
61
- return (
62
- <div className="min-h-screen bg-zinc-950 text-zinc-100">
63
- <script
64
- type="application/ld+json"
65
- dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
66
- />
67
-
68
- {/* Nav */}
69
- <header className="flex items-center justify-between px-8 py-5 border-b border-zinc-900">
70
- <div className="flex items-center gap-2">
71
- <AppLogo className="h-7 w-auto" />
72
- <span className="rounded-full bg-zinc-800 px-2 py-0.5 text-[10px] text-zinc-400 font-medium lowercase tracking-wider">beta</span>
73
- </div>
74
- <div className="flex items-center gap-4">
75
- <Link href="/login" className="text-sm text-zinc-500 hover:text-zinc-300 transition-colors">
76
- sign in
77
- </Link>
78
- <Link
79
- href="/register"
80
- className="rounded-md bg-zinc-100 px-4 py-1.5 text-sm font-medium text-zinc-900 hover:bg-white transition-colors"
81
- >
82
- get started free →
83
- </Link>
84
- </div>
85
- </header>
86
-
87
- <main className="mx-auto max-w-4xl px-8 pt-24 pb-32 space-y-24">
88
-
89
- {/* Hero */}
90
- <section>
91
- <div className="mb-6 inline-flex items-center gap-2 rounded-full border border-zinc-800 bg-zinc-900 px-3 py-1">
92
- <span className="h-1.5 w-1.5 rounded-full bg-emerald-400" />
93
- <span className="text-xs text-zinc-400">local-first · no account to start</span>
94
- </div>
95
-
96
- <h1 className="mb-6 text-5xl font-semibold leading-tight tracking-tight text-zinc-100 sm:text-6xl">
97
- Write the note.<br />
98
- <span className="text-zinc-500">The tasks come with it.</span>
99
- </h1>
100
-
101
- <p className="mb-10 max-w-xl text-lg text-zinc-400 leading-relaxed">
102
- Start in a note. Turn checkboxes into real tasks. Assign teammates or AI agents inline,
103
- then manage the same work in Kanban, Calendar, and Graph without rewriting anything.
104
- </p>
105
-
106
- <DownloadCTA />
107
-
108
- <p className="mt-4 text-xs text-zinc-700">
109
- Free forever on your machine · $5/mo to sync · $5/seat for teams
110
- </p>
111
- </section>
112
-
113
- {/* Product showcase */}
114
- <section className="space-y-5">
115
- <div>
116
- <h2 className="text-base font-semibold text-zinc-200">One note, four views</h2>
117
- <p className="mt-1 max-w-2xl text-sm text-zinc-500">
118
- Write once in the note, then explore the same work in Kanban, List, Calendar, and Graph.
119
- </p>
120
- </div>
121
- <LandingShowcase />
122
- </section>
123
-
124
- {/* Four pillars */}
125
- <section className="grid gap-8 sm:grid-cols-2 lg:grid-cols-4">
126
- {[
127
- {
128
- title: "Notes become tasks",
129
- body: "Write the plan once. Knotpad turns checkbox lines into tracked work without sending you through a separate task form.",
130
- },
131
- {
132
- title: "Your team and AI agents share the same source",
133
- body: "Assign teammates or @agent in the note itself, then keep everyone aligned in one workflow instead of splitting work across tools.",
134
- },
135
- {
136
- title: "One note, multiple views",
137
- body: "Switch between Notes, Kanban, Calendar, and Graph without recreating the work or losing the context behind it.",
138
- },
139
- {
140
- title: "Local-first by default",
141
- body: "Start on your own machine, then add cloud sync only when you need it across devices or across a team.",
142
- },
143
- ].map((p) => (
144
- <div key={p.title} className="space-y-2">
145
- <h3 className="text-sm font-semibold text-zinc-200">{p.title}</h3>
146
- <p className="text-sm text-zinc-500 leading-relaxed">{p.body}</p>
147
- </div>
148
- ))}
149
- </section>
150
-
151
- {/* MCP Integration */}
152
- <section className="space-y-5">
153
- <div>
154
- <h2 className="text-base font-semibold text-zinc-200">AI agents work alongside your team</h2>
155
- <p className="mt-1 max-w-2xl text-sm text-zinc-500">
156
- Knotpad exposes a full MCP (Model Context Protocol) server. Connect Claude Code, Windsurf, Cursor, or any MCP-compatible tool so your AI assistant can read your workspace, claim tasks, and write notes back — all without leaving your terminal.
157
- </p>
158
- </div>
159
-
160
- <div className="rounded-xl border border-zinc-800 bg-zinc-900/30 overflow-hidden">
161
- <div className="grid md:grid-cols-2 divide-y md:divide-y-0 md:divide-x divide-zinc-800">
162
- <div className="p-6 space-y-4">
163
- <div className="flex items-center gap-3">
164
- <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-zinc-800 border border-zinc-700">
165
- <span className="text-lg font-bold text-zinc-200">M</span>
166
- </div>
167
- <div>
168
- <h3 className="text-sm font-semibold text-zinc-100">Model Context Protocol</h3>
169
- <p className="text-xs text-zinc-500">Standard for AI tool integration</p>
170
- </div>
171
- </div>
172
-
173
- <div className="space-y-3">
174
- <div className="rounded-lg border border-zinc-800 bg-zinc-950 p-3">
175
- <p className="text-[11px] uppercase tracking-wider text-zinc-600 mb-2">How it works</p>
176
- <ul className="space-y-1.5 text-xs text-zinc-400">
177
- <li>Connect your AI tool with a single MCP token</li>
178
- <li>Your agent reads tasks, notes, and context automatically</li>
179
- <li>Claim work, update status, and append follow-up notes</li>
180
- <li>Changes sync bidirectionally — the note stays the source of truth</li>
181
- </ul>
182
- </div>
183
-
184
- <div className="rounded-lg border border-zinc-800 bg-zinc-950 p-3">
185
- <p className="text-[11px] uppercase tracking-wider text-zinc-600 mb-2">Supported tools</p>
186
- <div className="flex flex-wrap gap-2">
187
- {["Claude Code", "Windsurf", "Cursor", "Trae", "Copilot"].map((tool) => (
188
- <span key={tool} className="rounded-full border border-zinc-700 bg-zinc-900 px-2 py-1 text-[10px] text-zinc-400">
189
- {tool}
190
- </span>
191
- ))}
192
- </div>
193
- </div>
194
- </div>
195
- </div>
196
-
197
- <div className="p-6 space-y-4">
198
- <p className="text-[11px] uppercase tracking-wider text-zinc-600">What your agent can do</p>
199
- <div className="space-y-2 text-xs">
200
- <div className="rounded-lg border border-zinc-800 bg-zinc-950 p-3">
201
- <p className="text-zinc-200 font-medium">Pull tasks & plan with notes</p>
202
- <p className="text-zinc-500 mt-1">Discover open work, read full note context, and understand linked files before starting.</p>
203
- </div>
204
- <div className="rounded-lg border border-zinc-800 bg-zinc-950 p-3">
205
- <p className="text-zinc-200 font-medium">Claim & update status</p>
206
- <p className="text-zinc-500 mt-1">Reserve tasks to avoid conflicts, then mark in_progress, review, or done as work progresses.</p>
207
- </div>
208
- <div className="rounded-lg border border-zinc-800 bg-zinc-950 p-3">
209
- <p className="text-zinc-200 font-medium">Write & link notes</p>
210
- <p className="text-zinc-500 mt-1">Create new notes, append follow-up tasks, cross-reference other notes, and auto-parse checkboxes into real tasks.</p>
211
- </div>
212
- <div className="rounded-lg border border-zinc-800 bg-zinc-950 p-3">
213
- <p className="text-zinc-200 font-medium">Stay in sync</p>
214
- <p className="text-zinc-500 mt-1">Send heartbeats while working long tasks. Released work goes back to the queue with a reason.</p>
215
- </div>
216
- </div>
217
- </div>
218
- </div>
219
- </div>
220
- </section>
221
-
222
- {/* Workspace model */}
223
- <section className="space-y-5">
224
- <div>
225
- <h2 className="text-base font-semibold text-zinc-200">Personal or team. Your call.</h2>
226
- <p className="text-sm text-zinc-500 mt-1">
227
- Start alone. Add people when you're ready. Or never — the free version has every view and the full note→task workflow.
228
- Switch between your personal and team workspaces in one click — your data follows you.
229
- </p>
230
- </div>
231
- <div className="rounded-xl border border-zinc-800 bg-zinc-900/30 divide-y divide-zinc-800">
232
- {[
233
- {
234
- label: "Personal Workspace",
235
- sub: "Free on your machine · $5/mo if you want cloud sync",
236
- detail: "Everything stays between you and your devices. Upgrade to sync across machines — your notes are AES-256 encrypted at rest and never stored in plaintext on our servers.",
237
- },
238
- {
239
- label: "Team Workspace",
240
- sub: "$5/seat/mo · owner pays, members join free",
241
- detail: "One person holds the billing. Everyone else just accepts an invite. No awkward “ask your teammate to subscribe” moments.",
242
- },
243
- {
244
- label: "Cloud-only Notes",
245
- sub: "Some things shouldn't leave the server.",
246
- detail: "Toggle any note to cloud-only. It streams to your team while they're in — but never downloads to their machine. When someone leaves the workspace, they lose access immediately. No local copy to walk away with.",
247
- },
248
- ].map((w) => (
249
- <div key={w.label} className="p-5 space-y-1">
250
- <p className="text-sm font-medium text-zinc-200">{w.label}</p>
251
- <p className="text-xs text-zinc-500">{w.sub}</p>
252
- <p className="text-sm text-zinc-500 leading-relaxed pt-1">{w.detail}</p>
253
- </div>
254
- ))}
255
- </div>
256
- </section>
257
-
258
- {/* Pricing */}
259
- <section className="space-y-5">
260
- <div>
261
- <h2 className="text-base font-semibold text-zinc-200">Simple pricing.</h2>
262
- <p className="text-sm text-zinc-500 mt-1">Free until you need more.</p>
263
- </div>
264
- <div className="rounded-xl border border-zinc-800 overflow-hidden">
265
- <div className="grid sm:grid-cols-3 divide-y sm:divide-y-0 sm:divide-x divide-zinc-800">
266
-
267
- {/* Personal Free */}
268
- <div className="p-8 flex flex-col h-full">
269
- <div className="space-y-5">
270
- <div>
271
- <p className="text-xs font-medium uppercase tracking-wider text-zinc-500 mb-1">Personal · Free</p>
272
- <p className="text-3xl font-semibold text-zinc-100">$0</p>
273
- <p className="text-xs text-zinc-600 mt-0.5">no card · no account</p>
274
- </div>
275
- <ul className="space-y-2 text-sm text-zinc-400">
276
- {[
277
- "Notes → tasks, automatically",
278
- "Kanban, list, calendar, graph",
279
- "@agent with any MCP tool",
280
- "Fully offline after setup",
281
- "Your machine, your data",
282
- ].map((f) => (
283
- <li key={f} className="flex items-start gap-2">
284
- <span className="text-emerald-500 mt-0.5">✓</span> {f}
285
- </li>
286
- ))}
287
- </ul>
288
- </div>
289
- <div className="mt-auto pt-5 space-y-2">
290
- <Link
291
- href="/download"
292
- className="inline-flex items-center justify-center w-full rounded-md border border-zinc-800 bg-zinc-900 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-800 transition-colors"
293
- >
294
- Download desktop app →
295
- </Link>
296
- <div className="rounded-md border border-zinc-800 bg-zinc-900 px-3 py-2 flex justify-center">
297
- <code className="text-xs font-mono text-zinc-300">npx @knotpad/app</code>
298
- </div>
299
- </div>
300
- </div>
301
-
302
- {/* Personal Pro */}
303
- <div className="p-8 flex flex-col h-full bg-zinc-900/40">
304
- <div className="space-y-5">
305
- <div>
306
- <p className="text-xs font-medium uppercase tracking-wider text-zinc-500 mb-1">Personal Pro</p>
307
- <p className="text-3xl font-semibold text-zinc-100">$5 <span className="text-lg font-normal text-zinc-500">/ mo</span></p>
308
- <p className="text-xs text-zinc-600 mt-0.5">cancel anytime</p>
309
- </div>
310
- <ul className="space-y-2 text-sm text-zinc-400">
311
- {[
312
- "Everything in Free",
313
- "Sync across your devices",
314
- "AES-256 encrypted at rest",
315
- "Cloud MCP for AI agents",
316
- ].map((f) => (
317
- <li key={f} className="flex items-start gap-2">
318
- <span className="text-blue-400 mt-0.5">✓</span> {f}
319
- </li>
320
- ))}
321
- </ul>
322
- </div>
323
- <div className="mt-auto pt-5">
324
- <Link
325
- href="/register"
326
- className="inline-flex items-center justify-center w-full rounded-md bg-zinc-100 px-3 py-1.5 text-xs font-semibold text-zinc-900 hover:bg-white transition-colors"
327
- >
328
- Get started →
329
- </Link>
330
- </div>
331
- </div>
332
-
333
- {/* Team Pro */}
334
- <div className="p-8 flex flex-col h-full bg-zinc-900/60">
335
- <div className="space-y-5">
336
- <div>
337
- <p className="text-xs font-medium uppercase tracking-wider text-zinc-500 mb-1">Team Pro</p>
338
- <p className="text-3xl font-semibold text-zinc-100">$5 <span className="text-lg font-normal text-zinc-500">/ seat / mo</span></p>
339
- <p className="text-xs text-zinc-600 mt-0.5">owner pays for the team</p>
340
- </div>
341
- <ul className="space-y-2 text-sm text-zinc-400">
342
- {[
343
- "Everything in Personal Pro",
344
- "Shared team workspace",
345
- "Owner's personal workspace included",
346
- "Teammates join free — owner covers their seat",
347
- "MCP token per person",
348
- "Cloud-only notes (access revoked on leave)",
349
- "Add or remove seats anytime",
350
- ].map((f) => (
351
- <li key={f} className="flex items-start gap-2">
352
- <span className="text-violet-400 mt-0.5">✓</span> {f}
353
- </li>
354
- ))}
355
- </ul>
356
- </div>
357
- <div className="mt-auto pt-5">
358
- <Link
359
- href="/register"
360
- className="inline-flex items-center justify-center w-full rounded-md bg-zinc-100 px-3 py-1.5 text-xs font-semibold text-zinc-900 hover:bg-white transition-colors"
361
- >
362
- Start with your team →
363
- </Link>
364
- </div>
365
- </div>
366
-
367
- </div>
368
- </div>
369
- <p className="text-xs text-zinc-600 text-center">
370
- Every plan has the full feature set. Cloud plans add sync, backup, and collaboration.
371
- Stripe handles payments — we never store your card.
372
- </p>
373
- </section>
374
-
375
- {/* Footer */}
376
- <footer className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between text-xs text-zinc-700 border-t border-zinc-900 pt-8">
377
- <div className="flex flex-col gap-2">
378
- <div className="flex items-center gap-3">
379
- <AppLogo className="h-5 w-auto" />
380
- <span>Knotpad · a product of Nexstrive Services</span>
381
- </div>
382
- <p className="text-[11px] text-zinc-800">
383
- Registration: 202303272747 (TR0292898-P) · Kuala Lumpur, Malaysia
384
- </p>
385
- </div>
386
- <div className="flex items-center gap-4 flex-wrap">
387
- <Link href="/login" className="hover:text-zinc-500 transition-colors">sign in</Link>
388
- <Link href="/terms" className="hover:text-zinc-500 transition-colors">terms</Link>
389
- <Link href="/privacy" className="hover:text-zinc-500 transition-colors">privacy</Link>
390
- <span className="text-zinc-800">or just run it:</span>
391
- <code className="font-mono hover:text-zinc-500 transition-colors">npx @knotpad/app</code>
392
- </div>
393
- </footer>
394
-
395
- </main>
396
- </div>
397
- );
398
- }
@@ -1,69 +0,0 @@
1
- import type { Metadata } from "next";
2
- import Link from "next/link";
3
- import { AppLogo } from "@/components/branding/app-logo";
4
-
5
- export const metadata: Metadata = {
6
- title: "Privacy Policy",
7
- description:
8
- "Privacy Policy for Knotpad — how we handle account, workspace, billing, and usage data.",
9
- };
10
-
11
- export default function PrivacyPage() {
12
- return (
13
- <main className="min-h-screen bg-zinc-950 px-6 py-12 text-zinc-100">
14
- <div className="mx-auto max-w-3xl space-y-10">
15
- <div className="space-y-4">
16
- <Link href="/" className="inline-flex">
17
- <AppLogo className="h-8 w-auto" />
18
- </Link>
19
- <div className="space-y-2">
20
- <h1 className="text-3xl font-semibold tracking-tight">Privacy Policy</h1>
21
- <p className="text-sm text-zinc-400">
22
- This policy explains how Knotpad handles account, workspace, billing, and usage data.
23
- </p>
24
- </div>
25
- </div>
26
-
27
- <section className="space-y-3">
28
- <h2 className="text-lg font-medium text-zinc-200">Information we collect</h2>
29
- <p className="text-sm leading-7 text-zinc-400">
30
- Knotpad may process account details, workspace membership data, billing records, and the content
31
- you choose to store or sync through the service.
32
- </p>
33
- </section>
34
-
35
- <section className="space-y-3">
36
- <h2 className="text-lg font-medium text-zinc-200">How we use information</h2>
37
- <p className="text-sm leading-7 text-zinc-400">
38
- We use this information to operate the product, authenticate access, support billing, improve
39
- reliability, and provide customer support.
40
- </p>
41
- </section>
42
-
43
- <section className="space-y-3">
44
- <h2 className="text-lg font-medium text-zinc-200">Storage and security</h2>
45
- <p className="text-sm leading-7 text-zinc-400">
46
- Knotpad supports local-first workflows and cloud features. When cloud storage is used, we apply
47
- the security controls described in the product, including encrypted-at-rest storage where offered.
48
- </p>
49
- </section>
50
-
51
- <section className="space-y-3">
52
- <h2 className="text-lg font-medium text-zinc-200">Sharing</h2>
53
- <p className="text-sm leading-7 text-zinc-400">
54
- We do not sell your data. Information may be shared with service providers only as needed to run
55
- Knotpad features such as authentication, payments, and infrastructure operations.
56
- </p>
57
- </section>
58
-
59
- <section className="space-y-3">
60
- <h2 className="text-lg font-medium text-zinc-200">Your choices</h2>
61
- <p className="text-sm leading-7 text-zinc-400">
62
- You can manage your account, workspace membership, and subscription settings inside Knotpad. You
63
- may also stop using the service and request workspace access changes from the relevant owner.
64
- </p>
65
- </section>
66
- </div>
67
- </main>
68
- );
69
- }
package/app/robots.tsx DELETED
@@ -1,25 +0,0 @@
1
- import type { MetadataRoute } from "next";
2
-
3
- export default function robots(): MetadataRoute.Robots {
4
- return {
5
- rules: {
6
- userAgent: "*",
7
- allow: "/",
8
- disallow: [
9
- "/api/",
10
- "/settings/",
11
- "/notes/",
12
- "/calendar/",
13
- "/kanban/",
14
- "/list/",
15
- "/graph/",
16
- "/tasks/",
17
- "/upgrade",
18
- "/invite/",
19
- "/mcp/",
20
- "/_next/",
21
- ],
22
- },
23
- sitemap: "https://knotpad.app/sitemap.xml",
24
- };
25
- }
package/app/sitemap.tsx DELETED
@@ -1,36 +0,0 @@
1
- import type { MetadataRoute } from "next";
2
-
3
- export default function sitemap(): MetadataRoute.Sitemap {
4
- return [
5
- {
6
- url: "https://knotpad.app",
7
- lastModified: new Date(),
8
- changeFrequency: "weekly",
9
- priority: 1,
10
- },
11
- {
12
- url: "https://knotpad.app/register",
13
- lastModified: new Date(),
14
- changeFrequency: "monthly",
15
- priority: 0.8,
16
- },
17
- {
18
- url: "https://knotpad.app/login",
19
- lastModified: new Date(),
20
- changeFrequency: "monthly",
21
- priority: 0.5,
22
- },
23
- {
24
- url: "https://knotpad.app/terms",
25
- lastModified: new Date(),
26
- changeFrequency: "yearly",
27
- priority: 0.3,
28
- },
29
- {
30
- url: "https://knotpad.app/privacy",
31
- lastModified: new Date(),
32
- changeFrequency: "yearly",
33
- priority: 0.3,
34
- },
35
- ];
36
- }
@@ -1,69 +0,0 @@
1
- import type { Metadata } from "next";
2
- import Link from "next/link";
3
- import { AppLogo } from "@/components/branding/app-logo";
4
-
5
- export const metadata: Metadata = {
6
- title: "Terms of Service",
7
- description:
8
- "Terms of Service for Knotpad — note-first project management by Nexstrive Services.",
9
- };
10
-
11
- export default function TermsPage() {
12
- return (
13
- <main className="min-h-screen bg-zinc-950 px-6 py-12 text-zinc-100">
14
- <div className="mx-auto max-w-3xl space-y-10">
15
- <div className="space-y-4">
16
- <Link href="/" className="inline-flex">
17
- <AppLogo className="h-8 w-auto" />
18
- </Link>
19
- <div className="space-y-2">
20
- <h1 className="text-3xl font-semibold tracking-tight">Terms of Service</h1>
21
- <p className="text-sm text-zinc-400">
22
- These terms govern your use of Knotpad and related services provided by Nexstrive.
23
- </p>
24
- </div>
25
- </div>
26
-
27
- <section className="space-y-3">
28
- <h2 className="text-lg font-medium text-zinc-200">Using Knotpad</h2>
29
- <p className="text-sm leading-7 text-zinc-400">
30
- You may use Knotpad for personal or business note-taking, task tracking, and collaboration in
31
- accordance with these terms and all applicable laws.
32
- </p>
33
- </section>
34
-
35
- <section className="space-y-3">
36
- <h2 className="text-lg font-medium text-zinc-200">Accounts and workspace access</h2>
37
- <p className="text-sm leading-7 text-zinc-400">
38
- You are responsible for maintaining the security of your account and for activity that occurs
39
- within your workspaces. Team owners are responsible for managing member access appropriately.
40
- </p>
41
- </section>
42
-
43
- <section className="space-y-3">
44
- <h2 className="text-lg font-medium text-zinc-200">Billing</h2>
45
- <p className="text-sm leading-7 text-zinc-400">
46
- Paid Knotpad plans renew according to the billing cycle presented at checkout. You may manage,
47
- change, or cancel subscriptions through the billing tools made available in the product.
48
- </p>
49
- </section>
50
-
51
- <section className="space-y-3">
52
- <h2 className="text-lg font-medium text-zinc-200">Acceptable use</h2>
53
- <p className="text-sm leading-7 text-zinc-400">
54
- You may not use Knotpad to violate the rights of others, distribute malicious software, or
55
- interfere with the integrity, availability, or security of the service.
56
- </p>
57
- </section>
58
-
59
- <section className="space-y-3">
60
- <h2 className="text-lg font-medium text-zinc-200">Contact</h2>
61
- <p className="text-sm leading-7 text-zinc-400">
62
- For support or legal questions about these terms, contact Nexstrive through the support channel
63
- associated with your Knotpad workspace or deployment.
64
- </p>
65
- </section>
66
- </div>
67
- </main>
68
- );
69
- }