diff --git a/.github/workflows/tauri-release.yml b/.github/workflows/tauri-release.yml index f1eb86c..1ccea35 100644 --- a/.github/workflows/tauri-release.yml +++ b/.github/workflows/tauri-release.yml @@ -30,30 +30,14 @@ jobs: strategy: fail-fast: false matrix: - platform: [windows, macos, linux] + platform: [windows] include: - platform: windows os: windows-latest - - platform: macos - os: macos-latest - - platform: linux - os: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - - name: Install Linux system deps - if: matrix.platform == 'linux' - run: | - sudo apt-get update - sudo apt-get install -y \ - pkg-config \ - libglib2.0-dev \ - libgtk-3-dev \ - librsvg2-dev \ - libayatana-appindicator3-dev \ - libwebkit2gtk-4.1-dev || sudo apt-get install -y libwebkit2gtk-4.0-dev - - name: Install Rust uses: dtolnay/rust-toolchain@stable diff --git a/.gitignore b/.gitignore index 62ebd70..703b4a4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ package-lock.json pnpm-lock.yaml yarn.lock bun.lockb +backend-plan.md +frontend-plan.md +PLAN.md diff --git a/README.md b/README.md index 4bb4ebd..119f483 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,12 @@ Build faster. Control everything. Work from one environment. --- +## ⬇️ Download + +Download **maxc_v0.1.1**: + +[![Windows](https://img.shields.io/badge/Windows-MSI-0078D6?logo=windows&logoColor=white)](https://github.com/Pollux-Studio/maxc/releases/tag/v0.1.1) + ## ✨ Overview **maxc** is an open source developer workspace that brings **terminals, browser automation, logs, and task orchestration into one unified environment**. @@ -203,40 +209,40 @@ maxc uses a modular architecture designed for performance and extensibility. maxc/ core/ - workspace_manager - pane_manager - surface_manager + workspace_manager # workspace lifecycle + state + pane_manager # split panes + layout state + surface_manager # tabs/surfaces + routing terminal/ - conpty_engine - terminal_parser - terminal_renderer + conpty_engine # Windows PTY integration + terminal_parser # VT parsing + buffer model + terminal_renderer # terminal render pipeline browser/ - chromium_runtime - playwright_driver - dom_controller - automation_api + chromium_runtime # embedded Chromium runtime + playwright_driver # browser automation driver + dom_controller # DOM interaction layer + automation_api # browser RPC/commands automation/ - rpc_server - command_dispatcher - socket_protocol + rpc_server # JSON-RPC server + command_dispatcher # RPC method routing + socket_protocol # transport + protocol ui/ - window_manager - layout_engine - sidebar - surface_tabs + window_manager # top-level window system + layout_engine # pane/surface layout + sidebar # workspace + metadata sidebar + surface_tabs # tab strip + surface switching notifications/ - desktop_notifications + desktop_notifications # native notifications cli/ - command_parser + command_parser # CLI parsing + commands config/ - configuration_loader + configuration_loader # config files + defaults ``` ## 🖥 Terminal Engine @@ -402,45 +408,22 @@ maxc is built with modern systems technologies. * Clap CLI framework * Serde JSON RPC -## 🗺 Development Roadmap - -### Phase 1 - -Core workspace foundations - -* terminal + browser surface models -* pane splitting -* surface tabs - -### Phase 2 - -Workspace manager - -* sidebar -* workspace switching -* CLI control - -### Phase 3 - -Browser surfaces - -* embedded browser -* DOM automation +## 📦 v0.1.2 Roadmap -### Phase 4 +Roadmap: -Automation API +* Update installer fix +* Initial install backend not started fix -* socket RPC server -* command dispatcher +Improvements: -### Phase 5 +* Settings UI improved +* App icon improved -Notifications and metadata +Added: -* status indicators -* progress tracking -* sidebar logs +* Logs page added +* Shortcut customization added ## 📚 Documentation @@ -461,7 +444,7 @@ Ways to contribute: maxc is released as **Free and Open Source Software (FOSS)**. -License details will be added in the LICENSE file. +License: [Apache-2.0](LICENSE). ## ❤️ Final Words diff --git a/maxc-landing-page/.gitignore b/maxc-landing-page/.gitignore new file mode 100644 index 0000000..c4ea510 --- /dev/null +++ b/maxc-landing-page/.gitignore @@ -0,0 +1,43 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +.vercel diff --git a/maxc-landing-page/README.md b/maxc-landing-page/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/maxc-landing-page/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/maxc-landing-page/app/docs/page.tsx b/maxc-landing-page/app/docs/page.tsx new file mode 100644 index 0000000..a9398b7 --- /dev/null +++ b/maxc-landing-page/app/docs/page.tsx @@ -0,0 +1,107 @@ +import Link from "next/link"; +import { Navbar } from "@/components/landing/navbar"; +import { Footer } from "@/components/landing/footer"; + +export default function DocsPage() { + return ( +
+ + +
+
+
+

Docs

+ + Stable + +
+

+ Everything you need to run maxc locally, automate it with the CLI, and wire it into your agent workflows. +

+
+
+ +
+
+

Quick Start

+

+ Install the desktop app, open a workspace, and attach terminals or browsers in seconds. +

+
+
Steps
+
    +
  1. 1. Download the installer for your OS.
  2. +
  3. 2. Launch maxc and create a workspace.
  4. +
  5. 3. Spawn a terminal or browser surface.
  6. +
+
+
+ +
+

CLI

+

+ Control every surface programmatically with one-line commands. +

+
+
+              $ maxc terminal spawn
+              {"\n"}
+              $ maxc browser open http://localhost:3000
+              {"\n"}
+              $ maxc notify --title "Done" --level success
+            
+
+
+
+ +
+
+

RPC

+

+ Use JSON-RPC to drive workspaces and surfaces from any agent or script. +

+
+
+              {"{"}
+              {"\n"}  "id": "req-1",
+              {"\n"}  "method": "workspace.list",
+              {"\n"}  "params": {}
+              {"\n"}{"}"}
+            
+
+
+ +
+

Configuration

+

+ Tune fonts, scrollback, and workspace defaults through the config file. +

+
+
+              font-family = "JetBrains Mono"
+              {"\n"}font-size = 14
+              {"\n"}scrollback-limit = 50000
+            
+
+
+
+ +
+
+

Downloads

+

+ Grab the latest stable installer from the downloads page. +

+ + Go to Downloads + +
+
+ +
+ ); +} diff --git a/maxc-landing-page/app/downloads/page.tsx b/maxc-landing-page/app/downloads/page.tsx new file mode 100644 index 0000000..df47918 --- /dev/null +++ b/maxc-landing-page/app/downloads/page.tsx @@ -0,0 +1,182 @@ +import Image from "next/image"; +import { Navbar } from "@/components/landing/navbar"; +import { Footer } from "@/components/landing/footer"; + +export const dynamic = "force-dynamic"; + +type PlatformEntry = { + signature: string; + url: string; +}; + +type LatestJson = { + version: string; + notes: string; + pub_date: string; + platforms: Record; +}; + +type Asset = { + name: string; + url: string; + signature: string; + platformKey: string; +}; + +const latestJsonUrl = + "https://github.com/Pollux-Studio/maxc/releases/download/stable/latest.json"; + +const getFileName = (url: string) => { + const parts = url.split("/"); + return parts[parts.length - 1] || url; +}; + +const formatDate = (value: string) => { + const date = new Date(value); + if (Number.isNaN(date.getTime())) return value; + return date.toLocaleString("en-US", { dateStyle: "medium", timeStyle: "short" }); +}; + +const dedupeByUrl = (assets: Asset[]) => { + const map = new Map(); + for (const asset of assets) { + if (!map.has(asset.url)) { + map.set(asset.url, asset); + } + } + return Array.from(map.values()); +}; + +const getPlatformLabel = (platformKey: string) => + platformKey.replace(/-/g, " ").replace(/_/g, " ").trim(); + +function WindowsLogo({ className }: { className?: string }) { + return ( + + ); +} + +function AssetRow({ asset }: { asset: Asset }) { + return ( +
+
+
+
{asset.name}
+
{getPlatformLabel(asset.platformKey)}
+
+ + Download + +
+
+ ); +} + +export default async function DownloadsPage() { + const response = await fetch(latestJsonUrl, { cache: "no-store" }); + const latest = (await response.json()) as LatestJson; + + const assets = dedupeByUrl( + Object.entries(latest.platforms).map(([platformKey, entry]) => ({ + name: getFileName(entry.url), + url: entry.url, + signature: entry.signature, + platformKey, + })) + ); + + const windowsAssets = assets.filter((asset) => asset.platformKey.startsWith("windows")); + const macAssets = assets.filter((asset) => asset.platformKey.startsWith("darwin")); + const linuxAssets = assets.filter((asset) => asset.platformKey.startsWith("linux")); + + return ( +
+ + +
+
+
+

Downloads

+ + Latest + +
+
+ maxc stable · version {latest.version} · published {formatDate(latest.pub_date)} +
+
{latest.notes}
+
+
+ +
+
+
+
+ +
Windows
+
+
x64
+
+ {windowsAssets.map((asset) => ( + + ))} +
+
+ +
+
+ Apple +
macOS
+
+
Apple Silicon
+
+ {macAssets.map((asset) => ( + + ))} +
+
+ +
+
+ Linux +
Linux
+
+
AppImage, DEB, RPM
+
+ {linuxAssets.map((asset) => ( + + ))} +
+
+
+
+ +
+
+ ); +} diff --git a/maxc-landing-page/app/examples/page.tsx b/maxc-landing-page/app/examples/page.tsx new file mode 100644 index 0000000..ef02867 --- /dev/null +++ b/maxc-landing-page/app/examples/page.tsx @@ -0,0 +1,45 @@ +import { Navbar } from "@/components/landing/navbar"; +import { Footer } from "@/components/landing/footer"; + +const examples = [ + { + title: "Automated test runner", + desc: "Spawn a terminal, run test suites, and notify agents on completion.", + }, + { + title: "Browser regression sweep", + desc: "Open Chromium, execute scripted flows, and capture screenshots.", + }, + { + title: "Agent-driven build pipeline", + desc: "Coordinate multiple AI agents to compile, lint, and deploy.", + }, +]; + +export default function ExamplesPage() { + return ( +
+ + +
+
+

Examples

+

+ Practical workflows that show how maxc automates terminals, browsers, and AI agents. +

+
+
+ +
+ {examples.map((example, index) => ( +
+

{example.title}

+

{example.desc}

+
+ ))} +
+ +
+
+ ); +} diff --git a/maxc-landing-page/app/favicon.ico b/maxc-landing-page/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/maxc-landing-page/app/favicon.ico differ diff --git a/maxc-landing-page/app/github/page.tsx b/maxc-landing-page/app/github/page.tsx new file mode 100644 index 0000000..07a48fb --- /dev/null +++ b/maxc-landing-page/app/github/page.tsx @@ -0,0 +1,29 @@ +import { Navbar } from "@/components/landing/navbar"; +import { Footer } from "@/components/landing/footer"; + +export default function GitHubPage() { + return ( +
+ + +
+
+

GitHub

+

+ Explore the maxc source code, releases, and contribution guides on GitHub. +

+ + Visit GitHub + +
+
+ +
+
+ ); +} diff --git a/maxc-landing-page/app/globals.css b/maxc-landing-page/app/globals.css new file mode 100644 index 0000000..4c90598 --- /dev/null +++ b/maxc-landing-page/app/globals.css @@ -0,0 +1,196 @@ +@import "tailwindcss"; +@import "tw-animate-css"; +@import "shadcn/tailwind.css"; + +@custom-variant dark (&:is(.dark *)); + +:root { + --muted: oklch(0.97 0 0); + --card: oklch(1 0 0); + --border: oklch(0.922 0 0); + --accent: oklch(0.97 0 0); + --accent-strong: #ffffff; + --accent-foreground: oklch(0.205 0 0); + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted-foreground: oklch(0.556 0 0); + --destructive: oklch(0.577 0.245 27.325); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.809 0.105 251.813); + --chart-2: oklch(0.623 0.214 259.815); + --chart-3: oklch(0.546 0.245 262.881); + --chart-4: oklch(0.488 0.243 264.376); + --chart-5: oklch(0.424 0.199 265.638); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); + + --color-nickel: rgba(255, 255, 255, 0.08); + --color-slate-bg: #0f1117; + --color-grey: rgba(255, 255, 255, 0.45); + --color-stroke: rgba(255, 255, 255, 0.08); +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-sans); + --font-mono: var(--font-jetbrains); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) * 0.6); + --radius-md: calc(var(--radius) * 0.8); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) * 1.4); + --radius-2xl: calc(var(--radius) * 1.8); + --radius-3xl: calc(var(--radius) * 2.2); + --radius-4xl: calc(var(--radius) * 2.6); +} + +body { + font-family: var(--font-space), system-ui, sans-serif; +} + +::selection { + background: rgba(255, 255, 255, 0.2); +} + +/* Scrollbar */ +* { + scrollbar-width: thin; + scrollbar-color: rgba(255, 255, 255, 0.2) rgba(8, 6, 13, 0.2); +} + +*::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +*::-webkit-scrollbar-track { + background: #0b0d12; +} + +*::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.18); + border-radius: 999px; + border: 2px solid #0b0d12; +} + +*::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.3); +} + +/* ---- Vite-style wrapper ---- */ +.wrapper { + max-width: 1280px; + margin-left: auto; + margin-right: auto; +} + +.wrapper--ticks { + border-left: 1px solid var(--color-nickel); + border-right: 1px solid var(--color-nickel); +} + +.border-nickel { + border-color: var(--color-nickel); +} + +.divide-nickel > :not([hidden]) ~ :not([hidden]) { + border-color: var(--color-nickel); +} + +.text-grey { + color: var(--color-grey); +} + +.bg-slate-custom { + background-color: var(--color-slate-bg); +} + +.dark { + --background: #08060d; + --foreground: oklch(0.985 0 0); + --card: #0f1117; + --card-foreground: oklch(0.985 0 0); + --popover: #0f1117; + --popover-foreground: oklch(0.985 0 0); + --primary: #08060d; + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: var(--color-nickel); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.809 0.105 251.813); + --chart-2: oklch(0.623 0.214 259.815); + --chart-3: oklch(0.546 0.245 262.881); + --chart-4: oklch(0.488 0.243 264.376); + --chart-5: oklch(0.424 0.199 265.638); + --sidebar: #0f1117; + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: var(--color-nickel); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } + html { + @apply font-sans; + } +} diff --git a/maxc-landing-page/app/layout.tsx b/maxc-landing-page/app/layout.tsx new file mode 100644 index 0000000..efaf2f2 --- /dev/null +++ b/maxc-landing-page/app/layout.tsx @@ -0,0 +1,92 @@ +import type { Metadata } from "next"; +import { JetBrains_Mono, Space_Grotesk, Geist } from "next/font/google"; +import { Analytics } from "@vercel/analytics/next"; +import "./globals.css"; +import { cn } from "@/lib/utils"; + +const geist = Geist({subsets:['latin'],variable:'--font-sans'}); + +const spaceGrotesk = Space_Grotesk({ + variable: "--font-space", + subsets: ["latin"], +}); + +const jetbrainsMono = JetBrains_Mono({ + variable: "--font-jetbrains", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + metadataBase: new URL("https://maxc.polluxstudio.in"), + title: "maxc - Workspace for AI Coding Agents", + description: + "maxc is a programmable workspace for AI coding agents. Run terminals, automate browsers, and orchestrate AI agents from one developer environment.", + keywords: [ + "AI coding agents", + "developer automation tools", + "terminal workspace", + "browser automation tools", + "AI development environment", + "agent orchestration", + "developer productivity tools", + ], + openGraph: { + title: "maxc - Control Center for AI Coding Agents", + description: + "Run terminals, control browsers, and orchestrate AI agents from one programmable workspace.", + url: "https://maxc.polluxstudio.in", + siteName: "maxc", + images: [ + { + url: "https://maxc.polluxstudio.in/og-image.png", + width: 1200, + height: 630, + alt: "maxc - Control Center for AI Coding Agents", + }, + ], + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "maxc - AI Coding Agent Workspace", + description: "Run terminals, browsers, and AI agents in one programmable workspace.", + images: ["https://maxc.polluxstudio.in/og-image.png"], + }, + icons: { + icon: "/maxc_logo_full_white_single.svg", + }, +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + const structuredData = { + "@context": "https://schema.org", + "@type": "SoftwareApplication", + name: "maxc", + applicationCategory: "DeveloperApplication", + description: + "maxc is a programmable workspace for AI coding agents that allows developers to run terminals, automate browsers, and orchestrate agent workflows.", + operatingSystem: ["Windows", "macOS", "Linux"], + url: "https://maxc.polluxstudio.in", + }; + + return ( + + +