{"_id":"@byfungsi/funforge","_rev":"6-7724ce5e25264ac85a21d7bc3e8aac27","name":"@byfungsi/funforge","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@byfungsi/funforge","version":"0.1.0","keywords":["cli","deploy","funforge","fungsi","mcp"],"author":{"name":"Fungsi"},"license":"MIT","_id":"@byfungsi/funforge@0.1.0","maintainers":[{"name":"hanipcode","email":"hanifeij@yahoo.co.id"}],"bin":{"funforge":"dist/cli.js","funforge-mcp":"dist/mcp.js"},"dist":{"shasum":"31e5f2f291ee621688894f0ec8a2159a5db32c21","tarball":"https://registry.npmjs.org/@byfungsi/funforge/-/funforge-0.1.0.tgz","fileCount":59,"integrity":"sha512-3im6OGUUuM3X+qVG2EXl3GmjGRC27OREtHWACdaMAWG+DAvPPXH+3hAX1uMAIQroOP/7R0D/KUjKceXGBRtaiA==","signatures":[{"sig":"MEYCIQDrV4BFRNpk6TkTfTrlVz73oi3ifdfd5nN8vZXFCdqOZQIhAKZqoFan7bDyadsgmZdSDkPCn6kiXmw/Fg+FssiylFGg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131821},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"642cab80cda35882896cd03297744c58bacc2059","scripts":{"dev":"tsc --watch","mcp":"node dist/mcp.js","test":"vitest run","build":"tsc","start":"node dist/cli.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"hanipcode","email":"hanifeij@yahoo.co.id"},"_npmVersion":"10.9.3","description":"Deploy without git, without leaving your editor","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.2.0","tar":"^7.4.3","zod":"^3.25.34","conf":"^13.1.0","glob":"^11.0.1","open":"^10.1.0","chalk":"^5.4.1","ignore":"^7.0.4","commander":"^13.1.0","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","@types/tar":"^6.1.13","typescript":"^5.0.0","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/funforge_0.1.0_1768477179639_0.8774163725645143","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@byfungsi/funforge","version":"0.2.0","keywords":["cli","deploy","funforge","fungsi","mcp"],"author":{"name":"Fungsi"},"license":"MIT","_id":"@byfungsi/funforge@0.2.0","maintainers":[{"name":"hanipcode","email":"hanifeij@yahoo.co.id"}],"bin":{"funforge":"dist/cli.js","funforge-mcp":"dist/mcp.js"},"dist":{"shasum":"f5c32609932d382b6b47ceb48b140c645a1b6fc4","tarball":"https://registry.npmjs.org/@byfungsi/funforge/-/funforge-0.2.0.tgz","fileCount":59,"integrity":"sha512-h06gG/bPrHIKnjs7OOT6cXTcLWOwGi3HOa4ThU1Zpy8btxzipcarD2Q2Bd5XTrp/2QDv1uOQIGUZd6pAOZqGng==","signatures":[{"sig":"MEQCIBz1B5I5rFmX3nRrZxvA56+aie7usx89LKOHCaE3OF8oAiAPV7KIsAIO+gkDY61BwGMp0ieQq86aZUK3rHFQJzdPbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132924},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"fc6c9db29bbf24e8c6c692675631ab2eb53d8d66","scripts":{"dev":"tsc --watch","mcp":"node dist/mcp.js","test":"vitest run","build":"tsc","start":"node dist/cli.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"hanipcode","email":"hanifeij@yahoo.co.id"},"_npmVersion":"10.9.3","description":"Deploy without git, without leaving your editor","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.2.0","tar":"^7.4.3","zod":"^3.25.34","conf":"^13.1.0","glob":"^11.0.1","open":"^10.1.0","chalk":"^5.4.1","ignore":"^7.0.4","commander":"^13.1.0","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","@types/tar":"^6.1.13","typescript":"^5.0.0","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/funforge_0.2.0_1768482004470_0.9497041988825929","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@byfungsi/funforge","version":"0.2.2","keywords":["cli","deploy","funforge","fungsi","mcp"],"author":{"name":"Fungsi"},"license":"MIT","_id":"@byfungsi/funforge@0.2.2","maintainers":[{"name":"hanipcode","email":"hanifeij@yahoo.co.id"}],"bin":{"funforge":"dist/cli.js","funforge-mcp":"dist/mcp.js"},"dist":{"shasum":"f949ddefca1fdfc8e65e5899fd4e6923a7ed274e","tarball":"https://registry.npmjs.org/@byfungsi/funforge/-/funforge-0.2.2.tgz","fileCount":62,"integrity":"sha512-CbNhlrsPSMjlA1nGVFz3CiAFbMpo9mb4NPLzTAMXNvJw1pPShrgeVzepjeTw5NqFiRmy1ZLwSyToQh3NKeDveg==","signatures":[{"sig":"MEQCICxYniFhza/zMhXBEq4issVwdnQHDPfdjz8l0hkYBiw6AiBR9beKbOBrPyFlkmprNWoPNx/vE6qXqdfYC9txlKtYsw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135499},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"18030d6d52f78eb4f7f155cd88270677af2540d2","scripts":{"dev":"tsc --watch","mcp":"node dist/mcp.js","test":"vitest run","build":"tsc","start":"node dist/cli.js","typecheck":"tsc --noEmit","release:dry":"pnpm run build && pnpm run test && npm publish --access public --dry-run","release:major":"npm version major --no-git-tag-version && pnpm run release:publish","release:minor":"npm version minor --no-git-tag-version && pnpm run release:publish","release:patch":"npm version patch --no-git-tag-version && pnpm run release:publish","release:publish":"pnpm run build && pnpm run test && npm publish --access public"},"_npmUser":{"name":"hanipcode","email":"hanifeij@yahoo.co.id"},"_npmVersion":"10.9.3","description":"Deploy without git, without leaving your editor","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.2.0","tar":"^7.4.3","zod":"^3.25.34","conf":"^13.1.0","glob":"^11.0.1","open":"^10.1.0","chalk":"^5.4.1","ignore":"^7.0.4","commander":"^13.1.0","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","@types/tar":"^6.1.13","typescript":"^5.0.0","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/funforge_0.2.2_1768487589882_0.8971606947907482","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@byfungsi/funforge","version":"0.2.3","keywords":["cli","deploy","funforge","fungsi","mcp"],"author":{"name":"Fungsi"},"license":"MIT","_id":"@byfungsi/funforge@0.2.3","maintainers":[{"name":"hanipcode","email":"hanifeij@yahoo.co.id"}],"bin":{"funforge":"dist/cli.js","funforge-mcp":"dist/mcp.js"},"dist":{"shasum":"406b5a9b8bd8d22d86ab466b12084eb46fd0332c","tarball":"https://registry.npmjs.org/@byfungsi/funforge/-/funforge-0.2.3.tgz","fileCount":65,"integrity":"sha512-8oTGjGw5j2WenRyV+sIr4rb00Kp3XwWhYQDsOXc4TAgXCTEiw2G8OKz5eFUVRVZ3CrW5zAEmtpz+xg6L+OQRuw==","signatures":[{"sig":"MEYCIQCKTkBMZjwkyaXW0ef7eqj7j1UbZSfNGNaL7jgvxU/7gAIhAPKmEjdFRARK2qkHFRvJhqt7pfN2+JDaab8unDyxyFVV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144495},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"6f8745e68957c80c96dc47d10e25e16783c6b3dc","scripts":{"dev":"tsc --watch","mcp":"node dist/mcp.js","test":"vitest run","build":"tsc","start":"node dist/cli.js","typecheck":"tsc --noEmit","release:dry":"pnpm run build && pnpm run test && npm publish --access public --dry-run","release:major":"npm version major --no-git-tag-version && pnpm run release:publish","release:minor":"npm version minor --no-git-tag-version && pnpm run release:publish","release:patch":"npm version patch --no-git-tag-version && pnpm run release:publish","release:publish":"pnpm run build && pnpm run test && npm publish --access public"},"_npmUser":{"name":"hanipcode","email":"hanifeij@yahoo.co.id"},"_npmVersion":"10.9.3","description":"Deploy without git, without leaving your editor","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.2.0","tar":"^7.4.3","zod":"^3.25.34","conf":"^13.1.0","glob":"^11.0.1","open":"^10.1.0","chalk":"^5.4.1","ignore":"^7.0.4","commander":"^13.1.0","@inquirer/prompts":"^8.2.0","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","@types/tar":"^6.1.13","typescript":"^5.0.0","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/funforge_0.2.3_1768492558336_0.16880548371693016","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@byfungsi/funforge","version":"0.4.0","keywords":["cli","deploy","funforge","fungsi","mcp"],"author":{"name":"Fungsi"},"license":"MIT","_id":"@byfungsi/funforge@0.4.0","maintainers":[{"name":"hanipcode","email":"hanifeij@yahoo.co.id"}],"bin":{"funforge":"dist/cli.js","funforge-mcp":"dist/mcp.js"},"dist":{"shasum":"c9ccf66a9413c50ed6ae0d01859289085fc4eddd","tarball":"https://registry.npmjs.org/@byfungsi/funforge/-/funforge-0.4.0.tgz","fileCount":68,"integrity":"sha512-GRqbEtjCan1aw/9PLXc45BIuH0NgtnTo8veck4uUuJFtOPzzetfz+FFzgIgv3gBo/+3pWWMgl9Mbgy6alkx0vg==","signatures":[{"sig":"MEQCIHh4TUN62morCLMc4WlBiQGrQwJWMI8gKWbloMuHMPFOAiAgIh4n1y9KEENjRuAR29zOEWh+/NhWmIV3jyxTxI/P0g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161957},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"f2fb300b90f2c48d99380c29d75114598feee96e","scripts":{"dev":"tsc --watch","mcp":"node dist/mcp.js","test":"vitest run","build":"tsc","start":"node dist/cli.js","typecheck":"tsc --noEmit","release:dry":"pnpm run build && pnpm run test && npm publish --access public --dry-run","release:major":"npm version major --no-git-tag-version && pnpm run release:publish","release:minor":"npm version minor --no-git-tag-version && pnpm run release:publish","release:patch":"npm version patch --no-git-tag-version && pnpm run release:publish","release:publish":"pnpm run build && pnpm run test && npm publish --access public"},"_npmUser":{"name":"hanipcode","email":"hanifeij@yahoo.co.id"},"_npmVersion":"10.9.3","description":"Deploy without git, without leaving your editor","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.2.0","tar":"^7.4.3","zod":"^3.25.34","conf":"^13.1.0","glob":"^11.0.1","open":"^10.1.0","chalk":"^5.4.1","ignore":"^7.0.4","commander":"^13.1.0","@inquirer/prompts":"^8.2.0","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","@types/tar":"^6.1.13","typescript":"^5.0.0","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/funforge_0.4.0_1768731556791_0.1800031526698802","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@byfungsi/funforge","version":"0.5.0","description":"Deploy without git, without leaving your editor","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","bin":{"funforge":"dist/cli.js","funforge-mcp":"dist/mcp.js"},"scripts":{"build":"tsc","dev":"tsc --watch","typecheck":"tsc --noEmit","test":"vitest run","start":"node dist/cli.js","mcp":"node dist/mcp.js","release:patch":"npm version patch --no-git-tag-version && pnpm run release:publish","release:minor":"npm version minor --no-git-tag-version && pnpm run release:publish","release:major":"npm version major --no-git-tag-version && pnpm run release:publish","release:publish":"pnpm run build && pnpm run test && npm publish --access public","release:dry":"pnpm run build && pnpm run test && npm publish --access public --dry-run"},"keywords":["cli","deploy","funforge","fungsi","mcp"],"author":{"name":"Fungsi"},"license":"MIT","engines":{"node":">=18.0.0"},"dependencies":{"@inquirer/prompts":"^8.2.0","@modelcontextprotocol/sdk":"^1.12.1","chalk":"^5.4.1","commander":"^13.1.0","conf":"^13.1.0","glob":"^11.0.1","ignore":"^7.0.4","open":"^10.1.0","ora":"^8.2.0","tar":"^7.4.3","zod":"^3.25.34"},"devDependencies":{"@types/node":"^22.15.21","@types/tar":"^6.1.13","typescript":"^5.0.0","vitest":"^4.0.16"},"_id":"@byfungsi/funforge@0.5.0","gitHead":"7b33f145bf44fd43ddf041dae77afe1721b74478","_nodeVersion":"22.20.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-cTvJkGcqs6uOFUq/h8kvs6iDtGpNfw+SeA62EsXZvqnDvBRZRnAtCoJjRR9L5bDKshQQkNlUypUPIDZFtPBU4A==","shasum":"821e0a6d2e5e398d2e8bc412b4efe80f60c090d4","tarball":"https://registry.npmjs.org/@byfungsi/funforge/-/funforge-0.5.0.tgz","fileCount":68,"unpackedSize":163465,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDJ07bE/D5t04Qf6CkNDBkA1xX4gVrU7EsfnrfLIYfyLAiEAhkTOuauTn8QsDnEz0wfoZMvybXyzvCXM0x7Zj6zPn2I="}]},"_npmUser":{"name":"hanipcode","email":"hanifeij@yahoo.co.id"},"directories":{},"maintainers":[{"name":"hanipcode","email":"hanifeij@yahoo.co.id"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/funforge_0.5.0_1769077834834_0.5396828418639854"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-15T11:39:39.565Z","modified":"2026-01-22T10:30:35.105Z","0.1.0":"2026-01-15T11:39:39.788Z","0.2.0":"2026-01-15T13:00:04.613Z","0.2.2":"2026-01-15T14:33:10.030Z","0.2.3":"2026-01-15T15:55:58.495Z","0.4.0":"2026-01-18T10:19:16.941Z","0.5.0":"2026-01-22T10:30:34.975Z"},"author":{"name":"Fungsi"},"license":"MIT","keywords":["cli","deploy","funforge","fungsi","mcp"],"description":"Deploy without git, without leaving your editor","maintainers":[{"name":"hanipcode","email":"hanifeij@yahoo.co.id"}],"readme":"# @byfungsi/funforge\n\n> Deploy without git. Without leaving your editor.\n\nFunForge CLI lets you deploy directly from your local machine to [FunForge](https://funforge.app) - no commits, no pushes, no CI/CD pipelines. Just run `funforge deploy` and you're live.\n\n## Features\n\n- **Git-Free Deployment** - Deploy without committing. Perfect for rapid iteration.\n- **Local-First Workflow** - Work locally, deploy directly. Skip the CI/CD dance.\n- **Editor Integration** - MCP server for Claude Desktop, Cursor, and other AI assistants.\n- **Full Control** - Manage environment variables, custom domains, and deployments from CLI.\n\n## Installation\n\n```bash\n# npm\nnpm install -g @byfungsi/funforge\n\n# pnpm\npnpm add -g @byfungsi/funforge\n\n# bun\nbun add -g @byfungsi/funforge\n```\n\n## Quick Start\n\n```bash\n# 1. Authenticate (opens browser)\nfunforge login\n\n# 2. Create an app (or link to existing)\nfunforge apps create my-app\n\n# 3. Link your project\nfunforge link\n\n# 4. Deploy\nfunforge deploy\n```\n\nThat's it. Your app is live at `https://your-app.funforge.app`.\n\n## Commands\n\n### Authentication\n\n```bash\nfunforge login          # Authenticate via browser (device flow)\nfunforge logout         # Clear stored credentials\nfunforge whoami         # Show current authenticated user\n```\n\n### Apps\n\n```bash\nfunforge apps list              # List all your apps\nfunforge apps create <name>     # Create a new app\nfunforge apps create <name> -s <slug>  # Create with custom subdomain\nfunforge link                   # Link current directory to an app (interactive)\nfunforge link <appId>           # Link to specific app\n```\n\n### Deploy\n\n```bash\nfunforge deploy         # Deploy current directory\nfunforge deploy -y      # Skip confirmation prompt\nfunforge deploy --no-watch  # Don't watch deployment logs\n```\n\n### Environment Variables\n\n```bash\nfunforge env list                    # List all env vars\nfunforge env set KEY=VALUE           # Set single variable\nfunforge env set KEY1=V1 KEY2=V2     # Set multiple variables\nfunforge env unset KEY               # Remove variable\nfunforge env unset KEY1 KEY2         # Remove multiple\n```\n\n### Custom Domains\n\n```bash\nfunforge domains list               # List custom domains\nfunforge domains add example.com    # Add domain (shows DNS instructions)\nfunforge domains add example.com -m txt  # Use TXT verification\nfunforge domains remove example.com # Remove domain\nfunforge domains verify example.com # Verify DNS and provision SSL\n```\n\n### Config (Build Settings)\n\nManage build settings stored on the server:\n\n```bash\nfunforge config show    # Compare local vs server settings\nfunforge config push    # Push local settings to server\nfunforge config pull    # Pull server settings to local file\n```\n\n**Note:** The `config` commands sync settings to the database. However, during deployment, `funforge.json` in your project is automatically read and takes priority over database settings.\n\n## Configuration\n\n### funforge.json\n\nWhen you run `funforge link`, a `funforge.json` file is created in your project root:\n\n```json\n{\n  \"appId\": \"your-app-uuid\",\n  \"appName\": \"My App\",\n  \"appSlug\": \"my-app\",\n  \"build\": {\n    \"buildCommand\": \"npm run build\",\n    \"installCommand\": \"npm ci\",\n    \"startCommand\": \"npm start\",\n    \"nodeVersion\": \"20\"\n  },\n  \"port\": 3000\n}\n```\n\n**Fields:**\n\n| Field | Description |\n|-------|-------------|\n| `appId` | (Required) The app UUID this project is linked to |\n| `appName` | Display name of the app |\n| `appSlug` | Subdomain slug (e.g., `my-app` for `my-app.funforge.app`) |\n| `build.buildCommand` | Custom build command (overrides auto-detection) |\n| `build.installCommand` | Custom install command (e.g., `npm ci` or `pnpm install`) |\n| `build.startCommand` | Custom start command (e.g., `node server.js`) |\n| `build.nodeVersion` | Node.js version: `\"18\"`, `\"20\"`, or `\"22\"` |\n| `port` | Port your app listens on (default: 3000) |\n\n**Build Settings Priority:**\n\nDuring deployment, build settings are resolved in this order:\n\n1. **funforge.json** (in your project) - highest priority\n2. **Database settings** (set via web UI or `funforge config push`)\n3. **Railpack auto-detection** - fallback\n\nThis means you can commit `funforge.json` to your Git repo and it will automatically be used during builds - no need to configure anything in the web UI or run `funforge config push`.\n\n**Git Users:** Just add `funforge.json` to your repo. The builder will automatically read it during deployment.\n\n**CLI Users:** Your `funforge.json` is included in the upload and used during builds.\n\n### .funforgeignore\n\nControl which files are included in the deployment tarball. Uses `.gitignore` syntax:\n\n```gitignore\n# Ignore test files\n__tests__/\n*.test.ts\n\n# Ignore local config\n.env.local\nconfig.local.json\n```\n\nBy default, FunForge respects your `.gitignore` file. Use `.funforgeignore` to add additional exclusions.\n\n### Size Limits\n\n- Maximum tarball size: **50 MB**\n- Use `.funforgeignore` to exclude large files (node_modules is automatically excluded)\n\n## MCP Server\n\nFunForge includes an MCP (Model Context Protocol) server for AI assistant integration. Deploy directly from Claude Desktop, Cursor, or any MCP-compatible client.\n\n### Setup for Claude Desktop\n\nAdd to your `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"funforge\": {\n      \"command\": \"npx\",\n      \"args\": [\"@byfungsi/funforge-mcp\"]\n    }\n  }\n}\n```\n\n### Setup for Cursor\n\nAdd to your MCP settings:\n\n```json\n{\n  \"funforge\": {\n    \"command\": \"npx\",\n    \"args\": [\"@byfungsi/funforge-mcp\"]\n  }\n}\n```\n\n### Available Tools\n\n| Tool | Description |\n|------|-------------|\n| `funforge_whoami` | Check authentication status |\n| `funforge_apps_list` | List all your apps |\n| `funforge_apps_create` | Create a new app |\n| `funforge_status` | Get deployment status |\n| `funforge_deploy` | Deploy a directory |\n| `funforge_env_list` | List environment variables |\n| `funforge_env_set` | Set environment variables |\n| `funforge_env_unset` | Remove environment variables |\n| `funforge_domains_list` | List custom domains |\n| `funforge_domains_add` | Add a custom domain |\n\n### Example Conversations\n\nOnce configured, you can use natural language:\n\n- \"Deploy my current project to FunForge\"\n- \"Set the DATABASE_URL environment variable to postgres://...\"\n- \"Add api.myapp.com as a custom domain\"\n- \"What's the status of my deployment?\"\n\n## Environment Variables\n\nThe CLI can be configured via environment variables:\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `FUNFORGE_API_URL` | API endpoint | `https://funforge.fungsi.app` |\n| `FUNFORGE_API_KEY` | API key (skips device auth) | - |\n\n## Authentication\n\nFunForge uses device authentication flow:\n\n1. Run `funforge login`\n2. Browser opens to FunForge login page\n3. Sign in with GitHub\n4. CLI automatically receives credentials\n5. Credentials stored locally in `~/.config/funforge/`\n\nFor CI/CD environments, set `FUNFORGE_API_KEY` instead.\n\n## How It Works\n\n1. **Tarball Creation** - CLI creates a `.tar.gz` of your project (respecting `.gitignore` and `.funforgeignore`)\n2. **Upload** - Tarball is uploaded to R2 storage\n3. **Build** - FunForge downloads and builds your app using Railpack (auto-detects framework)\n4. **Deploy** - Blue-green deployment with health checks\n5. **Live** - Your app is available at `https://your-app.funforge.app`\n\n## Links\n\n- **Website**: [funforge.app](https://funforge.app)\n- **Documentation**: [docs.fungsi.app/docs/funforge/guides/cli](https://docs.fungsi.app/docs/funforge/guides/cli)\n- **CLI Marketing**: [funforge.app/cli](https://funforge.app/cli)\n- **MCP Integration**: [funforge.app/mcp](https://funforge.app/mcp)\n\n## Requirements\n\n- Node.js 18+\n- FunForge account (sign up at [funforge.app](https://funforge.app))\n\n## License\n\nMIT\n","readmeFilename":"README.md"}