diff --git a/.env.release.example b/.env.release.example new file mode 100644 index 00000000..023478ae --- /dev/null +++ b/.env.release.example @@ -0,0 +1,35 @@ +# Cloudflare R2 release hosting (Wrangler OAuth is used for bucket/bootstrap/upload) +# If left empty, release-local will discover/fill what it can via `npx wrangler`. +R2_ACCOUNT_ID= +R2_BUCKET=agentcompany-updates +R2_PUBLIC_BASE_URL= +AGENTCOMPANY_RELEASE_PREFIX=AC + +# Optional override. When left empty, release-local derives: +# ${R2_PUBLIC_BASE_URL}/${AGENTCOMPANY_RELEASE_PREFIX} +AGENTCOMPANY_UPDATE_URL= + +# Public-release macOS signing / notarization +# Supply either: +# - CSC_LINK= +# - CSC_KEY_PASSWORD= +# or, if you already imported the cert+private-key into Keychain: +# - CSC_NAME=" ()" +CSC_LINK= +CSC_KEY_PASSWORD= +CSC_NAME= + +# Choose one notarization method: +# 1) Apple ID + app-specific password +APPLE_ID= +APPLE_APP_SPECIFIC_PASSWORD= +APPLE_TEAM_ID= + +# 2) App Store Connect API key +APPLE_API_KEY= +APPLE_API_KEY_ID= +APPLE_API_ISSUER= + +# Optional Windows signing +WIN_CSC_LINK= +WIN_CSC_KEY_PASSWORD= diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9cf981ad..cb06b6f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,6 +19,7 @@ concurrency: env: PNPM_VERSION: '10.24.0' NODE_VERSION: '22' + CI_RELEASE_TAG: ci-build-${{ github.run_id }} jobs: # ───────────────────────────────────────────── @@ -37,8 +38,9 @@ jobs: node-version: ${{ env.NODE_VERSION }} cache: pnpm - run: pnpm install --frozen-lockfile + - run: pnpm typecheck - run: pnpm lint - - run: pnpm exec tsc --noEmit --project tsconfig.check.json + - run: pnpm typecheck:all # ───────────────────────────────────────────── # Stage 2: Unit Tests @@ -57,7 +59,8 @@ jobs: node-version: ${{ env.NODE_VERSION }} cache: pnpm - run: pnpm install --frozen-lockfile - - run: pnpm test + - run: pnpm test:unit + - run: pnpm test:integration # ───────────────────────────────────────────── # Stage 3: Build matrix (parallel per platform) @@ -67,6 +70,8 @@ jobs: name: macOS (${{ matrix.arch }}) runs-on: ${{ matrix.runner }} needs: test + permissions: + contents: write strategy: fail-fast: false matrix: @@ -103,26 +108,36 @@ jobs: APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} - - uses: actions/upload-artifact@v4 - with: - name: macos-${{ matrix.arch }} - path: | - build/release/*.dmg - build/release/*.zip - build/release/*.blockmap - build/release/latest-mac.yml - if-no-files-found: error + - name: Upload release files + env: + GH_TOKEN: ${{ github.token }} + run: | + gh release view "$CI_RELEASE_TAG" >/dev/null 2>&1 || \ + gh release create "$CI_RELEASE_TAG" \ + --draft \ + --prerelease \ + --title "CI Build $GITHUB_RUN_ID" \ + --notes "Temporary build artifact transport for Cloudflare publication." \ + --target "$GITHUB_SHA" + gh release upload "$CI_RELEASE_TAG" \ + build/release/*.dmg \ + build/release/*.zip \ + build/release/*.blockmap \ + build/release/latest-mac.yml \ + --clobber build-windows: name: Windows (${{ matrix.arch }}) runs-on: windows-latest needs: test + permissions: + contents: write strategy: fail-fast: false matrix: include: - - arch: x64 - builder_args: --win --x64 + - arch: x64-ia32 + builder_args: --win --x64 --ia32 - arch: arm64 builder_args: --win --arm64 steps: @@ -142,19 +157,30 @@ jobs: env: CSC_LINK: ${{ secrets.WIN_CERTIFICATE_P12_BASE64 }} CSC_KEY_PASSWORD: ${{ secrets.WIN_CERTIFICATE_PASSWORD }} - - uses: actions/upload-artifact@v4 - with: - name: windows-${{ matrix.arch }} - path: | - build/release/*.exe - build/release/*.blockmap - build/release/latest.yml - if-no-files-found: error + - name: Upload release files + shell: bash + env: + GH_TOKEN: ${{ github.token }} + run: | + gh release view "$CI_RELEASE_TAG" >/dev/null 2>&1 || \ + gh release create "$CI_RELEASE_TAG" \ + --draft \ + --prerelease \ + --title "CI Build $GITHUB_RUN_ID" \ + --notes "Temporary build artifact transport for Cloudflare publication." \ + --target "$GITHUB_SHA" + gh release upload "$CI_RELEASE_TAG" \ + build/release/*.exe \ + build/release/*.blockmap \ + build/release/latest.yml \ + --clobber build-linux: name: Linux (${{ matrix.arch }}) runs-on: ubuntu-latest needs: test + permissions: + contents: write strategy: fail-fast: false matrix: @@ -180,17 +206,24 @@ jobs: run: pnpm exec electron-vite build - name: Package run: pnpm exec electron-builder ${{ matrix.builder_args }} --config electron-builder.yml --publish never - - uses: actions/upload-artifact@v4 - with: - name: linux-${{ matrix.arch }} - path: | - build/release/*.AppImage - build/release/*.deb - build/release/*.rpm - build/release/*.snap - build/release/*.blockmap - build/release/latest-linux.yml - if-no-files-found: warn + - name: Upload release files + env: + GH_TOKEN: ${{ github.token }} + run: | + gh release view "$CI_RELEASE_TAG" >/dev/null 2>&1 || \ + gh release create "$CI_RELEASE_TAG" \ + --draft \ + --prerelease \ + --title "CI Build $GITHUB_RUN_ID" \ + --notes "Temporary build artifact transport for Cloudflare publication." \ + --target "$GITHUB_SHA" + gh release upload "$CI_RELEASE_TAG" \ + build/release/*.AppImage \ + build/release/*.deb \ + build/release/*.rpm \ + build/release/*.blockmap \ + build/release/latest-linux.yml \ + --clobber # ───────────────────────────────────────────── # Stage 4: Publish to GitHub Releases diff --git a/.gitignore b/.gitignore index 59c01bca..725b0fe6 100644 --- a/.gitignore +++ b/.gitignore @@ -12,9 +12,11 @@ win-unpacked .claude build .omc +.omx .planning paperclip-reference - +Reference +.pnpm-store # Test artifacts test-results/ playwright-report/ @@ -30,8 +32,11 @@ playwright-report/ # Environment files .env +.env.* .env.local .env.*.local +!.env.example +!.env.release.example # Editor and OS files .DS_Store @@ -55,8 +60,10 @@ oldreference/ # Local design scratch files homepagedesign.html -# Landing page (deployed separately to Cloudflare Pages) -landing/ +# Landing page is part of the repo and should be versioned + +# Boss edition build (contains credentials — never commit) +boss-build/ # Package manager logs npm-debug.log* @@ -65,4 +72,5 @@ yarn-debug.log* yarn-error.log* build/release/AgentCompany-0.4.61-arm64.dmg CLAUDE.md -build/release/AgentCompany-0.4.90-arm64.dmg \ No newline at end of file +build/release/AgentCompany-0.4.90-arm64.dmg +local-release/ diff --git a/README.md b/README.md index f9caa591..46819d5f 100644 --- a/README.md +++ b/README.md @@ -126,12 +126,14 @@ pnpm build:verify pnpm build # Compile + package for current platform → /build/release pnpm build:dir # Compile + unpackaged directory pnpm build:all # Build for all platforms +pnpm release:local # Signed/uploading release pipeline (see docs/release/local-r2.md) ``` - **Targets:** macOS (`.dmg`), Windows (`.exe` / NSIS), Linux (`.AppImage`) - Packaging uses `electron-builder` - Local builds use ad-hoc signing (`CSC_IDENTITY_AUTO_DISCOVERY=false`) - Defaults to `--publish never`; override with `AGENTCOMPANY_ELECTRON_PUBLISH` +- Cloudflare R2 release hosting + auto-update pipeline: `docs/release/local-r2.md` --- diff --git a/build/electron-builder.runtime.json b/build/electron-builder.runtime.json index 201ba300..efe328d4 100644 --- a/build/electron-builder.runtime.json +++ b/build/electron-builder.runtime.json @@ -1,15 +1,16 @@ { - "extends": "/Users/zacharyzhang/Documents/Github/AgentCompany/electron-builder.yml", + "extends": "/project/electron-builder.yml", "directories": { - "output": "/Users/zacharyzhang/Documents/Github/AgentCompany/build/release" + "output": "/project/build/release" }, "extraMetadata": { - "version": "0.4.136" + "version": "0.4.150" }, - "mac": { - "hardenedRuntime": false, - "target": [ - "zip" - ] - } + "electronDist": "/root/.cache/electron", + "publish": [ + { + "provider": "generic", + "url": "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC" + } + ] } diff --git a/build/release/builder-debug.yml b/build/release/builder-debug.yml deleted file mode 100644 index 8f278f53..00000000 --- a/build/release/builder-debug.yml +++ /dev/null @@ -1,22 +0,0 @@ -arm64: - firstOrDefaultFilePatterns: - - '!**/node_modules/**' - - '!assets{,/**/*}' - - '!build/release{,/**/*}' - - out/** - - package.json - - assets/icon.png - - assets/tray-icon*.png - - '!**/*.{iml,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,suo,xproj,cc,d.ts,mk,a,o,obj,forge-meta,pdb}' - - '!**/._*' - - '!**/electron-builder.{yaml,yml,json,json5,toml,ts}' - - '!**/{.git,.hg,.svn,CVS,RCS,SCCS,__pycache__,.DS_Store,thumbs.db,.gitignore,.gitkeep,.gitattributes,.npmignore,.idea,.vs,.flowconfig,.jshintrc,.eslintrc,.circleci,.yarn-integrity,.yarn-metadata.json,yarn-error.log,yarn.lock,package-lock.json,npm-debug.log,pnpm-lock.yaml,bun.lock,bun.lockb,appveyor.yml,.travis.yml,circle.yml,.nyc_output,.husky,.github,electron-builder.env}' - - '!.yarn{,/**/*}' - - '!.editorconfig' - - '!.yarnrc.yml' - nodeModuleFilePatterns: - - '**/*' - - out/** - - package.json - - assets/icon.png - - assets/tray-icon*.png diff --git a/build/release/win-arm64-unpacked/resources/app.asar b/build/release/win-arm64-unpacked/resources/app.asar deleted file mode 100644 index 9fa57580..00000000 Binary files a/build/release/win-arm64-unpacked/resources/app.asar and /dev/null differ diff --git a/builtin-skills/document-process/minimax-docx/.setup.log b/builtin-skills/document-process/minimax-docx/.setup.log new file mode 100644 index 00000000..e69de29b diff --git a/electron-builder.yml b/electron-builder.yml index 289a04af..da409870 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -39,10 +39,8 @@ win: - target: nsis arch: - x64 + - ia32 - arm64 - - target: portable - arch: - - x64 linux: icon: assets/icon.png @@ -58,9 +56,7 @@ linux: - target: rpm arch: - x64 - - target: snap - arch: - - x64 + - arm64 category: Development nsis: @@ -79,8 +75,3 @@ deb: - libatspi2.0-0 - libuuid1 - libsecret-1-0 - -snap: - plugs: - - default - - removable-media diff --git a/eslint.config.mjs b/eslint.config.mjs index d4a25da9..fe588538 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -8,10 +8,17 @@ export default tseslint.config( { ignores: [ "out/**", + "**/out/**", "build/**", "dist/**", "oldreference/**", + "Reference/**", + "boss-build/**", + "builtin-skills/**", "node_modules/**", + "**/node_modules/**", + ".next/**", + "**/.next/**", "test-results/**", "playwright-report/**", "coverage/**", @@ -52,8 +59,10 @@ export default tseslint.config( ], "@typescript-eslint/no-explicit-any": "off", "react-hooks/exhaustive-deps": "warn", + "react-hooks/incompatible-library": "off", "react-hooks/set-state-in-effect": "off", "react-hooks/refs": "off", + "react-hooks/preserve-manual-memoization": "off", }, }, { diff --git a/landing/.gitignore b/landing/.gitignore new file mode 100644 index 00000000..8fec6031 --- /dev/null +++ b/landing/.gitignore @@ -0,0 +1,5 @@ +.next/ +.wrangler/ +out/ +node_modules/ +npm-debug.log* diff --git a/landing/_headers b/landing/_headers new file mode 100644 index 00000000..27e6349e --- /dev/null +++ b/landing/_headers @@ -0,0 +1,21 @@ +/* + Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://static.cloudflareinsights.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data:; connect-src 'self' https://cloudflareinsights.com; base-uri 'self'; form-action 'self'; frame-ancestors 'none' + Permissions-Policy: camera=(), microphone=(), geolocation=() + Referrer-Policy: strict-origin-when-cross-origin + X-Content-Type-Options: nosniff + X-Frame-Options: DENY + +/screenshots/* + Cache-Control: public, max-age=31536000, immutable + +/assets/* + Cache-Control: public, max-age=31536000, immutable + +/_next/static/* + Cache-Control: public, max-age=31536000, immutable + +/favicon.ico + Cache-Control: public, max-age=31536000, immutable + +/icon.png + Cache-Control: public, max-age=31536000, immutable diff --git a/landing/app/globals.css b/landing/app/globals.css new file mode 100644 index 00000000..34da8f6c --- /dev/null +++ b/landing/app/globals.css @@ -0,0 +1,3 @@ +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246/0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246/0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/* +! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com +*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:JetBrains Mono,SF Mono,Roboto Mono,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-4{bottom:1rem}.left-0{left:0}.left-\[15px\]{left:15px}.right-0{right:0}.top-0{top:0}.top-10{top:2.5rem}.z-10{z-index:10}.z-50{z-index:50}.order-1{order:1}.order-2{order:2}.mx-auto{margin-left:auto;margin-right:auto}.-mb-10{margin-bottom:-2.5rem}.mb-1\.5{margin-bottom:.375rem}.mb-12{margin-bottom:3rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-20{margin-bottom:5rem}.mb-24{margin-bottom:6rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.ml-2{margin-left:.5rem}.mt-12{margin-top:3rem}.mt-14{margin-top:3.5rem}.mt-2{margin-top:.5rem}.mt-20{margin-top:5rem}.mt-24{margin-top:6rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-11{height:2.75rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-8{height:2rem}.h-\[340px\]{height:340px}.h-auto{height:auto}.h-full{height:100%}.max-h-0{max-height:0}.max-h-64{max-height:16rem}.max-h-96{max-height:24rem}.w-1\.5{width:.375rem}.w-11{width:2.75rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-8{width:2rem}.w-full{width:100%}.w-px{width:1px}.min-w-\[120px\]{min-width:120px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.rotate-45{--tw-rotate:45deg}.rotate-45,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-12{row-gap:3rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-\[var\(--border\)\]{border-color:var(--border)}.border-transparent{border-color:transparent}.bg-\[\#059669\]{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-\[\#28c840\]{--tw-bg-opacity:1;background-color:rgb(40 200 64/var(--tw-bg-opacity,1))}.bg-\[\#8b5cf6\]{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity,1))}.bg-\[\#ca8a04\]{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.bg-\[\#febc2e\]{--tw-bg-opacity:1;background-color:rgb(254 188 46/var(--tw-bg-opacity,1))}.bg-\[\#ff5f57\]{--tw-bg-opacity:1;background-color:rgb(255 95 87/var(--tw-bg-opacity,1))}.bg-\[var\(--accent\)\]{background-color:var(--accent)}.bg-\[var\(--accent-soft\)\]{background-color:var(--accent-soft)}.bg-\[var\(--bg\)\]{background-color:var(--bg)}.bg-\[var\(--border\)\]{background-color:var(--border)}.bg-\[var\(--cta\)\]{background-color:var(--cta)}.bg-\[var\(--muted-strong\)\]{background-color:var(--muted-strong)}.bg-\[var\(--panel\)\]{background-color:var(--panel)}.bg-\[var\(--panel-soft\)\]{background-color:var(--panel-soft)}.bg-\[var\(--text-on-cta\)\]{background-color:var(--text-on-cta)}.bg-transparent{background-color:transparent}.p-14{padding:3.5rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-10{padding-bottom:2.5rem}.pb-24{padding-bottom:6rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pr-12{padding-right:3rem}.pr-4{padding-right:1rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-16{padding-top:4rem}.pt-32{padding-top:8rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:JetBrains Mono,SF Mono,Roboto Mono,monospace}.font-serif{font-family:Instrument Serif,Georgia,Cambria,Times New Roman,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[17px\]{font-size:17px}.text-\[5rem\]{font-size:5rem}.text-\[clamp\(2\.75rem\2c 2rem\+3\.8vw\2c 5rem\)\]{font-size:clamp(2.75rem,2rem + 3.8vw,5rem)}.text-\[clamp\(2rem\2c 1\.5rem\+2\.5vw\2c 3\.25rem\)\]{font-size:clamp(2rem,1.5rem + 2.5vw,3.25rem)}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-\[1\.08\]{line-height:1.08}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-\[-0\.01em\]{letter-spacing:-.01em}.tracking-\[-0\.02em\]{letter-spacing:-.02em}.tracking-\[0\.25em\]{letter-spacing:.25em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-\[\#059669\]{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.text-\[\#8b5cf6\]{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity,1))}.text-\[\#ca8a04\]{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity,1))}.text-\[var\(--accent\)\]{color:var(--accent)}.text-\[var\(--cta\)\]{color:var(--cta)}.text-\[var\(--muted\)\]{color:var(--muted)}.text-\[var\(--muted-strong\)\]{color:var(--muted-strong)}.text-\[var\(--text\)\]{color:var(--text)}.text-\[var\(--text-on-accent\)\]{color:var(--text-on-accent)}.text-\[var\(--text-on-cta\)\]{color:var(--text-on-cta)}.text-\[var\(--text-on-cta-faint\)\]{color:var(--text-on-cta-faint)}.text-\[var\(--text-on-cta-muted\)\]{color:var(--text-on-cta-muted)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-70{opacity:.7}.opacity-\[0\.03\]{opacity:.03}.opacity-\[0\.07\]{opacity:.07}.shadow-\[0_2px_12px_-2px_var\(--accent\)\]{--tw-shadow:0 2px 12px -2px var(--accent);--tw-shadow-colored:0 2px 12px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_24px_-4px_rgba\(0\2c 0\2c 0\2c 0\.2\)\]{--tw-shadow:0 4px 24px -4px rgba(0,0,0,0.2);--tw-shadow-colored:0 4px 24px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_24px_-4px_var\(--cta\)\2c 0_8px_40px_-12px_var\(--cta\)\]{--tw-shadow:0 4px 24px -4px var(--cta),0 8px 40px -12px var(--cta);--tw-shadow-colored:0 4px 24px -4px var(--tw-shadow-color),0 8px 40px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_32px_-8px_rgba\(0\2c 0\2c 0\2c 0\.1\)\]{--tw-shadow:0 4px 32px -8px rgba(0,0,0,0.1);--tw-shadow-colored:0 4px 32px -8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_8px_40px_-8px_rgba\(0\2c 0\2c 0\2c 0\.1\)\2c 0_24px_80px_-24px_var\(--glow-warm\)\]{--tw-shadow:0 8px 40px -8px rgba(0,0,0,0.1),0 24px 80px -24px var(--glow-warm);--tw-shadow-colored:0 8px 40px -8px var(--tw-shadow-color),0 24px 80px -24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_8px_40px_-8px_rgba\(0\2c 0\2c 0\2c 0\.12\)\2c 0_20px_80px_-20px_var\(--glow-warm\)\]{--tw-shadow:0 8px 40px -8px rgba(0,0,0,0.12),0 20px 80px -20px var(--glow-warm);--tw-shadow-colored:0 8px 40px -8px var(--tw-shadow-color),0 20px 80px -20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgb(0 0 0/0.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-\[cubic-bezier\(0\.16\2c 1\2c 0\.3\2c 1\)\]{transition-timing-function:cubic-bezier(.16,1,.3,1)}.will-change-transform{will-change:transform}:root{--bg:#FBFAF5;--bg-subtle:#FFFFFF;--panel:#FFFFFF;--panel-soft:#F3F2ED;--text:#191919;--muted:#7a7a72;--muted-strong:#565650;--accent:#213448;--accent-hover:#192838;--accent-soft:rgba(33,52,72,0.07);--text-on-accent:#FBFAF5;--cta:#213448;--cta-hover:#192838;--cta-soft:rgba(33,52,72,0.08);--text-on-cta:#FBFAF5;--text-on-cta-muted:rgba(251,250,245,0.75);--text-on-cta-faint:rgba(251,250,245,0.60);--border:rgba(25,25,25,0.08);--glow-warm:rgba(33,52,72,0.07);--glow-accent:rgba(33,52,72,0.05);--section-alt:rgba(33,52,72,0.025)}.dark{--bg:#191919;--bg-subtle:#1e1e1e;--panel:#222222;--panel-soft:#2a2a2a;--text:#FBFAF5;--muted:#8a8a84;--muted-strong:#b8b8b2;--accent:#94B4C1;--accent-hover:#a8c4cf;--accent-soft:rgba(148,180,193,0.12);--text-on-accent:#191919;--cta:#94B4C1;--cta-hover:#a8c4cf;--cta-soft:rgba(148,180,193,0.10);--text-on-cta:#191919;--text-on-cta-muted:rgba(25,25,25,0.75);--text-on-cta-faint:rgba(25,25,25,0.60);--border:rgba(251,250,245,0.08);--glow-warm:rgba(148,180,193,0.06);--glow-accent:rgba(148,180,193,0.04);--section-alt:rgba(148,180,193,0.03)}html{scroll-behavior:smooth}body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;background-color:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;line-height:1.65}::-moz-selection{background-color:var(--accent);color:var(--text-on-accent)}::selection{background-color:var(--accent);color:var(--text-on-accent)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}:focus:not(:focus-visible){outline:none}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--muted)}*{scrollbar-width:thin;scrollbar-color:var(--border) transparent}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:after,:before{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}.last\:mb-0:last-child{margin-bottom:0}.last\:border-b-0:last-child{border-bottom-width:0}.hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.hover\:-translate-y-1\.5:hover,.hover\:scale-\[1\.03\]:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.03\]:hover{--tw-scale-x:1.03;--tw-scale-y:1.03}.hover\:bg-\[var\(--cta-hover\)\]:hover{background-color:var(--cta-hover)}.hover\:bg-\[var\(--panel-soft\)\]:hover{background-color:var(--panel-soft)}.hover\:text-\[var\(--accent\)\]:hover{color:var(--accent)}.hover\:text-\[var\(--text\)\]:hover{color:var(--text)}.hover\:shadow-\[0_8px_40px_-12px_rgba\(0\2c 0\2c 0\2c 0\.12\)\]:hover{--tw-shadow:0 8px 40px -12px rgba(0,0,0,0.12);--tw-shadow-colored:0 8px 40px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-\[0_8px_40px_-8px_rgba\(0\2c 0\2c 0\2c 0\.25\)\]:hover{--tw-shadow:0 8px 40px -8px rgba(0,0,0,0.25);--tw-shadow-colored:0 8px 40px -8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-\[0_8px_48px_-12px_rgba\(0\2c 0\2c 0\2c 0\.15\)\]:hover{--tw-shadow:0 8px 48px -12px rgba(0,0,0,0.15);--tw-shadow-colored:0 8px 48px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus\:fixed:focus{position:fixed}.focus\:left-4:focus{left:1rem}.focus\:top-4:focus{top:1rem}.focus\:z-\[100\]:focus{z-index:100}.focus\:rounded-lg:focus{border-radius:.5rem}.focus\:bg-\[var\(--accent\)\]:focus{background-color:var(--accent)}.focus\:px-4:focus{padding-left:1rem;padding-right:1rem}.focus\:py-2:focus{padding-top:.5rem;padding-bottom:.5rem}.focus\:text-sm:focus{font-size:.875rem;line-height:1.25rem}.focus\:font-medium:focus{font-weight:500}.focus\:text-\[var\(--text-on-accent\)\]:focus{color:var(--text-on-accent)}.active\:scale-\[0\.98\]:active{--tw-scale-x:0.98;--tw-scale-y:0.98}.active\:scale-\[0\.98\]:active,.group:hover .group-hover\:-translate-y-0\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x:0.125rem}.group:hover .group-hover\:scale-\[1\.03\],.group:hover .group-hover\:translate-x-0\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-\[1\.03\]{--tw-scale-x:1.03;--tw-scale-y:1.03}.dark\:text-\[var\(--muted-strong\)\]:is(.dark *){color:var(--muted-strong)}@media (min-width:640px){.sm\:block{display:block}.sm\:inline-flex{display:inline-flex}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:1024px){.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:-mb-12{margin-bottom:-3rem}.lg\:mb-0{margin-bottom:0}.lg\:mb-20{margin-bottom:5rem}.lg\:mb-24{margin-bottom:6rem}.lg\:mb-36{margin-bottom:9rem}.lg\:mt-16{margin-top:4rem}.lg\:mt-24{margin-top:6rem}.lg\:mt-40{margin-top:10rem}.lg\:block{display:block}.lg\:w-64{width:16rem}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:gap-16{gap:4rem}.lg\:gap-20{gap:5rem}.lg\:gap-8{gap:2rem}.lg\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem * var(--tw-space-y-reverse))}.lg\:p-24{padding:6rem}.lg\:p-6{padding:1.5rem}.lg\:p-7{padding:1.75rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-40{padding-top:10rem;padding-bottom:10rem}.lg\:pb-12{padding-bottom:3rem}.lg\:pb-36{padding-bottom:9rem}.lg\:pt-20{padding-top:5rem}.lg\:pt-44{padding-top:11rem}.lg\:text-\[1\.875rem\]{font-size:1.875rem}.lg\:text-\[6rem\]{font-size:6rem}.lg\:text-lg{font-size:1.125rem;line-height:1.75rem}} \ No newline at end of file diff --git a/landing/app/layout.tsx b/landing/app/layout.tsx new file mode 100644 index 00000000..3764c0fd --- /dev/null +++ b/landing/app/layout.tsx @@ -0,0 +1,222 @@ +import type { Metadata } from "next"; +import "./globals.css"; +import { ThemeProvider } from "../components/theme-provider"; + +const description = + "Local-first desktop control plane for autonomous AI companies. Set a goal, let an AI CEO assemble specialists, delegate work, and deliver code, research, content, and operations from your desktop."; + +export const metadata: Metadata = { + metadataBase: new URL("https://agent-company.dev"), + title: "AgentCompany — Launch an Autonomous AI Company in Minutes", + description, + keywords: [ + "AI company", + "autonomous AI agents", + "AI automation", + "multi-agent system", + "AI CEO", + "AI agent orchestration", + "autonomous agents desktop app", + "AI task delegation", + "AI team management", + "AI code generation", + "AI content generation", + "AI research automation", + "self-organizing AI", + "AI workforce", + "Claude Code", + "Codex CLI", + "Gemini CLI", + "multi-agent framework", + "AI company builder", + ], + openGraph: { + title: "AgentCompany — Launch an Autonomous AI Company in Minutes", + description, + url: "https://agent-company.dev/", + siteName: "AgentCompany", + locale: "en_US", + images: [ + { + url: "/screenshots/Dashboard.jpeg", + width: 1920, + height: 1080, + alt: "AgentCompany dashboard showing autonomous AI agents managing a company", + }, + ], + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "AgentCompany — Launch an Autonomous AI Company in Minutes", + description, + images: ["/screenshots/Dashboard.jpeg"], + }, + robots: { + index: true, + follow: true, + }, + icons: { + icon: "/favicon.ico", + apple: "/icon.png", + }, +}; + +const themeScript = ` +(function(){try{var t=localStorage.getItem("agentcompany-theme");if(t==="dark"||(!t&&window.matchMedia("(prefers-color-scheme:dark)").matches)){document.documentElement.classList.add("dark")}}catch(e){}})(); +`; + +const softwareJsonLd = { + "@context": "https://schema.org", + "@type": "SoftwareApplication", + name: "AgentCompany", + applicationCategory: "BusinessApplication", + operatingSystem: "macOS, Windows, Linux", + url: "https://agent-company.dev", + downloadUrl: "https://agent-company.dev/#download", + screenshot: "https://agent-company.dev/screenshots/Dashboard.jpeg", + datePublished: "2026-03-01", + softwareVersion: "1.0", + description, + featureList: [ + "One-click AI company creation", + "Self-organizing AI agent teams", + "Autonomous task management", + "Real-time agent communication", + "Human-in-the-loop approvals", + "AI document generation", + "Multi-connector support (Claude, Codex, Gemini)", + "Cross-platform (macOS, Windows, Linux)", + ], + author: { "@type": "Organization", name: "AgentCompany", url: "https://agent-company.dev" }, +}; + +const organizationJsonLd = { + "@context": "https://schema.org", + "@type": "Organization", + name: "AgentCompany", + url: "https://agent-company.dev", + logo: "https://agent-company.dev/icon.png", +}; + +const howToJsonLd = { + "@context": "https://schema.org", + "@type": "HowTo", + name: "How to Launch an Autonomous AI Company with AgentCompany", + description: "Create a fully autonomous AI company in three steps using the AgentCompany desktop app.", + step: [ + { + "@type": "HowToStep", + position: 1, + name: "Set Your Goal", + text: "Describe the company, its mission, and what you want delivered. Connect your preferred AI runtime.", + }, + { + "@type": "HowToStep", + position: 2, + name: "Agents Self-Organize", + text: "A CEO agent analyzes your goal, hires specialists, creates departments, and delegates the work autonomously.", + }, + { + "@type": "HowToStep", + position: 3, + name: "Collect Results", + text: "Review deliverables, approve critical decisions, and download finished work including code, content, and research.", + }, + ], +}; + +const faqJsonLd = { + "@context": "https://schema.org", + "@type": "FAQPage", + mainEntity: [ + { + "@type": "Question", + name: "What is AgentCompany?", + acceptedAnswer: { + "@type": "Answer", + text: "AgentCompany is a local-first desktop application for launching and operating autonomous AI companies. You define the mission, an AI CEO organizes the team, delegates work, and coordinates delivery across engineering, design, research, and operations.", + }, + }, + { + "@type": "Question", + name: "How do I download AgentCompany?", + acceptedAnswer: { + "@type": "Answer", + text: "Use the download section on the website to choose the installer for your platform. macOS ships as a signed and notarized DMG. Windows and Linux builds are distributed directly from our Cloudflare release host.", + }, + }, + { + "@type": "Question", + name: "What platforms does AgentCompany support?", + acceptedAnswer: { + "@type": "Answer", + text: "AgentCompany is available on macOS, Windows, and Linux. It is built with Electron and runs natively on all three platforms with full feature parity.", + }, + }, + { + "@type": "Question", + name: "What AI models can AgentCompany use?", + acceptedAnswer: { + "@type": "Answer", + text: "AgentCompany supports multiple AI runtimes as first-class connectors: Claude Code, Codex CLI, and Gemini CLI. You can connect your preferred provider during setup.", + }, + }, + { + "@type": "Question", + name: "How does the AI CEO work?", + acceptedAnswer: { + "@type": "Answer", + text: "When you create a company with a goal, the AI CEO agent analyzes the objective, creates the necessary departments, hires specialized agents for each role, builds an org chart, and delegates tasks. The CEO monitors progress, handles blockers, and coordinates cross-department work.", + }, + }, + { + "@type": "Question", + name: "Is my data private? Does it leave my machine?", + acceptedAnswer: { + "@type": "Answer", + text: "AgentCompany is local-first. All data is stored in a local SQLite database on your machine. Secrets are encrypted via an OS-level keychain. The only external communication is between your machine and your AI provider's API.", + }, + }, + { + "@type": "Question", + name: "What can an AI company actually deliver?", + acceptedAnswer: { + "@type": "Answer", + text: "AI companies built with AgentCompany can produce code, content, research, business documents, and more. The deliverables depend on the goal you set and the AI runtime you connect.", + }, + }, + { + "@type": "Question", + name: "How are updates delivered?", + acceptedAnswer: { + "@type": "Answer", + text: "Desktop updates are published to a Cloudflare-hosted release lane. macOS builds include the signed update metadata required for in-app update checks, while Windows and Linux builds are delivered from the same release host for manual installation.", + }, + }, + ], +}; + +export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { + return ( + + + + + + +