openship 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 (531) hide show
  1. package/.env.example +19 -3
  2. package/CONTRIBUTING.md +69 -19
  3. package/LICENSE +661 -0
  4. package/README.md +304 -108
  5. package/apps/api/Dockerfile +6 -8
  6. package/apps/api/package.json +25 -21
  7. package/apps/api/src/app.ts +46 -3
  8. package/apps/api/src/config/env.ts +81 -7
  9. package/apps/api/src/lib/auth-mode.ts +42 -0
  10. package/apps/api/src/lib/auth.ts +105 -0
  11. package/apps/api/src/lib/cache.ts +128 -0
  12. package/apps/api/src/lib/cloud-auth-proxy.ts +310 -0
  13. package/apps/api/src/lib/cloud-client.ts +103 -0
  14. package/apps/api/src/lib/compose-parser.ts +138 -0
  15. package/apps/api/src/lib/controller-helpers.ts +90 -0
  16. package/apps/api/src/lib/email-templates.ts +94 -0
  17. package/apps/api/src/lib/encryption.ts +102 -0
  18. package/apps/api/src/lib/local-user.ts +65 -0
  19. package/apps/api/src/lib/mail.ts +48 -0
  20. package/apps/api/src/lib/notifications.ts +195 -0
  21. package/apps/api/src/lib/openship-cloud.ts +101 -0
  22. package/apps/api/src/lib/resources.ts +96 -0
  23. package/apps/api/src/lib/screenshots.ts +189 -0
  24. package/apps/api/src/lib/ssh-manager.ts +369 -0
  25. package/apps/api/src/lib/ssl-scheduler.ts +109 -0
  26. package/apps/api/src/lib/stack-detector.ts +708 -0
  27. package/apps/api/src/lib/system-debug.ts +10 -0
  28. package/apps/api/src/middleware/auth.ts +49 -13
  29. package/apps/api/src/middleware/error-handler.ts +23 -3
  30. package/apps/api/src/middleware/index.ts +2 -0
  31. package/apps/api/src/middleware/internal-auth.ts +40 -0
  32. package/apps/api/src/middleware/local-only.ts +20 -0
  33. package/apps/api/src/middleware/rate-limiter.ts +9 -0
  34. package/apps/api/src/modules/analytics/analytics.controller.ts +111 -0
  35. package/apps/api/src/modules/analytics/analytics.routes.ts +29 -0
  36. package/apps/api/src/modules/analytics/analytics.schema.ts +37 -0
  37. package/apps/api/src/modules/analytics/analytics.service.ts +264 -0
  38. package/apps/api/src/modules/auth/auth.routes.ts +233 -6
  39. package/apps/api/src/modules/billing/billing.routes.ts +8 -0
  40. package/apps/api/src/modules/cloud/cloud.controller.ts +225 -0
  41. package/apps/api/src/modules/cloud/cloud.routes.ts +40 -0
  42. package/apps/api/src/modules/deployments/build.service.ts +791 -0
  43. package/apps/api/src/modules/deployments/deployment-lifecycle.ts +138 -0
  44. package/apps/api/src/modules/deployments/deployment.controller.ts +324 -16
  45. package/apps/api/src/modules/deployments/deployment.routes.ts +33 -7
  46. package/apps/api/src/modules/deployments/deployment.schema.ts +37 -5
  47. package/apps/api/src/modules/deployments/deployment.service.ts +178 -11
  48. package/apps/api/src/modules/deployments/preflight.ts +280 -0
  49. package/apps/api/src/modules/deployments/prepare.service.ts +252 -0
  50. package/apps/api/src/modules/deployments/session-manager.ts +283 -0
  51. package/apps/api/src/modules/deployments/ssl.service.ts +73 -0
  52. package/apps/api/src/modules/domains/domain.controller.ts +59 -7
  53. package/apps/api/src/modules/domains/domain.routes.ts +20 -5
  54. package/apps/api/src/modules/domains/domain.schema.ts +35 -0
  55. package/apps/api/src/modules/domains/domain.service.ts +375 -9
  56. package/apps/api/src/modules/github/github.auth.ts +397 -0
  57. package/apps/api/src/modules/github/github.controller.ts +387 -0
  58. package/apps/api/src/modules/github/github.local-auth.ts +251 -0
  59. package/apps/api/src/modules/github/github.routes.ts +50 -0
  60. package/apps/api/src/modules/github/github.schema.ts +52 -0
  61. package/apps/api/src/modules/github/github.service.ts +592 -0
  62. package/apps/api/src/modules/github/github.types.ts +158 -0
  63. package/apps/api/src/modules/github/github.webhook.ts +186 -0
  64. package/apps/api/src/modules/github/index.ts +16 -0
  65. package/apps/api/src/modules/health/health.routes.ts +35 -0
  66. package/apps/api/src/modules/projects/project.controller.ts +481 -12
  67. package/apps/api/src/modules/projects/project.routes.ts +63 -6
  68. package/apps/api/src/modules/projects/project.schema.ts +104 -6
  69. package/apps/api/src/modules/projects/project.service.ts +502 -11
  70. package/apps/api/src/modules/settings/settings.controller.ts +55 -0
  71. package/apps/api/src/modules/settings/settings.routes.ts +25 -0
  72. package/apps/api/src/modules/settings/settings.service.ts +49 -0
  73. package/apps/api/src/modules/system/filesystem.controller.ts +66 -0
  74. package/apps/api/src/modules/system/index.ts +1 -0
  75. package/apps/api/src/modules/system/server-check.controller.ts +475 -0
  76. package/apps/api/src/modules/system/setup-session.ts +255 -0
  77. package/apps/api/src/modules/system/setup.controller.ts +128 -0
  78. package/apps/api/src/modules/system/system.routes.ts +42 -0
  79. package/apps/api/src/modules/webhooks/webhook.controller.ts +57 -15
  80. package/apps/api/src/modules/webhooks/webhook.routes.ts +11 -8
  81. package/apps/api/src/modules/webhooks/webhook.service.ts +46 -5
  82. package/apps/api/src/modules/webhooks/webhook.types.ts +35 -0
  83. package/apps/api/tsconfig.json +3 -1
  84. package/apps/cli/package.json +8 -10
  85. package/apps/cli/tsconfig.json +2 -1
  86. package/apps/dashboard/Dockerfile +4 -6
  87. package/apps/dashboard/components.json +20 -0
  88. package/apps/dashboard/next-env.d.ts +6 -0
  89. package/apps/dashboard/next.config.mjs +11 -1
  90. package/apps/dashboard/package.json +25 -13
  91. package/apps/dashboard/postcss.config.mjs +5 -0
  92. package/apps/dashboard/public/android-chrome-192x192.png +0 -0
  93. package/apps/dashboard/public/android-chrome-512x512.png +0 -0
  94. package/apps/dashboard/public/apple-touch-icon.png +0 -0
  95. package/apps/dashboard/public/favicon-16x16.png +0 -0
  96. package/apps/dashboard/public/favicon-32x32.png +0 -0
  97. package/apps/dashboard/public/favicon.ico +0 -0
  98. package/apps/dashboard/public/site.webmanifest +19 -0
  99. package/apps/dashboard/src/app/(auth)/forgot-password/page.tsx +114 -0
  100. package/apps/dashboard/src/app/(auth)/layout.tsx +18 -3
  101. package/apps/dashboard/src/app/(auth)/login/page.tsx +215 -6
  102. package/apps/dashboard/src/app/(auth)/providers.tsx +34 -0
  103. package/apps/dashboard/src/app/(auth)/register/page.tsx +171 -5
  104. package/apps/dashboard/src/app/(auth)/reset-password/page.tsx +172 -0
  105. package/apps/dashboard/src/app/(auth)/verify-email/page.tsx +190 -0
  106. package/apps/dashboard/src/app/(dashboard)/(deployment)/build/[id]/page.tsx +162 -0
  107. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/BuildSummary.tsx +166 -0
  108. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/DnsConfiguration.tsx +119 -0
  109. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/DomainSettings.tsx +291 -0
  110. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/Header.tsx +71 -0
  111. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/Sidebar.tsx +270 -0
  112. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/SkeletonLoader.tsx +87 -0
  113. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/page.tsx +169 -0
  114. package/apps/dashboard/src/app/(dashboard)/(deployment)/layout.tsx +7 -0
  115. package/apps/dashboard/src/app/(dashboard)/billing/page.tsx +1 -8
  116. package/apps/dashboard/src/app/(dashboard)/deployments/components/CommitDetailsModal.tsx +240 -0
  117. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentCard.tsx +121 -0
  118. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentHeader.tsx +89 -0
  119. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentMenu.tsx +182 -0
  120. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsContent.tsx +324 -0
  121. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsFilters.tsx +99 -0
  122. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsList.tsx +31 -0
  123. package/apps/dashboard/src/app/(dashboard)/deployments/components/EmptyState.tsx +101 -0
  124. package/apps/dashboard/src/app/(dashboard)/deployments/components/LoadingSkeleton.tsx +57 -0
  125. package/apps/dashboard/src/app/(dashboard)/deployments/components/ProjectFilter.tsx +109 -0
  126. package/apps/dashboard/src/app/(dashboard)/deployments/components/index.ts +9 -0
  127. package/apps/dashboard/src/app/(dashboard)/deployments/page.tsx +9 -3
  128. package/apps/dashboard/src/app/(dashboard)/deployments/types.ts +44 -0
  129. package/apps/dashboard/src/app/(dashboard)/deployments/utils.ts +176 -0
  130. package/apps/dashboard/src/app/(dashboard)/domains/page.tsx +1 -6
  131. package/apps/dashboard/src/app/(dashboard)/integrations/page.tsx +321 -0
  132. package/apps/dashboard/src/app/(dashboard)/layout.tsx +22 -32
  133. package/apps/dashboard/src/app/(dashboard)/library/components/ConnectPrompt.tsx +187 -0
  134. package/apps/dashboard/src/app/(dashboard)/library/components/LibrarySidebar.tsx +147 -0
  135. package/apps/dashboard/src/app/(dashboard)/library/components/LoadingSkeleton.tsx +39 -0
  136. package/apps/dashboard/src/app/(dashboard)/library/components/LocalProjects.tsx +548 -0
  137. package/apps/dashboard/src/app/(dashboard)/library/components/RepositoryList.tsx +292 -0
  138. package/apps/dashboard/src/app/(dashboard)/library/components/TemplateGrid.tsx +36 -0
  139. package/apps/dashboard/src/app/(dashboard)/library/components/UrlImport.tsx +74 -0
  140. package/apps/dashboard/src/app/(dashboard)/library/page.tsx +121 -0
  141. package/apps/dashboard/src/app/(dashboard)/library/types.ts +26 -0
  142. package/apps/dashboard/src/app/(dashboard)/monitoring/page.tsx +1 -6
  143. package/apps/dashboard/src/app/(dashboard)/page.tsx +485 -0
  144. package/apps/dashboard/src/app/(dashboard)/projects/[id]/[[...slug]]/layout.tsx +22 -0
  145. package/apps/dashboard/src/app/(dashboard)/projects/[id]/[[...slug]]/page.tsx +286 -0
  146. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/AdvancedSettings.tsx +235 -0
  147. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/BuildSettings.tsx +174 -0
  148. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DeleteConfirmationDialog.tsx +45 -0
  149. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DeletionModal.tsx +95 -0
  150. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/Deployments.tsx +11 -0
  151. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DomainSettings.tsx +523 -0
  152. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/EnvironmentSettings.tsx +246 -0
  153. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GeneralSettings.tsx +93 -0
  154. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GitInfo.tsx +261 -0
  155. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GitSettings.tsx +391 -0
  156. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/LogsSettings.tsx +133 -0
  157. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ProjectNotFound.tsx +95 -0
  158. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ProjectsBottomNavigation.tsx +62 -0
  159. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ResourceSettings.tsx +333 -0
  160. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SettingSection.tsx +66 -0
  161. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SettingsNavigation.tsx +27 -0
  162. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SleepModeSettings.tsx +134 -0
  163. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProductionUrl.tsx +25 -0
  164. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProjectIdentity.tsx +159 -0
  165. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProjectInfo.tsx +58 -0
  166. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/SkeletonLoader.tsx +170 -0
  167. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/StatsCards.tsx +33 -0
  168. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/TopPaths.tsx +56 -0
  169. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/TrafficChart.tsx +157 -0
  170. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/index.ts +14 -0
  171. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/LogsActions.tsx +52 -0
  172. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/ServerLogs.tsx +249 -0
  173. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/TerminalLogs.tsx +682 -0
  174. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/logs.css +127 -0
  175. package/apps/dashboard/src/app/(dashboard)/projects/components/DeploymentCard.tsx +73 -0
  176. package/apps/dashboard/src/app/(dashboard)/projects/components/ProjectCard.tsx +330 -0
  177. package/apps/dashboard/src/app/(dashboard)/projects/page.tsx +326 -4
  178. package/apps/dashboard/src/app/(dashboard)/providers.tsx +23 -0
  179. package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/components-tab.tsx +329 -0
  180. package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/overview-tab.tsx +229 -0
  181. package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/terminal-tab.tsx +38 -0
  182. package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/page.tsx +437 -0
  183. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/checking-state.tsx +15 -0
  184. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/choose-mode.tsx +54 -0
  185. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/component-row.tsx +65 -0
  186. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/error-banner.tsx +13 -0
  187. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/installing-panel.tsx +227 -0
  188. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/results-panel.tsx +90 -0
  189. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/setup-header.tsx +56 -0
  190. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/types.ts +13 -0
  191. package/apps/dashboard/src/app/(dashboard)/servers/new/page.tsx +666 -0
  192. package/apps/dashboard/src/app/(dashboard)/servers/page.tsx +283 -0
  193. package/apps/dashboard/src/app/(dashboard)/settings/_components/BuildPreferences.tsx +110 -0
  194. package/apps/dashboard/src/app/(dashboard)/settings/_components/CloudConnection.tsx +147 -0
  195. package/apps/dashboard/src/app/(dashboard)/settings/_components/InstanceInfo.tsx +54 -0
  196. package/apps/dashboard/src/app/(dashboard)/settings/_components/ServerConnection.tsx +407 -0
  197. package/apps/dashboard/src/app/(dashboard)/settings/_components/SettingsSection.tsx +32 -0
  198. package/apps/dashboard/src/app/(dashboard)/settings/page.tsx +62 -3
  199. package/apps/dashboard/src/app/auth/callback/close/page.tsx +23 -0
  200. package/apps/dashboard/src/app/auth/callback/install/page.tsx +40 -0
  201. package/apps/dashboard/src/app/authorize/page.tsx +137 -0
  202. package/apps/dashboard/src/app/globals.css +57 -3
  203. package/apps/dashboard/src/app/layout.tsx +43 -3
  204. package/apps/dashboard/src/components/auth-shell.tsx +66 -0
  205. package/apps/dashboard/src/components/deployments/types.ts +44 -0
  206. package/apps/dashboard/src/components/global-deployments/index.ts +17 -0
  207. package/apps/dashboard/src/components/i18n-provider.tsx +100 -0
  208. package/apps/dashboard/src/components/import-project/BuildSettings.tsx +376 -0
  209. package/apps/dashboard/src/components/import-project/BuildSkeleton.tsx +161 -0
  210. package/apps/dashboard/src/components/import-project/BuildTerminal.tsx +358 -0
  211. package/apps/dashboard/src/components/import-project/ComposeServices.tsx +455 -0
  212. package/apps/dashboard/src/components/import-project/DeploymentProcessing.tsx +510 -0
  213. package/apps/dashboard/src/components/import-project/DockerSettings.tsx +64 -0
  214. package/apps/dashboard/src/components/import-project/EnvironmentVariables.tsx +481 -0
  215. package/apps/dashboard/src/components/import-project/Frameworks.tsx +90 -0
  216. package/apps/dashboard/src/components/import-project/ProjectSettings.tsx +160 -0
  217. package/apps/dashboard/src/components/import-project/types.ts +82 -0
  218. package/apps/dashboard/src/components/integrations/GithubPermissionModal.tsx +173 -0
  219. package/apps/dashboard/src/components/language-switcher.tsx +36 -0
  220. package/apps/dashboard/src/components/logo.tsx +13 -0
  221. package/apps/dashboard/src/components/network-error-handler.tsx +27 -0
  222. package/apps/dashboard/src/components/oauth-buttons.tsx +81 -0
  223. package/apps/dashboard/src/components/overview/ActivityChart.tsx +247 -0
  224. package/apps/dashboard/src/components/overview/ApiRequestsCard.tsx +111 -0
  225. package/apps/dashboard/src/components/overview/CreditsCard.tsx +137 -0
  226. package/apps/dashboard/src/components/overview/DeploymentsChart.tsx +195 -0
  227. package/apps/dashboard/src/components/overview/EmptyState.tsx +126 -0
  228. package/apps/dashboard/src/components/overview/LoadingSkeleton.tsx +92 -0
  229. package/apps/dashboard/src/components/overview/OverviewHeader.tsx +74 -0
  230. package/apps/dashboard/src/components/overview/OverviewHeroChart.tsx +344 -0
  231. package/apps/dashboard/src/components/overview/ProjectsCard.tsx +134 -0
  232. package/apps/dashboard/src/components/overview/QuickLinks.tsx +119 -0
  233. package/apps/dashboard/src/components/overview/SandboxesCard.tsx +150 -0
  234. package/apps/dashboard/src/components/overview/StatsGrid.tsx +166 -0
  235. package/apps/dashboard/src/components/overview/TokenUsageChart.tsx +206 -0
  236. package/apps/dashboard/src/components/overview/UsageStats.tsx +79 -0
  237. package/apps/dashboard/src/components/overview/index.ts +30 -0
  238. package/apps/dashboard/src/components/overview/types.ts +116 -0
  239. package/apps/dashboard/src/components/page-header.tsx +25 -0
  240. package/apps/dashboard/src/components/project-settings/ServerSideSwitch.jsx +60 -0
  241. package/apps/dashboard/src/components/shared/AlertBox.tsx +39 -0
  242. package/apps/dashboard/src/components/shared/CTASection.tsx +45 -0
  243. package/apps/dashboard/src/components/shared/ErrorState.tsx +176 -0
  244. package/apps/dashboard/src/components/shared/FeatureCard.tsx +20 -0
  245. package/apps/dashboard/src/components/shared/MDXComponents.tsx +24 -0
  246. package/apps/dashboard/src/components/shared/MachineSettingsModal.tsx +286 -0
  247. package/apps/dashboard/src/components/shared/Modal.tsx +39 -0
  248. package/apps/dashboard/src/components/shared/OTPInput.tsx +122 -0
  249. package/apps/dashboard/src/components/shared/PageHero.tsx +21 -0
  250. package/apps/dashboard/src/components/shared/PlatformFeatureCard.tsx +27 -0
  251. package/apps/dashboard/src/components/shared/StatCard.tsx +14 -0
  252. package/apps/dashboard/src/components/shared/ValueCard.tsx +20 -0
  253. package/apps/dashboard/src/components/shared/index.ts +8 -0
  254. package/apps/dashboard/src/components/sidebar.tsx +282 -0
  255. package/apps/dashboard/src/components/theme-provider.tsx +96 -0
  256. package/apps/dashboard/src/components/toast.tsx +106 -0
  257. package/apps/dashboard/src/components/ui/CustomCursor.tsx +107 -0
  258. package/apps/dashboard/src/components/ui/CustomSelect.tsx +126 -0
  259. package/apps/dashboard/src/components/ui/DropdownMenu.tsx +174 -0
  260. package/apps/dashboard/src/components/ui/FileIcon.jsx +59 -0
  261. package/apps/dashboard/src/components/ui/IconPickerModal.tsx +273 -0
  262. package/apps/dashboard/src/components/ui/InfoBanner.jsx +39 -0
  263. package/apps/dashboard/src/components/ui/Logo.tsx +14 -0
  264. package/apps/dashboard/src/components/ui/Modal.tsx +117 -0
  265. package/apps/dashboard/src/components/ui/PageContainer.tsx +12 -0
  266. package/apps/dashboard/src/components/ui/SectionContainer.jsx +7 -0
  267. package/apps/dashboard/src/components/ui/SlidingToggle.tsx +128 -0
  268. package/apps/dashboard/src/components/ui/Toast.tsx +29 -0
  269. package/apps/dashboard/src/components/ui/button.tsx +58 -0
  270. package/apps/dashboard/src/components/ui/card.tsx +60 -0
  271. package/apps/dashboard/src/components/ui/input.tsx +20 -0
  272. package/apps/dashboard/src/components/ui/label.tsx +19 -0
  273. package/apps/dashboard/src/components/ui/select.tsx +10 -0
  274. package/apps/dashboard/src/components/ui/textarea.tsx +9 -0
  275. package/apps/dashboard/src/constants/lang-colors.ts +25 -0
  276. package/apps/dashboard/src/constants/mock.ts +38 -0
  277. package/apps/dashboard/src/context/AuthContext.tsx +91 -0
  278. package/apps/dashboard/src/context/CloudContext.tsx +275 -0
  279. package/apps/dashboard/src/context/DeploymentContext.tsx +71 -0
  280. package/apps/dashboard/src/context/GitHubContext.tsx +288 -0
  281. package/apps/dashboard/src/context/ModalContext.tsx +300 -0
  282. package/apps/dashboard/src/context/NetworkContext.tsx +32 -0
  283. package/apps/dashboard/src/context/ProjectSettingsContext.tsx +727 -0
  284. package/apps/dashboard/src/context/ToastContext.tsx +129 -0
  285. package/apps/dashboard/src/context/deployment/index.ts +3 -0
  286. package/apps/dashboard/src/context/deployment/types.ts +183 -0
  287. package/apps/dashboard/src/context/deployment/useDeploymentBuild.ts +547 -0
  288. package/apps/dashboard/src/context/deployment/useDeploymentConfig.ts +176 -0
  289. package/apps/dashboard/src/hooks/useBuildConnection.ts +334 -0
  290. package/apps/dashboard/src/hooks/useMonitorStream.ts +146 -0
  291. package/apps/dashboard/src/hooks/useProjectData.ts +110 -0
  292. package/apps/dashboard/src/hooks/useSSEConnection.ts +465 -0
  293. package/apps/dashboard/src/hooks/useSSEStream.ts +309 -0
  294. package/apps/dashboard/src/hooks/useSessions.ts +104 -0
  295. package/apps/dashboard/src/hooks/useSetupStream.ts +223 -0
  296. package/apps/dashboard/src/i18n/dictionaries/ar.json +218 -0
  297. package/apps/dashboard/src/i18n/dictionaries/en.json +218 -0
  298. package/apps/dashboard/src/i18n/index.ts +16 -0
  299. package/apps/dashboard/src/lib/api/ai.ts +22 -0
  300. package/apps/dashboard/src/lib/api/auth.ts +13 -0
  301. package/apps/dashboard/src/lib/api/client.ts +199 -0
  302. package/apps/dashboard/src/lib/api/cloud.ts +15 -0
  303. package/apps/dashboard/src/lib/api/deploy.ts +58 -0
  304. package/apps/dashboard/src/lib/api/domains.ts +13 -0
  305. package/apps/dashboard/src/lib/api/endpoints.ts +129 -0
  306. package/apps/dashboard/src/lib/api/github.ts +31 -0
  307. package/apps/dashboard/src/lib/api/icons.ts +12 -0
  308. package/apps/dashboard/src/lib/api/index.ts +41 -0
  309. package/apps/dashboard/src/lib/api/projects.ts +153 -0
  310. package/apps/dashboard/src/lib/api/sandbox.ts +14 -0
  311. package/apps/dashboard/src/lib/api/settings.ts +21 -0
  312. package/apps/dashboard/src/lib/api/system.ts +159 -0
  313. package/apps/dashboard/src/lib/auth-client.ts +54 -0
  314. package/apps/dashboard/src/lib/country.ts +25 -0
  315. package/apps/dashboard/src/lib/server/api.ts +140 -0
  316. package/apps/dashboard/src/lib/server/session.ts +103 -0
  317. package/apps/dashboard/src/lib/sseClient.ts +241 -0
  318. package/apps/dashboard/src/lib/sseMessageProcessors.ts +323 -0
  319. package/apps/dashboard/src/lib/utils.ts +6 -0
  320. package/apps/dashboard/src/proxy.ts +46 -0
  321. package/apps/dashboard/src/styles/Toast.module.css +92 -0
  322. package/apps/dashboard/src/styles/fonts.css +93 -0
  323. package/apps/dashboard/src/styles/theme.css +336 -0
  324. package/apps/dashboard/src/types/research.ts +42 -0
  325. package/apps/dashboard/src/utils/SSEParser.js +150 -0
  326. package/apps/dashboard/src/utils/authWindow.ts +143 -0
  327. package/apps/dashboard/src/utils/codeTheme.ts +127 -0
  328. package/apps/dashboard/src/utils/colors.json +2810 -0
  329. package/apps/dashboard/src/utils/date.ts +121 -0
  330. package/apps/dashboard/src/utils/deployment.ts +128 -0
  331. package/apps/dashboard/src/utils/deploymentPhaseDetector.ts +232 -0
  332. package/apps/dashboard/src/utils/extToLang.js +103 -0
  333. package/apps/dashboard/src/utils/github.ts +62 -0
  334. package/apps/dashboard/src/utils/icons.js +46 -0
  335. package/apps/dashboard/src/utils/repoSlug.ts +110 -0
  336. package/apps/dashboard/src/utils/research-api.ts +163 -0
  337. package/apps/dashboard/src/utils/suggestions.ts +84 -0
  338. package/apps/dashboard/src/utils/theme.js +1 -0
  339. package/apps/dashboard/src/utils/ui-helpers.tsx +30 -0
  340. package/apps/dashboard/src/utils/upload.js +12 -0
  341. package/apps/dashboard/tsconfig.json +27 -5
  342. package/apps/desktop/forge.config.json +36 -0
  343. package/apps/desktop/package.json +26 -0
  344. package/apps/desktop/scripts/dev.mjs +58 -0
  345. package/apps/desktop/src/main/index.ts +675 -0
  346. package/apps/desktop/src/main/types/desktop.d.ts +33 -0
  347. package/apps/desktop/src/preload/index.ts +88 -0
  348. package/apps/desktop/src/renderer/index.html +462 -0
  349. package/apps/desktop/src/renderer/onboarding.js +511 -0
  350. package/apps/desktop/src/renderer/styles.css +1139 -0
  351. package/apps/desktop/tsconfig.json +17 -0
  352. package/apps/web/.source/browser.ts +13 -0
  353. package/apps/web/.source/dynamic.ts +8 -0
  354. package/apps/web/.source/server.ts +22 -0
  355. package/apps/web/.source/source.config.mjs +20 -0
  356. package/apps/web/Dockerfile +4 -6
  357. package/apps/web/content/blog/how-ai-builds-work.mdx +55 -0
  358. package/apps/web/content/blog/introducing-openship.mdx +46 -0
  359. package/apps/web/content/blog/self-hosting-cost-breakdown.mdx +59 -0
  360. package/apps/web/content/docs/_meta.json +14 -0
  361. package/apps/web/content/docs/api.mdx +98 -0
  362. package/apps/web/content/docs/cli.mdx +80 -0
  363. package/apps/web/content/docs/first-deployment.mdx +56 -0
  364. package/apps/web/content/docs/index.mdx +27 -0
  365. package/apps/web/content/docs/installation.mdx +65 -0
  366. package/apps/web/content/docs/quickstart.mdx +45 -0
  367. package/apps/web/next-env.d.ts +6 -0
  368. package/apps/web/next.config.mjs +16 -2
  369. package/apps/web/package.json +19 -12
  370. package/apps/web/postcss.config.mjs +5 -0
  371. package/apps/web/public/android-chrome-192x192.png +0 -0
  372. package/apps/web/public/android-chrome-512x512.png +0 -0
  373. package/apps/web/public/apple-touch-icon.png +0 -0
  374. package/apps/web/public/favicon-16x16.png +0 -0
  375. package/apps/web/public/favicon-32x32.png +0 -0
  376. package/apps/web/public/favicon.ico +0 -0
  377. package/apps/web/public/site.webmanifest +1 -0
  378. package/apps/web/source.config.ts +17 -0
  379. package/apps/web/src/app/(marketing)/layout.tsx +7 -22
  380. package/apps/web/src/app/blog/[...slug]/page.tsx +247 -0
  381. package/apps/web/src/app/blog/blog.css +575 -0
  382. package/apps/web/src/app/blog/layout.tsx +50 -0
  383. package/apps/web/src/app/blog/page.tsx +235 -0
  384. package/apps/web/src/app/docs/[[...slug]]/page.tsx +67 -0
  385. package/apps/web/src/app/docs/layout.tsx +62 -0
  386. package/apps/web/src/app/docs/toc-theme.css +71 -0
  387. package/apps/web/src/app/download/page.tsx +396 -0
  388. package/apps/web/src/app/globals.css +20 -3
  389. package/apps/web/src/app/layout.tsx +57 -3
  390. package/apps/web/src/app/page.tsx +47 -6
  391. package/apps/web/src/app/robots.ts +15 -0
  392. package/apps/web/src/app/sitemap.ts +35 -0
  393. package/apps/web/src/components/blog/share-sidebar.tsx +81 -0
  394. package/apps/web/src/components/blog/writer-sidebar.tsx +81 -0
  395. package/apps/web/src/components/landing/ai-native.tsx +169 -0
  396. package/apps/web/src/components/landing/backups.tsx +139 -0
  397. package/apps/web/src/components/landing/cdn.tsx +109 -0
  398. package/apps/web/src/components/landing/coming-soon.tsx +180 -0
  399. package/apps/web/src/components/landing/dark-section.tsx +166 -0
  400. package/apps/web/src/components/landing/dashboard.tsx +407 -0
  401. package/apps/web/src/components/landing/developer-experience.tsx +224 -0
  402. package/apps/web/src/components/landing/dns-domains.tsx +146 -0
  403. package/apps/web/src/components/landing/download-button.tsx +151 -0
  404. package/apps/web/src/components/landing/features/ai-visual.tsx +48 -0
  405. package/apps/web/src/components/landing/features/cloud-visual.tsx +44 -0
  406. package/apps/web/src/components/landing/features/git-visual.tsx +61 -0
  407. package/apps/web/src/components/landing/features/index.tsx +642 -0
  408. package/apps/web/src/components/landing/features/infra-visual.tsx +69 -0
  409. package/apps/web/src/components/landing/features/rollback-visual.tsx +42 -0
  410. package/apps/web/src/components/landing/features/ssl-visual.tsx +41 -0
  411. package/apps/web/src/components/landing/features/stacks-visual.tsx +54 -0
  412. package/apps/web/src/components/landing/final-cta.tsx +116 -0
  413. package/apps/web/src/components/landing/footer.tsx +145 -0
  414. package/apps/web/src/components/landing/hero.tsx +110 -0
  415. package/apps/web/src/components/landing/how-it-works.tsx +210 -0
  416. package/apps/web/src/components/landing/index.ts +21 -0
  417. package/apps/web/src/components/landing/mail-server.tsx +122 -0
  418. package/apps/web/src/components/landing/navbar.tsx +199 -0
  419. package/apps/web/src/components/landing/no-lockin.tsx +185 -0
  420. package/apps/web/src/components/landing/open-source-cta.tsx +151 -0
  421. package/apps/web/src/components/landing/portability.tsx +190 -0
  422. package/apps/web/src/components/landing/pricing.tsx +263 -0
  423. package/apps/web/src/components/landing/scaling.tsx +209 -0
  424. package/apps/web/src/components/landing/why-openship.tsx +291 -0
  425. package/apps/web/src/hooks/use-gsap-scroll.ts +158 -0
  426. package/apps/web/src/hooks/use-platform.ts +86 -0
  427. package/apps/web/src/lib/source.ts +12 -0
  428. package/apps/web/src/styles/fonts.css +84 -0
  429. package/apps/web/src/styles/landing.css +951 -0
  430. package/apps/web/src/styles/theme.css +227 -0
  431. package/apps/web/tsconfig.json +8 -3
  432. package/bun.lock +3260 -0
  433. package/docker-compose.yml +3 -0
  434. package/docs/screenshots/.gitkeep +0 -0
  435. package/docs/screenshots/screen.png +0 -0
  436. package/openship.code-workspace +7 -0
  437. package/package.json +23 -9
  438. package/packages/adapters/docs/ARCHITECTURE.md +160 -0
  439. package/packages/adapters/docs/BUILD-PIPELINE.md +171 -0
  440. package/packages/adapters/docs/CLOUD.md +239 -0
  441. package/packages/adapters/docs/EXECUTOR.md +174 -0
  442. package/packages/adapters/docs/LOG-STREAMING.md +175 -0
  443. package/packages/adapters/docs/SYSTEM.md +191 -0
  444. package/packages/adapters/package.json +14 -9
  445. package/packages/adapters/src/index.ts +144 -4
  446. package/packages/adapters/src/infra/cloud.ts +42 -0
  447. package/packages/adapters/src/infra/index.ts +9 -0
  448. package/packages/adapters/src/infra/noop.ts +27 -0
  449. package/packages/adapters/src/infra/traefik.ts +297 -0
  450. package/packages/adapters/src/infra/types.ts +36 -0
  451. package/packages/adapters/src/platform.ts +255 -0
  452. package/packages/adapters/src/runtime/bare.ts +567 -0
  453. package/packages/adapters/src/runtime/build-pipeline.ts +237 -0
  454. package/packages/adapters/src/runtime/cloud.ts +791 -0
  455. package/packages/adapters/src/runtime/deploy-pipeline.ts +146 -0
  456. package/packages/adapters/src/runtime/docker.ts +443 -0
  457. package/packages/adapters/src/runtime/index.ts +69 -0
  458. package/packages/adapters/src/runtime/local-build.ts +112 -0
  459. package/packages/adapters/src/runtime/transfer.ts +82 -0
  460. package/packages/adapters/src/runtime/types.ts +138 -0
  461. package/packages/adapters/src/system/catalog.ts +188 -0
  462. package/packages/adapters/src/system/checks.ts +228 -0
  463. package/packages/adapters/src/system/components.ts +45 -0
  464. package/packages/adapters/src/system/debug.ts +18 -0
  465. package/packages/adapters/src/system/environment.ts +168 -0
  466. package/packages/adapters/src/system/errors.ts +34 -0
  467. package/packages/adapters/src/system/executor.ts +600 -0
  468. package/packages/adapters/src/system/index.ts +58 -0
  469. package/packages/adapters/src/system/installer.ts +310 -0
  470. package/packages/adapters/src/system/setup.ts +442 -0
  471. package/packages/adapters/src/system/state.ts +96 -0
  472. package/packages/adapters/src/system/types.ts +116 -0
  473. package/packages/adapters/src/toolchain/catalog.ts +439 -0
  474. package/packages/adapters/src/toolchain/checks.ts +181 -0
  475. package/packages/adapters/src/toolchain/index.ts +38 -0
  476. package/packages/adapters/src/toolchain/installer.ts +189 -0
  477. package/packages/adapters/src/toolchain/types.ts +84 -0
  478. package/packages/adapters/src/types.ts +277 -0
  479. package/packages/adapters/tsconfig.json +3 -1
  480. package/packages/core/package.json +9 -9
  481. package/packages/core/src/constants.ts +44 -1
  482. package/packages/core/src/index.ts +2 -0
  483. package/packages/core/src/stacks.ts +778 -0
  484. package/packages/core/src/system.ts +111 -0
  485. package/packages/core/src/types.ts +22 -1
  486. package/packages/core/src/utils.ts +8 -0
  487. package/packages/core/tsconfig.json +3 -1
  488. package/packages/db/drizzle/0000_init.sql +231 -0
  489. package/packages/db/drizzle/0001_add_server_name.sql +1 -0
  490. package/packages/db/drizzle/meta/_journal.json +20 -0
  491. package/packages/db/drizzle.config.ts +10 -0
  492. package/packages/db/package.json +26 -14
  493. package/packages/db/src/client.ts +119 -0
  494. package/packages/db/src/index.ts +57 -8
  495. package/packages/db/src/repos/account.repo.ts +92 -0
  496. package/packages/db/src/repos/deployment.repo.ts +168 -0
  497. package/packages/db/src/repos/domain.repo.ts +102 -0
  498. package/packages/db/src/repos/git-installation.repo.ts +95 -0
  499. package/packages/db/src/repos/index.ts +43 -0
  500. package/packages/db/src/repos/instance-settings.repo.ts +43 -0
  501. package/packages/db/src/repos/project.repo.ts +159 -0
  502. package/packages/db/src/repos/session.repo.ts +82 -0
  503. package/packages/db/src/repos/settings.repo.ts +51 -0
  504. package/packages/db/src/repos/user.repo.ts +94 -0
  505. package/packages/db/src/schema/auth.ts +56 -0
  506. package/packages/db/src/schema/deployment.ts +87 -0
  507. package/packages/db/src/schema/domain.ts +46 -0
  508. package/packages/db/src/schema/github.ts +24 -0
  509. package/packages/db/src/schema/index.ts +6 -0
  510. package/packages/db/src/schema/project.ts +117 -0
  511. package/packages/db/src/schema/settings.ts +103 -0
  512. package/packages/db/tsconfig.json +3 -1
  513. package/packages/ui/package.json +17 -17
  514. package/packages/ui/src/components/status-dot.tsx +1 -1
  515. package/packages/ui/tsconfig.json +7 -2
  516. package/pnpm-workspace.yaml +0 -1
  517. package/{tooling/tsconfig/base.json → tsconfig.base.json} +0 -1
  518. package/turbo.json +4 -0
  519. package/apps/api/src/modules/auth/auth.controller.ts +0 -26
  520. package/apps/api/src/modules/auth/auth.schema.ts +0 -12
  521. package/apps/api/src/modules/auth/auth.service.ts +0 -23
  522. package/apps/dashboard/src/app/page.tsx +0 -6
  523. package/apps/web/src/app/(marketing)/docs/page.tsx +0 -10
  524. package/packages/adapters/src/base-adapter.ts +0 -49
  525. package/packages/adapters/src/docker-adapter.ts +0 -43
  526. package/packages/adapters/src/oblien-adapter.ts +0 -46
  527. package/packages/adapters/src/registry.ts +0 -22
  528. package/packages/db/prisma/schema.prisma +0 -160
  529. package/tooling/tsconfig/nextjs.json +0 -10
  530. package/tooling/tsconfig/node.json +0 -10
  531. package/tooling/tsconfig/package.json +0 -7
package/README.md CHANGED
@@ -1,164 +1,360 @@
1
- <div align="center">
2
- <h1>🚀 Openship</h1>
3
- <p><strong>The open-source, self-hostable deployment platform.</strong></p>
4
- <p>Deploy anywhere — from your own server to our managed cloud.</p>
1
+ <h1 align="center">Openship</h1>
5
2
 
6
- <br />
3
+ <p align="center">
4
+ Deploy anything. Own everything.<br>
5
+ Push your code — build, configure, and deploy from one place.<br>
6
+ Use our cloud or connect your own servers.
7
+ </p>
7
8
 
8
- <a href="#quick-start">Quick Start</a> ·
9
- <a href="#architecture">Architecture</a> ·
10
- <a href="#self-hosting">Self-Hosting</a> ·
11
- <a href="#cloud">Cloud</a> ·
12
- <a href="#contributing">Contributing</a>
13
- </div>
9
+ <p align="center">
10
+ Desktop-first. Open-source. Zero lock-in.
11
+ </p>
12
+
13
+ <p align="center">
14
+ <img src="docs/screenshots/screen.png" alt="Openship" width="800" />
15
+ </p>
14
16
 
15
17
  ---
16
18
 
17
- ## Quick Start
19
+ ## What Openship Is
18
20
 
19
- ### Prerequisites
21
+ Openship is a **desktop-first deployment platform with built-in CI/CD and full infrastructure control**.
20
22
 
21
- - [Node.js](https://nodejs.org/) >= 20
22
- - [pnpm](https://pnpm.io/) >= 9
23
- - [Docker](https://www.docker.com/) (for self-hosting or local development)
23
+ It removes the gap between writing code and running it in production.
24
24
 
25
- ### Development
25
+ No pipelines to maintain.
26
+ No YAML to manage.
27
+ No platform lock-in.
26
28
 
27
- ```bash
28
- # Clone the repo
29
- git clone https://github.com/openship/openship.git
30
- cd openship
29
+ ---
31
30
 
32
- # Install dependencies
33
- pnpm install
31
+ ## The Core Idea
34
32
 
35
- # Set up environment
36
- cp .env.example .env
33
+ Most platforms run everything on your server:
37
34
 
38
- # Generate Prisma client
39
- pnpm db:generate
35
+ - CI/CD pipelines
36
+ - Build systems
37
+ - Dashboards
38
+ - Databases
39
+ - Your apps
40
40
 
41
- # Push schema to local SQLite
42
- pnpm db:push
41
+ Your production resources are shared with tooling.
43
42
 
44
- # Start all apps in dev mode
45
- pnpm dev
46
- ```
43
+ ---
44
+
45
+ ### Openship
46
+
47
+ **Your machine**
48
+ - Desktop app (UI)
49
+ - Build system (local by default)
50
+ - Deployment control
51
+
52
+ **Your server**
53
+ - Production containers only
54
+
55
+ → No resource contention
56
+ → Predictable performance
57
+ → Clean architecture
58
+
59
+ ---
60
+
61
+ ## Desktop-First Architecture
62
+
63
+ Openship is not a hosted dashboard.
64
+
65
+ It’s a **local control plane for your infrastructure**.
66
+
67
+ - Builds run locally by default
68
+ - Deployments are triggered instantly
69
+ - Works with any VPS or private network
70
+ - No dependency on a remote control layer
71
+
72
+ Your server stays minimal:
73
+ - No CI runners
74
+ - No dashboards
75
+ - No management services
76
+
77
+ Only your apps.
78
+
79
+ ---
80
+
81
+ ## Built-in CI/CD (Without the Overhead)
82
+
83
+ CI/CD is fully integrated — without pipelines to configure.
84
+
85
+ - Deploy on every push
86
+ - Preview environments per branch
87
+ - Staging and production flows
88
+ - Rollbacks built-in
89
+
90
+ You can still use:
91
+ - CLI workflows
92
+ - External CI if needed
93
+ - Server-side builds (optional)
94
+
95
+ Default: simple, fast, local.
96
+
97
+ ---
98
+
99
+ ## Deploy Anywhere
100
+
101
+ - Openship Cloud (managed)
102
+ - Any VPS or bare metal
103
+ - Any provider, any region
104
+ - Multi-server deployments
105
+
106
+ Same app, same flow — everywhere.
107
+
108
+ ---
109
+
110
+ ## Full Backend Support
111
+
112
+ Run complete applications out of the box:
113
+
114
+ - Databases (Postgres, MySQL, MongoDB)
115
+ - Redis / caching
116
+ - Background workers
117
+ - WebSockets
118
+ - APIs
119
+ - Storage
120
+
121
+ Provision and manage everything from the app.
122
+
123
+ ---
124
+
125
+ ## Any Stack
126
+
127
+ If it builds, it ships.
128
+
129
+ - Node.js, Bun, Deno
130
+ - Python, Go, Rust
131
+ - PHP, Ruby, Java, .NET
132
+ - Docker (full control)
133
+ - Monorepos supported
134
+
135
+ No lock-in to a runtime.
136
+
137
+ ---
138
+
139
+ ## Domains & SSL
140
+
141
+ - Automatic SSL (Let's Encrypt)
142
+ - Wildcard domains
143
+ - Unlimited domains
144
+ - Auto-renewal
145
+
146
+ No manual setup.
147
+
148
+ ---
149
+
150
+ ## The Desktop App
47
151
 
48
- This will start:
152
+ Everything in one place:
49
153
 
50
- | App | URL |
51
- | ----------- | ----------------------- |
52
- | Web | http://localhost:3000 |
53
- | Dashboard | http://localhost:3001 |
54
- | API | http://localhost:4000 |
154
+ - One-click deploys
155
+ - Live build logs
156
+ - Real-time metrics
157
+ - Domain & DNS management
158
+ - Database control
159
+ - Backups & restore
160
+ - Scaling controls
55
161
 
56
- ### Self-Hosting with Docker
162
+ Replaces:
163
+ - CI dashboards
164
+ - SSH workflows
165
+ - Manual Docker setup
166
+
167
+ ---
168
+
169
+ ## Developer Interfaces
170
+
171
+ ### CLI
57
172
 
58
173
  ```bash
59
- cp .env.example .env
60
- docker compose up -d
174
+ openship deploy
175
+ openship logs --follow
176
+ openship rollback
177
+ openship domains
61
178
  ```
62
179
 
63
- That's it. Openship will be running at `http://localhost:3001`.
180
+ ---
181
+
182
+ ### REST API
183
+
184
+ Automate everything:
185
+
186
+ - Deployments
187
+ - Projects
188
+ - Domains
189
+ - Logs
64
190
 
65
191
  ---
66
192
 
67
- ## Architecture
193
+ ### MCP (AI / Agent Control)
68
194
 
69
- ```
70
- openship/
71
- ├── apps/
72
- │ ├── web/ # Next.js — Marketing site, landing page, docs, pricing
73
- │ ├── dashboard/ # Next.js — Authenticated deployment dashboard (Vercel-style)
74
- │ ├── api/ # Hono — Core API engine (auth, deployments, billing, webhooks)
75
- │ └── cli/ # TypeScript CLI — `openship deploy` from your terminal
76
-
77
- ├── packages/
78
- │ ├── adapters/ # Deployment adapters (DockerAdapter, OblienAdapter)
79
- │ ├── db/ # Prisma schema + client (SQLite local, Postgres cloud)
80
- │ ├── core/ # Shared types, constants, utilities, error classes
81
- │ └── ui/ # Shared React component library (Tailwind + shadcn style)
82
-
83
- ├── tooling/
84
- │ └── tsconfig/ # Shared TypeScript configurations
85
-
86
- ├── docker-compose.yml
87
- ├── turbo.json
88
- └── pnpm-workspace.yaml
89
- ```
195
+ Expose deployment actions to external agents when needed.
90
196
 
91
- ### API Modules
197
+ ---
198
+
199
+ ## Backups
92
200
 
93
- The API is organized into clean, independent modules:
201
+ - Scheduled backups
202
+ - Databases + volumes
203
+ - One-click restore
204
+ - Export anytime
94
205
 
95
- | Module | Path | Purpose |
96
- | -------------- | ----------------------------- | ---------------------------------------- |
97
- | **Auth** | `modules/auth/` | Registration, login, JWT, sessions |
98
- | **Projects** | `modules/projects/` | CRUD for deployment projects |
99
- | **Deployments**| `modules/deployments/` | Build, deploy, rollback, logs |
100
- | **Domains** | `modules/domains/` | Custom domains, DNS verification, SSL |
101
- | **Billing** | `modules/billing/` | Plans, subscriptions, usage (cloud only) |
102
- | **Webhooks** | `modules/webhooks/` | GitHub/GitLab/Bitbucket push triggers |
103
- | **Health** | `modules/health/` | Health check endpoint for load balancers |
206
+ ---
104
207
 
105
- ### Adapter Pattern
208
+ ## Portability
106
209
 
107
- The **adapter pattern** is what makes Openship platform-agnostic:
210
+ Move anywhere:
108
211
 
109
- - **`DockerAdapter`** Self-hosted. Builds and runs containers on the host machine.
110
- - **`OblienAdapter`** Cloud. Communicates with the Oblien infrastructure API.
212
+ - Cloud self-host
213
+ - VPS VPS
214
+ - Full export/import
111
215
 
112
- The `CLOUD_MODE` environment variable controls which adapter is active. For self-hosted installs, billing is completely disabled.
216
+ No proprietary formats:
217
+ - Standard Docker containers
218
+ - Encrypted transfer via SSH
113
219
 
114
220
  ---
115
221
 
116
- ## Self-Hosting
222
+ ## Built-in Mail Server
117
223
 
118
- Openship is designed to be self-hosted with a single `docker compose up`. The Docker adapter handles all builds and deployments locally on your machine.
224
+ - Unlimited domains
225
+ - Standard email auth (DKIM, SPF, DMARC)
226
+ - No external providers required
119
227
 
120
- **Requirements:** Docker Engine, 2GB RAM minimum.
228
+ ---
229
+
230
+ ## Global CDN
231
+
232
+ - Edge caching
233
+ - Compression (HTTP/3, Brotli)
234
+ - Instant cache purge
235
+
236
+ Works with any deployment.
237
+
238
+ ---
239
+
240
+ ## Scaling
241
+
242
+ ### Cloud
243
+ - Auto-scaling
244
+ - Load balancing
245
+ - Zero config
246
+
247
+ ### Self-hosted
248
+ - Upgrade servers anytime
249
+ - Move workloads without redeploy
250
+ - Multi-node ready
121
251
 
122
252
  ---
123
253
 
124
- ## Cloud
254
+ ## Architecture Comparison
125
255
 
126
- The hosted version at [openship.cloud](https://openship.cloud) adds:
256
+ ### Traditional Tools
127
257
 
128
- - Managed infrastructure via the Oblien adapter
129
- - Subscription billing (Stripe)
130
- - Usage metering (build minutes, bandwidth)
131
- - Team management and SSO
258
+ Server runs:
259
+ - CI/CD
260
+ - Build system
261
+ - Dashboard
262
+ - Reverse proxy
263
+ - Apps
264
+
265
+ → Resource contention
266
+ → Complex setup
132
267
 
133
268
  ---
134
269
 
135
- ## Tech Stack
270
+ ### Openship
271
+
272
+ **Local machine**
273
+ - Builds
274
+ - Control plane
275
+
276
+ **Server**
277
+ - Production containers only
278
+
279
+ → Maximum efficiency
280
+ → Minimal overhead
281
+
282
+ ---
283
+
284
+ ## Why Openship
285
+
286
+ - Desktop-first deployment loop
287
+ - Built-in CI/CD without pipeline overhead
288
+ - No YAML or infra complexity
289
+ - No server-side tooling overhead
290
+ - Works on any Linux server
291
+ - Fully open-source (AGPL-3)
292
+ - No vendor lock-in
293
+
294
+ ---
295
+
296
+ ## Example Flow
297
+
298
+ 1. Connect your repo
299
+ 2. Connect a server (or use cloud)
300
+ 3. Click deploy
301
+
302
+ Under the hood:
303
+ - Build runs locally
304
+ - Production container is shipped
305
+ - App goes live
306
+
307
+ ---
308
+
309
+ ## Philosophy
310
+
311
+ Infrastructure should be:
312
+
313
+ - Local-first
314
+ - Transparent
315
+ - Portable
316
+ - Fully owned
317
+
318
+ Not hidden behind platforms.
319
+ Not tied to pricing models.
320
+ Not dependent on proprietary runtimes.
321
+
322
+ ---
323
+
324
+ ## Open Source
325
+
326
+ - AGPL-3 licensed
327
+ - Fully self-hostable
328
+ - No usage limits
329
+ - Community-driven
330
+
331
+ ---
332
+
333
+ ## Status
334
+
335
+ Production-ready core.
136
336
 
137
- | Layer | Technology |
138
- | ---------- | --------------------------------- |
139
- | Frontend | Next.js 14, React 18, Tailwind |
140
- | API | Hono (edge-compatible) |
141
- | Database | Prisma (SQLite / PostgreSQL) |
142
- | Queue | BullMQ + Redis |
143
- | CLI | Commander.js, TypeScript |
144
- | Monorepo | Turborepo + pnpm workspaces |
145
- | Containers | Docker |
146
- | Billing | Stripe |
337
+ Planned:
338
+ - Multi-node clusters
339
+ - Load balancing UI
340
+ - Private networking
341
+ - Advanced monitoring
342
+ - Visual CI/CD pipelines
147
343
 
148
344
  ---
149
345
 
150
- ## Contributing
346
+ ## Get Started
151
347
 
152
- We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
348
+ - Download the app
349
+ - Connect your repo
350
+ - Deploy in minutes
153
351
 
154
- 1. Fork the repository
155
- 2. Create your feature branch (`git checkout -b feat/amazing-feature`)
156
- 3. Commit your changes (`git commit -m 'feat: add amazing feature'`)
157
- 4. Push to the branch (`git push origin feat/amazing-feature`)
158
- 5. Open a Pull Request
352
+ No lock-in.
353
+ No complexity.
354
+ Full control.
159
355
 
160
356
  ---
161
357
 
162
358
  ## License
163
359
 
164
- [MIT](LICENSE) — Free to use, self-host, and modify. Cloud/SaaS usage requires the AGPL license terms.
360
+ AGPL-3
@@ -1,18 +1,16 @@
1
1
  # ─── Build stage ────────────────────────────────────────
2
- FROM node:20-alpine AS builder
3
- RUN corepack enable && corepack prepare pnpm@9.0.0 --activate
2
+ FROM oven/bun:1 AS builder
4
3
  WORKDIR /app
5
4
 
6
- COPY pnpm-workspace.yaml pnpm-lock.yaml* package.json ./
7
- COPY tooling/ ./tooling/
5
+ COPY package.json bun.lock pnpm-workspace.yaml ./
8
6
  COPY packages/ ./packages/
9
7
  COPY apps/api/ ./apps/api/
10
8
 
11
- RUN pnpm install --frozen-lockfile
12
- RUN pnpm run build --filter=openship-api...
9
+ RUN bun install --frozen-lockfile
10
+ RUN cd apps/api && bun run build
13
11
 
14
12
  # ─── Production stage ──────────────────────────────────
15
- FROM node:20-alpine AS runner
13
+ FROM oven/bun:1-slim AS runner
16
14
  WORKDIR /app
17
15
 
18
16
  COPY --from=builder /app/apps/api/dist ./dist
@@ -21,4 +19,4 @@ COPY --from=builder /app/node_modules ./node_modules
21
19
 
22
20
  ENV NODE_ENV=production
23
21
  EXPOSE 4000
24
- CMD ["node", "dist/index.js"]
22
+ CMD ["bun", "run", "dist/index.js"]
@@ -1,10 +1,11 @@
1
1
  {
2
- "name": "openship-api",
2
+ "name": "@repo/api",
3
3
  "version": "0.1.0",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {
7
- "dev": "tsx watch src/index.ts",
7
+ "dev": "node --env-file=.env --import tsx --watch src/index.ts",
8
+ "dev:saas": "PGLITE_DATA_DIR=$HOME/.openship/data-saas node --env-file=.env.saas --import tsx --watch src/index.ts",
8
9
  "build": "tsup src/index.ts --format esm --dts",
9
10
  "start": "node dist/index.js",
10
11
  "lint": "tsc --noEmit",
@@ -12,26 +13,29 @@
12
13
  "clean": "rm -rf dist .turbo node_modules"
13
14
  },
14
15
  "dependencies": {
15
- "openship-core": "workspace:*",
16
- "openship-db": "workspace:*",
17
- "openship-adapters": "workspace:*",
18
- "@hono/node-server": "^1.11.0",
19
- "hono": "^4.4.0",
20
- "zod": "^3.23.0",
21
- "jsonwebtoken": "^9.0.0",
22
- "bcryptjs": "^2.4.3",
23
- "stripe": "^15.0.0",
24
- "bullmq": "^5.7.0",
25
- "ioredis": "^5.4.0",
26
- "pino": "^9.1.0"
16
+ "@better-auth/drizzle-adapter": "^1.5.4",
17
+ "@hono/node-server": "^1.19.11",
18
+ "@hono/typebox-validator": "^0.3.0",
19
+ "@repo/adapters": "workspace:*",
20
+ "@repo/core": "workspace:*",
21
+ "@repo/db": "workspace:*",
22
+ "@sinclair/typebox": "^0.34.48",
23
+ "better-auth": "^1.5.4",
24
+ "bullmq": "^5.70.4",
25
+ "hono": "^4.12.5",
26
+ "ioredis": "^5.10.0",
27
+ "nodemailer": "^8.0.1",
28
+ "pino": "^10.3.1",
29
+ "stripe": "^20.4.0",
30
+ "yaml": "^2.8.2",
31
+ "zod": "^4.3.6"
27
32
  },
28
33
  "devDependencies": {
29
- "openship-tsconfig": "workspace:*",
30
- "@types/jsonwebtoken": "^9.0.0",
31
- "@types/bcryptjs": "^2.4.0",
32
- "tsx": "^4.11.0",
33
- "tsup": "^8.1.0",
34
- "vitest": "^1.6.0",
35
- "typescript": "^5.4.0"
34
+ "@types/node": "^22.13.0",
35
+ "@types/nodemailer": "^7.0.11",
36
+ "tsup": "^8.5.1",
37
+ "tsx": "^4.21.0",
38
+ "typescript": "^5.9.3",
39
+ "vitest": "^4.0.18"
36
40
  }
37
41
  }
@@ -1,26 +1,69 @@
1
1
  import { Hono } from "hono";
2
2
  import { cors } from "hono/cors";
3
3
  import { logger } from "hono/logger";
4
+ import { env, trustedOrigins } from "./config/env";
5
+ import { errorHandler } from "./middleware/error-handler";
6
+ import { rateLimiter } from "./middleware/rate-limiter";
7
+ import { bootstrapPlatform } from "./lib/controller-helpers";
4
8
 
5
9
  import { authRoutes } from "./modules/auth/auth.routes";
6
10
  import { projectRoutes } from "./modules/projects/project.routes";
7
11
  import { deploymentRoutes } from "./modules/deployments/deployment.routes";
8
12
  import { domainRoutes } from "./modules/domains/domain.routes";
13
+ import { analyticsRoutes } from "./modules/analytics/analytics.routes";
9
14
  import { billingRoutes } from "./modules/billing/billing.routes";
10
15
  import { webhookRoutes } from "./modules/webhooks/webhook.routes";
11
16
  import { healthRoutes } from "./modules/health/health.routes";
17
+ import { githubRoutes } from "./modules/github";
18
+ import { settingsRoutes } from "./modules/settings/settings.routes";
19
+
20
+ /* ---------- Initialize platform (runtime + infra + system) ---------- */
21
+ await bootstrapPlatform();
12
22
 
13
23
  export const app = new Hono();
14
24
 
15
25
  /* ---------- Global middleware ---------- */
26
+ app.use(
27
+ "*",
28
+ cors({
29
+ origin: trustedOrigins,
30
+ credentials: true,
31
+ }),
32
+ );
33
+ app.use("*", errorHandler);
16
34
  app.use("*", logger());
17
- app.use("*", cors());
18
35
 
19
- /* ---------- Module routes ---------- */
36
+ app.use("/api/auth/*", rateLimiter);
37
+
38
+ /* ---------- Shared routes (self-hosted + cloud + desktop) ---------- */
20
39
  app.route("/api/health", healthRoutes);
21
40
  app.route("/api/auth", authRoutes);
22
41
  app.route("/api/projects", projectRoutes);
23
42
  app.route("/api/deployments", deploymentRoutes);
24
43
  app.route("/api/domains", domainRoutes);
25
- app.route("/api/billing", billingRoutes);
26
44
  app.route("/api/webhooks", webhookRoutes);
45
+ app.route("/api/github", githubRoutes);
46
+ app.route("/api/analytics", analyticsRoutes);
47
+ app.route("/api/settings", settingsRoutes);
48
+
49
+ /* ---------- Cloud-only routes (gated by CLOUD_MODE) ---------- */
50
+ if (env.CLOUD_MODE) {
51
+ const { cloudSaasRoutes } = await import("./modules/cloud/cloud.routes");
52
+ app.route("/api/cloud", cloudSaasRoutes);
53
+ app.route("/api/billing", billingRoutes);
54
+ } else {
55
+ /**
56
+ * System routes — filesystem browse, instance setup, user provisioning.
57
+ *
58
+ * Dynamic import: in cloud mode these modules are NEVER loaded into the
59
+ * process. The filesystem controller (node:fs), setup controller
60
+ * (admin user creation), and all their dependencies don't exist in
61
+ * the cloud runtime — not just "protected", but fully absent.
62
+ */
63
+ const { systemRoutes } = await import("./modules/system");
64
+ app.route("/api/system", systemRoutes);
65
+
66
+ /** Cloud account management — connect/disconnect to Openship Cloud */
67
+ const { cloudLocalRoutes } = await import("./modules/cloud/cloud.routes");
68
+ app.route("/api/cloud", cloudLocalRoutes);
69
+ }