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
@@ -0,0 +1,321 @@
1
+ "use client";
2
+
3
+ import React, { useState, useEffect } from "react";
4
+ import { Check, ExternalLink, Settings, AlertCircle } from "lucide-react";
5
+ import { githubApi } from "@/lib/api";
6
+ import { generateIcon } from "@/utils/icons";
7
+ import { handleConnectGithub } from "@/utils/github";
8
+ import { useToast } from "@/context/ToastContext";
9
+ import { SectionContainer } from "@/components/ui/SectionContainer";
10
+
11
+ interface GitHubStatus {
12
+ active: boolean;
13
+ username?: string;
14
+ avatar_url?: string;
15
+ scope?: string;
16
+ connected_at?: string;
17
+ }
18
+
19
+ export default function IntegrationsPage() {
20
+ const [showGithubModal, setShowGithubModal] = useState(false);
21
+ const [githubStatus, setGithubStatus] = useState<GitHubStatus>({ active: false });
22
+ const [loading, setLoading] = useState(true);
23
+ const { showToast } = useToast();
24
+ // Check GitHub connection status on mount
25
+ useEffect(() => {
26
+ checkGithubStatus();
27
+ }, []);
28
+
29
+ const checkGithubStatus = async () => {
30
+ try {
31
+ setLoading(true);
32
+ const response = await githubApi.getStatus();
33
+
34
+ if (response && !response.error) {
35
+ setGithubStatus({
36
+ active: response.connected || false,
37
+ username: response.username || response.login,
38
+ avatar_url: response.avatar_url,
39
+ scope: response.scope,
40
+ connected_at: response.connected_at,
41
+ });
42
+ }
43
+ } catch (error) {
44
+ console.error("Failed to check GitHub status:", error);
45
+ } finally {
46
+ setLoading(false);
47
+ }
48
+ };
49
+
50
+
51
+
52
+ const handleDisconnectGithub = async () => {
53
+ if (!confirm("Are you sure you want to disconnect GitHub? This will revoke all permissions.")) {
54
+ return;
55
+ }
56
+
57
+ try {
58
+ // Call disconnect API
59
+ await githubApi.disconnect();
60
+
61
+ setGithubStatus({ active: false });
62
+ console.log("GitHub disconnected successfully");
63
+ } catch (error) {
64
+ console.error("Failed to disconnect GitHub:", error);
65
+ }
66
+ };
67
+
68
+
69
+ return (
70
+ <div className="min-h-screen bg-[#fafafa]">
71
+ <SectionContainer>
72
+ {/* Header */}
73
+ <div className="mb-8 sm:mb-12 relative">
74
+ <h1
75
+ className="font-bold text-black mb-2 text-2xl sm:text-3xl lg:text-[2.4rem]"
76
+ style={{
77
+ letterSpacing: '-0.5px',
78
+ }}
79
+ >
80
+ Integrations
81
+ </h1>
82
+ <p
83
+ className="text-gray-600 text-sm sm:text-base lg:text-lg"
84
+ style={{ lineHeight: '1.5' }}
85
+ >
86
+ Connect your favorite tools and services to enhance your workflow
87
+ </p>
88
+ {/* Gradient underline */}
89
+ <div
90
+ className="absolute left-0"
91
+ style={{
92
+ bottom: '-1rem',
93
+ width: '80px',
94
+ height: '3px',
95
+ background: 'linear-gradient(90deg, #36b37e, #00c6ff)',
96
+ borderRadius: '30px',
97
+ }}
98
+ ></div>
99
+ </div>
100
+
101
+ {/* GitHub Integration Card */}
102
+ <div
103
+ className="bg-white rounded-[20px] border overflow-hidden transition-all duration-300 mb-6"
104
+ style={{
105
+ boxShadow: '0 8px 25px rgba(0, 0, 0, 0.04)',
106
+ borderColor: '#f0f0f0',
107
+ }}
108
+ onMouseEnter={(e) => {
109
+ e.currentTarget.style.transform = 'translateY(-5px)';
110
+ e.currentTarget.style.boxShadow = '0 15px 30px rgba(0, 0, 0, 0.08)';
111
+ }}
112
+ onMouseLeave={(e) => {
113
+ e.currentTarget.style.transform = 'translateY(0)';
114
+ e.currentTarget.style.boxShadow = '0 8px 25px rgba(0, 0, 0, 0.04)';
115
+ }}
116
+ >
117
+ <div className="p-5 sm:p-8">
118
+ <div className="flex flex-col sm:flex-row items-start justify-between">
119
+ <div className="flex flex-col sm:flex-row items-start gap-4 sm:gap-5 flex-1 w-full">
120
+ {/* GitHub Icon */}
121
+ <div className="w-14 h-14 sm:w-16 sm:h-16 bg-black rounded-2xl flex items-center justify-center flex-shrink-0 shadow-lg">
122
+ <svg className="w-8 h-8 sm:w-9 sm:h-9 text-white" fill="currentColor" viewBox="0 0 24 24">
123
+ <path fillRule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clipRule="evenodd" />
124
+ </svg>
125
+ </div>
126
+
127
+ {/* Content */}
128
+ <div className="flex-1 w-full">
129
+ <div className="flex flex-wrap items-center gap-2 mb-2">
130
+ <h2 className="text-xl sm:text-2xl font-bold text-black">GitHub</h2>
131
+ {githubStatus.active && (
132
+ <span className="inline-flex items-center gap-1.5 px-3 py-1 bg-emerald-500/10 text-emerald-700 text-xs font-semibold rounded-full ring-1 ring-emerald-500/20">
133
+ <Check className="w-3.5 h-3.5" />
134
+ Connected
135
+ </span>
136
+ )}
137
+ </div>
138
+
139
+ <p className="text-sm sm:text-base text-gray-600 mb-5 sm:mb-6 leading-relaxed">
140
+ Deploy repositories, create webhooks, and manage your GitHub projects directly from Oblien.
141
+ </p>
142
+
143
+ {/* Connected Status */}
144
+ {githubStatus.active && githubStatus.username && (
145
+ <div className="bg-gradient-to-br from-gray-50 to-gray-100 rounded-xl p-4 sm:p-5 mb-4 sm:mb-5 border border-gray-200">
146
+ <div className="flex items-center gap-3">
147
+ {githubStatus.avatar_url && (
148
+ <img
149
+ src={githubStatus.avatar_url}
150
+ alt={githubStatus.username}
151
+ className="w-10 h-10 sm:w-12 sm:h-12 rounded-full ring-2 ring-gray-200"
152
+ />
153
+ )}
154
+ <div>
155
+ <p className="text-sm font-semibold text-black">
156
+ @{githubStatus.username}
157
+ </p>
158
+ <p className="text-xs text-gray-500">
159
+ Access: {githubStatus.scope || "Public"}
160
+ </p>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ )}
165
+
166
+ {/* Features List */}
167
+ <div className="grid grid-cols-1 sm:grid-cols-2 gap-2 sm:gap-3 mb-5 sm:mb-6">
168
+ <div className="flex items-center gap-2 text-xs sm:text-sm text-gray-700">
169
+ <div className="w-5 h-5 rounded-full bg-emerald-500/10 flex items-center justify-center ring-1 ring-emerald-500/20 flex-shrink-0">
170
+ <Check className="w-3 h-3 text-emerald-600" />
171
+ </div>
172
+ <span>Import repositories</span>
173
+ </div>
174
+ <div className="flex items-center gap-2 text-xs sm:text-sm text-gray-700">
175
+ <div className="w-5 h-5 rounded-full bg-emerald-500/10 flex items-center justify-center ring-1 ring-emerald-500/20 flex-shrink-0">
176
+ <Check className="w-3 h-3 text-emerald-600" />
177
+ </div>
178
+ <span>Auto deployments</span>
179
+ </div>
180
+ <div className="flex items-center gap-2 text-xs sm:text-sm text-gray-700">
181
+ <div className="w-5 h-5 rounded-full bg-emerald-500/10 flex items-center justify-center ring-1 ring-emerald-500/20 flex-shrink-0">
182
+ <Check className="w-3 h-3 text-emerald-600" />
183
+ </div>
184
+ <span>Branch management</span>
185
+ </div>
186
+ <div className="flex items-center gap-2 text-xs sm:text-sm text-gray-700">
187
+ <div className="w-5 h-5 rounded-full bg-emerald-500/10 flex items-center justify-center ring-1 ring-emerald-500/20 flex-shrink-0">
188
+ <Check className="w-3 h-3 text-emerald-600" />
189
+ </div>
190
+ <span>Organization access</span>
191
+ </div>
192
+ </div>
193
+
194
+ {/* Actions */}
195
+ <div className="flex flex-col sm:flex-row items-stretch sm:items-center gap-3">
196
+ {!githubStatus.active ? (
197
+ <button
198
+ onClick={() => handleConnectGithub(checkGithubStatus, showToast, setLoading)}
199
+ disabled={loading}
200
+ className="px-5 py-2.5 bg-black text-white text-sm font-semibold rounded-xl hover:bg-gray-900 transition-all shadow-sm hover:shadow-md disabled:opacity-50 disabled:cursor-not-allowed w-full sm:w-auto justify-center"
201
+ >
202
+ {loading ? "Checking..." : "Connect GitHub"}
203
+ </button>
204
+ ) : (
205
+ <>
206
+ <button
207
+ onClick={() => handleConnectGithub(checkGithubStatus, showToast, setLoading)}
208
+ className="px-4 py-2.5 border-2 border-gray-200 text-gray-700 hover:text-black hover:border-black text-sm font-semibold rounded-xl transition-all flex items-center justify-center gap-2 w-full sm:w-auto"
209
+ >
210
+ <Settings className="w-4 h-4" />
211
+ Change Permissions
212
+ </button>
213
+ <button
214
+ onClick={handleDisconnectGithub}
215
+ className="px-4 py-2.5 border-2 border-red-200 text-red-700 hover:border-red-600 text-sm font-semibold rounded-xl hover:bg-red-50 transition-all w-full sm:w-auto justify-center"
216
+ >
217
+ Disconnect
218
+ </button>
219
+ </>
220
+ )}
221
+ <a
222
+ href="https://docs.oblien.com/integrations/github"
223
+ target="_blank"
224
+ rel="noopener noreferrer"
225
+ className="text-sm flex items-center justify-center gap-2 font-medium transition-colors text-black/50"
226
+
227
+ >
228
+ Learn more
229
+ {generateIcon('External_link_HtLszLDBXqHilHK674zh2aKoSL7xUhyboAzP.png', 16, 'rgba(0,0,0,0.5)')}
230
+ </a>
231
+ </div>
232
+ </div>
233
+ </div>
234
+ </div>
235
+ </div>
236
+ </div>
237
+
238
+ {/* Coming Soon Section */}
239
+ <div
240
+ className="relative rounded-[20px] sm:rounded-[24px] overflow-hidden border transition-all duration-300 p-6 sm:p-8 lg:p-10"
241
+ style={{
242
+ background: 'linear-gradient(135deg, #fff 0%, #f6faff 100%)',
243
+ boxShadow: '0 15px 40px rgba(0, 0, 0, 0.06)',
244
+ borderColor: '#e6effd',
245
+ }}
246
+ onMouseEnter={(e) => {
247
+ e.currentTarget.style.boxShadow = '0 20px 40px rgba(0, 0, 0, 0.08)';
248
+ }}
249
+ onMouseLeave={(e) => {
250
+ e.currentTarget.style.boxShadow = '0 15px 40px rgba(0, 0, 0, 0.06)';
251
+ }}
252
+ >
253
+ {/* Background decoration */}
254
+ <div
255
+ className="absolute pointer-events-none"
256
+ style={{
257
+ top: '-60px',
258
+ right: '-60px',
259
+ width: '300px',
260
+ height: '300px',
261
+ background: 'radial-gradient(circle, rgba(0, 198, 255, 0.1), transparent 70%)',
262
+ borderRadius: '50%',
263
+ zIndex: 0,
264
+ }}
265
+ ></div>
266
+
267
+ <div className="relative z-10">
268
+ <div className="flex items-center gap-2 mb-4">
269
+ <div
270
+ className="inline-block text-white font-bold text-xs px-3 py-1.5 rounded-full tracking-wide"
271
+ style={{
272
+ background: 'linear-gradient(135deg, #36b37e, #00c6ff)',
273
+ boxShadow: '0 4px 12px rgba(54, 179, 126, 0.25)',
274
+ }}
275
+ >
276
+ COMING SOON
277
+ </div>
278
+ </div>
279
+ <h3 className="text-xl sm:text-2xl font-bold text-black mb-3">More Integrations</h3>
280
+ <p className="text-sm sm:text-base text-gray-600 mb-6 leading-relaxed">
281
+ We're working on adding more integrations to help you build and deploy faster.
282
+ </p>
283
+
284
+ <div className="grid grid-cols-2 sm:grid-cols-2 lg:grid-cols-4 gap-3 sm:gap-4">
285
+ {["GitLab", "Bitbucket", "Slack", "Discord"].map((service, index) => (
286
+ <div
287
+ key={service}
288
+ className="group bg-white/80 backdrop-blur-sm rounded-xl p-4 sm:p-5 border border-gray-200 hover:border-gray-300 transition-all duration-300 relative overflow-hidden"
289
+ style={{
290
+ boxShadow: '0 4px 12px rgba(0, 0, 0, 0.03)',
291
+ }}
292
+ onMouseEnter={(e) => {
293
+ e.currentTarget.style.transform = 'translateY(-3px)';
294
+ e.currentTarget.style.boxShadow = '0 8px 20px rgba(0, 0, 0, 0.06)';
295
+ }}
296
+ onMouseLeave={(e) => {
297
+ e.currentTarget.style.transform = 'translateY(0)';
298
+ e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.03)';
299
+ }}
300
+ >
301
+ <div
302
+ className="absolute bottom-0 left-0 w-full h-0.5 bg-gradient-to-r from-emerald-500 to-cyan-500 scale-x-0 group-hover:scale-x-100 transition-transform origin-left duration-300"
303
+ ></div>
304
+ <p className="text-sm font-bold text-black mb-1">{service}</p>
305
+ <p className="text-xs text-gray-500">Coming soon</p>
306
+ </div>
307
+ ))}
308
+ </div>
309
+ </div>
310
+ </div>
311
+ </SectionContainer>
312
+
313
+ {/* GitHub Permission Modal */}
314
+ {/* <GithubPermissionModal
315
+ isOpen={showGithubModal}
316
+ onClose={() => setShowGithubModal(false)}
317
+ onConnect={handleConnectGithub}
318
+ /> */}
319
+ </div>
320
+ );
321
+ }
@@ -1,37 +1,27 @@
1
+ import { redirect } from "next/navigation";
2
+ import { getSession, getDeploymentInfo } from "@/lib/server/session";
3
+ import { Sidebar } from "@/components/sidebar";
4
+ import { DashboardProviders } from "./providers";
5
+
1
6
  /**
2
- * Dashboard shell layout — sidebar + top bar wrapper.
3
- * All authenticated dashboard pages live under this layout.
7
+ * Dashboard shell layout — sidebar + main area.
8
+ * Session is validated server-side before rendering.
4
9
  */
5
- export default function DashboardLayout({ children }: { children: React.ReactNode }) {
6
- return (
7
- <div className="flex h-screen">
8
- {/* Sidebar */}
9
- <aside className="w-64 shrink-0 border-r bg-gray-50 p-4">
10
- <div className="mb-8 text-lg font-bold">Openship</div>
11
- <nav className="flex flex-col gap-1 text-sm">
12
- <a href="/projects" className="rounded px-3 py-2 hover:bg-gray-200">
13
- Projects
14
- </a>
15
- <a href="/deployments" className="rounded px-3 py-2 hover:bg-gray-200">
16
- Deployments
17
- </a>
18
- <a href="/domains" className="rounded px-3 py-2 hover:bg-gray-200">
19
- Domains
20
- </a>
21
- <a href="/monitoring" className="rounded px-3 py-2 hover:bg-gray-200">
22
- Monitoring
23
- </a>
24
- <a href="/settings" className="rounded px-3 py-2 hover:bg-gray-200">
25
- Settings
26
- </a>
27
- <a href="/billing" className="rounded px-3 py-2 hover:bg-gray-200">
28
- Billing
29
- </a>
30
- </nav>
31
- </aside>
10
+ export default async function DashboardLayout({ children }: { children: React.ReactNode }) {
11
+ const session = await getSession();
12
+ if (!session) redirect("/login");
32
13
 
33
- {/* Main content */}
34
- <main className="flex-1 overflow-y-auto p-6">{children}</main>
35
- </div>
14
+ const deploymentInfo = await getDeploymentInfo();
15
+
16
+ return (
17
+ <DashboardProviders selfHosted={deploymentInfo.selfHosted} deployMode={deploymentInfo.deployMode} authMode={deploymentInfo.authMode} cloudAuthUrl={deploymentInfo.cloudAuthUrl} machineName={deploymentInfo.machineName}>
18
+ <div className="flex h-dvh">
19
+ <Sidebar />
20
+ {/* Main content */}
21
+ <main className="flex-1 overflow-y-auto">
22
+ {children}
23
+ </main>
24
+ </div>
25
+ </DashboardProviders>
36
26
  );
37
27
  }
@@ -0,0 +1,187 @@
1
+ "use client";
2
+
3
+ import React from "react";
4
+ import Link from "next/link";
5
+ import { Github, Loader2, GitBranch } from "lucide-react";
6
+ import type { CliAction } from "@/context/GitHubContext";
7
+
8
+ /* ── Shared SVG illustration ──────────────────────────────────────── */
9
+
10
+ function CardStackSvg() {
11
+ return (
12
+ <svg className="absolute inset-0 w-full h-full" viewBox="0 0 260 180" fill="none">
13
+ <rect x="75" y="45" width="130" height="95" rx="14" fill="var(--th-sf-04)" />
14
+ <rect x="65" y="35" width="130" height="95" rx="14" fill="var(--th-sf-03)" stroke="var(--th-bd-subtle)" strokeWidth="1" />
15
+ <rect x="55" y="25" width="130" height="95" rx="14" fill="var(--th-card-bg)" stroke="var(--th-bd-default)" strokeWidth="1" />
16
+ <rect x="55" y="25" width="130" height="28" rx="14" fill="var(--th-sf-05)" />
17
+ <circle cx="72" cy="39" r="4" fill="#ef4444" fillOpacity="0.6" />
18
+ <circle cx="84" cy="39" r="4" fill="#eab308" fillOpacity="0.6" />
19
+ <circle cx="96" cy="39" r="4" fill="#22c55e" fillOpacity="0.6" />
20
+ <rect x="70" y="65" width="50" height="5" rx="2.5" fill="var(--th-on-12)" />
21
+ <rect x="70" y="76" width="85" height="4" rx="2" fill="var(--th-on-08)" />
22
+ <rect x="70" y="85" width="65" height="4" rx="2" fill="var(--th-on-08)" />
23
+ <circle cx="210" cy="90" r="22" fill="var(--th-on-05)" />
24
+ <circle cx="210" cy="90" r="16" fill="var(--th-card-bg)" stroke="var(--th-on-20)" strokeWidth="2" strokeDasharray="4 3" />
25
+ <path d="M210 82v16M202 90h16" stroke="var(--th-on-40)" strokeWidth="2" strokeLinecap="round" />
26
+ <circle cx="30" cy="60" r="4" fill="var(--th-on-10)" />
27
+ <circle cx="40" cy="140" r="6" fill="var(--th-on-08)" />
28
+ <circle cx="230" cy="40" r="3" fill="var(--th-on-12)" />
29
+ <path d="M185 95 Q 192 92 195 90" stroke="var(--th-on-12)" strokeWidth="1.5" strokeDasharray="3 3" fill="none" />
30
+ </svg>
31
+ );
32
+ }
33
+
34
+ /* ── Connect GitHub prompt ────────────────────────────────────────── */
35
+
36
+ export function ConnectPrompt({
37
+ connecting,
38
+ onConnect,
39
+ cliAction,
40
+ onRefresh,
41
+ }: {
42
+ connecting: boolean;
43
+ onConnect: () => void;
44
+ cliAction: CliAction | null;
45
+ onRefresh: () => void;
46
+ }) {
47
+ // Terminal instruction (e.g. `gh auth login` or env var)
48
+ if (cliAction?.type === "terminal") {
49
+ return (
50
+ <div className="bg-card rounded-2xl border border-border/50">
51
+ <div className="px-6 pb-10 text-center">
52
+ <div className="relative mx-auto w-64 h-44">
53
+ <CardStackSvg />
54
+ </div>
55
+ <h3 className="text-lg font-medium text-foreground/80 mb-2">
56
+ Connect GitHub
57
+ </h3>
58
+ <p className="text-sm text-muted-foreground max-w-md mx-auto mb-4 leading-relaxed">
59
+ {cliAction.message}
60
+ </p>
61
+ <code className="inline-block px-4 py-2.5 bg-muted rounded-lg text-sm font-mono text-foreground mb-6">
62
+ {cliAction.command}
63
+ </code>
64
+ <div className="flex flex-col sm:flex-row items-center justify-center gap-3">
65
+ <button
66
+ onClick={onRefresh}
67
+ className="inline-flex items-center gap-2 px-6 py-3 bg-primary text-primary-foreground text-sm font-medium rounded-xl hover:bg-primary/90 transition-all hover:shadow-lg hover:shadow-primary/25 hover:-translate-y-0.5"
68
+ >
69
+ Check Connection
70
+ </button>
71
+ </div>
72
+ <p className="text-xs text-muted-foreground/60 mt-6">
73
+ After logging in, click &quot;Check Connection&quot; to continue.
74
+ </p>
75
+ </div>
76
+ </div>
77
+ );
78
+ }
79
+
80
+ // CLI: device flow — show verification code
81
+ if (cliAction?.type === "device_flow") {
82
+ return (
83
+ <div className="bg-card rounded-2xl border border-border/50">
84
+ <div className="px-6 pb-10 text-center">
85
+ <div className="relative mx-auto w-64 h-44">
86
+ <CardStackSvg />
87
+ </div>
88
+ <h3 className="text-lg font-medium text-foreground/80 mb-2">
89
+ Enter this code on GitHub
90
+ </h3>
91
+ <code className="inline-block px-6 py-3 bg-muted rounded-lg text-2xl font-mono font-bold tracking-widest text-foreground mb-4">
92
+ {cliAction.userCode}
93
+ </code>
94
+ <p className="text-sm text-muted-foreground max-w-md mx-auto mb-6 leading-relaxed">
95
+ Go to{" "}
96
+ <a
97
+ href={cliAction.verificationUri}
98
+ target="_blank"
99
+ rel="noopener noreferrer"
100
+ className="text-foreground underline underline-offset-2"
101
+ >
102
+ {cliAction.verificationUri}
103
+ </a>
104
+ {" "}and enter the code above.
105
+ </p>
106
+ <div className="flex items-center justify-center gap-2 text-sm text-muted-foreground">
107
+ <Loader2 className="size-4 animate-spin" />
108
+ Waiting for authorization…
109
+ </div>
110
+ </div>
111
+ </div>
112
+ );
113
+ }
114
+
115
+ // Default: standard connect button
116
+ return (
117
+ <div className="bg-card rounded-2xl border border-border/50">
118
+ <div className="px-6 pb-10 text-center">
119
+ <div className="relative mx-auto w-64 h-44">
120
+ <svg className="absolute inset-0 w-full h-full" viewBox="0 0 260 180" fill="none">
121
+ <rect x="75" y="45" width="130" height="95" rx="14" fill="var(--th-sf-04)" />
122
+ <rect x="65" y="35" width="130" height="95" rx="14" fill="var(--th-sf-03)" stroke="var(--th-bd-subtle)" strokeWidth="1" />
123
+ <rect x="55" y="25" width="130" height="95" rx="14" fill="var(--th-card-bg)" stroke="var(--th-bd-default)" strokeWidth="1" />
124
+ <rect x="55" y="25" width="130" height="28" rx="14" fill="var(--th-sf-05)" />
125
+ <circle cx="72" cy="39" r="4" fill="#ef4444" fillOpacity="0.6" />
126
+ <circle cx="84" cy="39" r="4" fill="#eab308" fillOpacity="0.6" />
127
+ <circle cx="96" cy="39" r="4" fill="#22c55e" fillOpacity="0.6" />
128
+ <rect x="70" y="65" width="50" height="5" rx="2.5" fill="var(--th-on-12)" />
129
+ <rect x="70" y="76" width="85" height="4" rx="2" fill="var(--th-on-08)" />
130
+ <rect x="70" y="85" width="65" height="4" rx="2" fill="var(--th-on-08)" />
131
+ <circle cx="85" cy="108" r="9" fill="var(--th-on-05)" stroke="var(--th-on-10)" strokeWidth="1" />
132
+ <path d="M85 102a6 6 0 0 0-1.9 11.7c.3.05.4-.13.4-.3v-1.05c-1.63.35-1.97-.79-1.97-.79a1.55 1.55 0 0 0-.65-.86c-.53-.36.04-.35.04-.35a1.23 1.23 0 0 1 .9.6 1.25 1.25 0 0 0 1.71.49 1.25 1.25 0 0 1 .37-.78c-1.3-.15-2.67-.65-2.67-2.9a2.27 2.27 0 0 1 .6-1.57 2.1 2.1 0 0 1 .06-1.55s.49-.16 1.6.6a5.5 5.5 0 0 1 2.92 0c1.11-.76 1.6-.6 1.6-.6a2.1 2.1 0 0 1 .06 1.55 2.27 2.27 0 0 1 .6 1.57c0 2.26-1.37 2.75-2.68 2.9a1.4 1.4 0 0 1 .4 1.08v1.6c0 .17.1.35.4.3A6 6 0 0 0 85 102z" fill="var(--th-on-20)" />
133
+ <circle cx="210" cy="90" r="22" fill="var(--th-on-05)" />
134
+ <circle cx="210" cy="90" r="16" fill="var(--th-card-bg)" stroke="var(--th-on-20)" strokeWidth="2" strokeDasharray="4 3" />
135
+ <path d="M210 82v16M202 90h16" stroke="var(--th-on-40)" strokeWidth="2" strokeLinecap="round" />
136
+ <circle cx="30" cy="60" r="4" fill="var(--th-on-10)" />
137
+ <circle cx="40" cy="140" r="6" fill="var(--th-on-08)" />
138
+ <circle cx="230" cy="40" r="3" fill="var(--th-on-12)" />
139
+ <circle cx="245" cy="130" r="5" fill="var(--th-on-06)" />
140
+ <path d="M25 100l2-4 2 4-4-2 4 0-4 2z" fill="var(--th-on-16)" />
141
+ <path d="M220 150l1.5-3 1.5 3-3-1.5 3 0-3 1.5z" fill="var(--th-on-12)" />
142
+ <path d="M185 95 Q 192 92 195 90" stroke="var(--th-on-12)" strokeWidth="1.5" strokeDasharray="3 3" fill="none" />
143
+ </svg>
144
+ </div>
145
+
146
+ <h3 className="text-lg font-medium text-foreground/80 mb-2">
147
+ Connect your GitHub account
148
+ </h3>
149
+ <p className="text-sm text-muted-foreground max-w-sm mx-auto mb-8 leading-relaxed">
150
+ Link your GitHub account to browse repositories, deploy with one click,
151
+ and get automatic deployments on every push.
152
+ </p>
153
+
154
+ <div className="flex flex-col sm:flex-row items-center justify-center gap-3">
155
+ <button
156
+ onClick={onConnect}
157
+ disabled={connecting}
158
+ className="inline-flex items-center gap-2 px-6 py-3 bg-primary text-primary-foreground text-sm font-medium rounded-xl hover:bg-primary/90 transition-all hover:shadow-lg hover:shadow-primary/25 hover:-translate-y-0.5 disabled:opacity-50 disabled:cursor-not-allowed"
159
+ >
160
+ {connecting ? (
161
+ <>
162
+ <Loader2 className="size-4 animate-spin" />
163
+ Connecting…
164
+ </>
165
+ ) : (
166
+ <>
167
+ <Github className="size-4" />
168
+ Connect GitHub
169
+ </>
170
+ )}
171
+ </button>
172
+ <Link
173
+ href="/library?tab=template"
174
+ className="inline-flex items-center gap-2 px-6 py-3 bg-muted/50 text-foreground text-sm font-medium rounded-xl hover:bg-muted transition-colors"
175
+ >
176
+ <GitBranch className="size-4" />
177
+ Browse Templates
178
+ </Link>
179
+ </div>
180
+
181
+ <p className="text-xs text-muted-foreground/60 mt-6">
182
+ We request read access to your repositories. You can revoke anytime.
183
+ </p>
184
+ </div>
185
+ </div>
186
+ );
187
+ }