{"id":30555476,"url":"https://github.com/n73-ai/n73","last_synced_at":"2026-04-11T18:04:17.197Z","repository":{"id":307361023,"uuid":"1029269741","full_name":"n73-ai/n73","owner":"n73-ai","description":"Build, Preview, and Ship with AI.","archived":false,"fork":false,"pushed_at":"2025-08-23T23:00:53.000Z","size":2134,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-24T09:58:54.077Z","etag":null,"topics":["ai","claude-code","fiber","go","nextjs","typescript","vibe-coding"],"latest_commit_sha":null,"homepage":"https://n73.agustfricke.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/n73-ai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-30T19:25:37.000Z","updated_at":"2025-08-23T23:00:57.000Z","dependencies_parsed_at":"2025-07-30T22:19:34.786Z","dependency_job_id":"8bf0f39a-151f-4266-9176-1cf372338677","html_url":"https://github.com/n73-ai/n73","commit_stats":null,"previous_names":["zustack/ai","n73-ai/n73"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/n73-ai/n73","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n73-ai%2Fn73","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n73-ai%2Fn73/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n73-ai%2Fn73/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n73-ai%2Fn73/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/n73-ai","download_url":"https://codeload.github.com/n73-ai/n73/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n73-ai%2Fn73/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272446615,"owners_count":24936517,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-28T02:00:10.768Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","claude-code","fiber","go","nextjs","typescript","vibe-coding"],"created_at":"2025-08-28T05:35:04.955Z","updated_at":"2026-04-11T18:04:17.147Z","avatar_url":"https://github.com/n73-ai.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# n73\n\n## Build, Preview, and Ship with AI\n\n**n73** is an AI-powered app development platform that lets you create entire web \napplications using **natural language prompts**.\n\n**Version 1** is now available — try it here:\n[https://n73.agustfricke.com](https://n73.agustfricke.com)\n\nAll pending items (bugs, features, and tasks) are tracked in the TODO.md file.\n\n\u003e Questions, feedback, or just interested? Hit me up at my email \n**[hej@agustfricke.com](mailto:hej@agustfricke.com)** your input is always appreciated.\n\n## Local Setup (Ubuntu 22.04)\n\n### Dependencies\n\n#### Node.js\n\n```bash\nwget https://nodejs.org/dist/v22.17.1/node-v22.17.1-linux-x64.tar.xz\ntar -xf node-v22.17.1-linux-x64.tar.xz\nrm node-v22.17.1-linux-x64.tar.xz\nmv node-v22.17.1-linux-x64 /usr/bin/node\n```\n\nAdd to your `.bashrc`:\n\n```bash\nexport PATH=$PATH:/usr/bin/node/bin\n```\n\nApply changes:\n\n```bash\nsource /path/to/.bashrc\n```\n\n#### Wrangler\n\n```bash\nnpm i -D -g wrangler@latest\n```\n\n#### GitHub CLI\n\n```bash\n(type -p wget \u003e/dev/null || (sudo apt update \u0026\u0026 sudo apt install wget -y)) \\\n \u0026\u0026 sudo mkdir -p -m 755 /etc/apt/keyrings \\\n \u0026\u0026 out=$(mktemp) \u0026\u0026 wget -nv -O$out https://cli.github.com/packages/githubcli-archive-keyring.gpg \\\n \u0026\u0026 sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg \u003c $out \u003e /dev/null \\\n \u0026\u0026 sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \\\n \u0026\u0026 sudo mkdir -p -m 755 /etc/apt/sources.list.d \\\n \u0026\u0026 echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main\" \\\n    | sudo tee /etc/apt/sources.list.d/github-cli.list \u003e /dev/null \\\n \u0026\u0026 sudo apt update \\\n \u0026\u0026 sudo apt install gh -y\n```\n\n#### Docker\n\n```bash\nsudo apt-get remove docker docker-engine docker.io containerd runc\nsudo apt-get update\nsudo apt-get install ca-certificates curl gnupg\ninstall -m 0755 -d /etc/apt/keyrings\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg \\\n | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg\nchmod a+r /etc/apt/keyrings/docker.gpg\necho \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \\\n https://download.docker.com/linux/ubuntu $(. /etc/os-release \u0026\u0026 echo $VERSION_CODENAME) stable\" \\\n | sudo tee /etc/apt/sources.list.d/docker.list\nsudo apt-get update -y\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y\n```\n\n#### Go\n\n```bash\nwget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz\ntar -xf go1.22.5.linux-amd64.tar.gz\nrm go1.22.5.linux-amd64.tar.gz\nmv go /usr/bin\n```\n\nAdd to your `.bashrc`:\n\n```bash\nexport PATH=/usr/bin/go/bin:$PATH\nexport GOPATH=/.go\nexport PATH=$PATH:$GOPATH/bin\n```\n\nApply changes:\n\n```bash\nsource /path/to/.bashrc\n```\n\n#### Python 3.10 Environment\n\n```bash\napt install python3.10-venv\n```\n\n---\n\n### Authentication \u0026 Login Setup\n\n#### Generate SSH Key\n\n```bash\nssh-keygen -t ed25519 -C \"hej@agustfricke.com\"\n```\n\nStart ssh-agent and add key:\n\n```bash\neval \"$(ssh-agent -s)\"\nssh-add ~/.ssh/id_ed25519\n```\n\nCopy your public key:\n\n```bash\ncat ~/.ssh/id_ed25519.pub\n```\n\nAdd it to your GitHub account.\n\n#### GitHub CLI Login\n\n```bash\ngh auth login\n```\n\n#### Wrangler Login\n\n```bash\nwrangler login\n```\n\nFollow the OAuth flow — after it redirects to `localhost:[port]`,\nopen a new terminal on your server and run:\n\n```bash\ncurl \"localhost_url\"\n```\n\n---\n\n### Claude Code (Docker Build \u0026 Commit)\n\n```bash\ndocker build -t claude-server .\n\ndocker run --network host -d  --name claude-server claude-server\n\ndocker exec -it claude-server bash\n\nclaude  \n\ndocker commit claude-server base:v1\n```\n\n---\n\n### Database Setup\n\n```bash\ndocker run --name n73-database \\\n  --network host \\\n  -e POSTGRES_USER=postgres \\\n  -e POSTGRES_PASSWORD=secret \\\n  -e POSTGRES_DB=mydb \\\n  -d postgres\n\ndocker exec -it n73-database psql -U postgres -d mydb\n\n# or\n\npsql -h localhost -p 5432 -U postgres -d mydb\n```\n\nadd new:\n```sql\nALTER TABLE projects\nADD COLUMN error_msg TEXT DEFAULT '';\n```\n\nPaste the contents of `tables.sql` into the PostgreSQL shell.\n\n---\n\n### Environment Variables\n\n**Frontend** (`ai/ui/.env.local`):\n\n```bash\nVITE_BACKEND_URL=\"http://localhost:8080\"\nVITE_WEBSOCKET_URL=\"ws://localhost:8080\"\n```\n\n**Backend**:\n\n```bash\nexport DB_USER=postgres\nexport DB_PASSWORD=secret\nexport DB_HOST=localhost\nexport DB_NAME=mydb\nexport DB_PORT=5432\nexport EMAIL_SECRET_KEY=secret_email_pass\nexport PORT=8080\nexport ROOT_PATH=/path/to/ai\nexport SECRET_KEY=\"very_long_string\"\nexport ADMIN_JWT=\"jwt_with_email_admin_user_claim\"\nexport IP=\"192.168.1.9\"\n```\n\n---\n\n### Notes\n\n* **EMAIL\\_SECRET\\_KEY**: Obtain from your Google account to enable email sending.\n* **ROOT\\_PATH**: Path to your AI project (e.g., `/home/agust/work/ai`).\n* **ADMIN\\_JWT**: Generate using this Go snippet:\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  \"github.com/golang-jwt/jwt\"\n)\n\nfunc main() {\n  tokenByte := jwt.New(jwt.SigningMethodHS256)\n  now := time.Now().UTC()\n  claims := tokenByte.Claims.(jwt.MapClaims)\n  //expDuration := time.Hour * 24 * 180\n  //exp := now.Add(expDuration).Unix()\n  //claims[\"exp\"] = exp\n  claims[\"email\"] = \"agustfricke@gmail.com\"\n  claims[\"iat\"] = now.Unix()\n  claims[\"nbf\"] = now.Unix()\n  tokenString, err := tokenByte.SignedString([]byte(\"sodibg3obg48wb4ogbwsl4gjwnf4owbg9snkfbitbfwouebgiw893r83bf9uw3bsfeiugfiwbf4ifgw938hg9w74gfi4wubcwih39h0f038298yhw8beguiwebgiwbe=w-eto293ru2094tf-w=efwnoigb\"))\n  if err != nil {\n    panic(err)\n  }\n  fmt.Println(tokenString)\n}\n```\n\nRun it and use the output as your admin JWT.\n\n* **IP**: Your local IP (use `hostname -I`).\n\n---\n\n### Running the Project\n\n**Backend:**\n\n```bash\ngo run cmd/main.go\n```\n\nCreate a new user in the UI, then make them admin:\n\n```bash\ndocker exec -it my-postgres psql -U postgres -d mydb\n```\n\n```sql\nUPDATE users SET role = 'admin' WHERE email = 'your@admin.com';\nUPDATE projects SET status = 'Deployed' WHERE id = 'd849fcf1-0e0f-4e47-b7e2-f078b9ef1099';\n```\n\n**Frontend:**\n\n```bash\ncd ui\nnpm run dev\n```\n\nVisit [http://localhost:5173](http://localhost:5173) to use the app locally.\n\n\u003e You’ll also need to update the repository upload location.\n\u003e In my case, it’s under **GitHub `n73-projects`**, so make sure to change this in the `scripts/gh-create.sh` file.\n\n## Deployments\n\n### 1. Firewall Configuration\n\nStart a `screen` session to keep the firewall setup running even if you disconnect:\n\n```bash\nscreen -S firewall-setup\n```\n\nConfigure **UFW**:\n\n```bash\nsudo ufw allow ssh\nsudo ufw enable\nsudo ufw default deny incoming\nsudo ufw default allow outgoing\nsudo ufw allow 80\nsudo ufw allow 443\nsudo ufw status verbose\n```\n\n---\n\n### 2. Nginx + Certbot (HTTPS \u0026 WSS)\n\nPoint your DNS record to your server's IP address, then install Nginx and Certbot:\n\n```bash\nsudo apt install certbot python3-certbot-nginx nginx -y\ncertbot --nginx\n```\n\nReplace the default Nginx config with your custom config:\n\n```bash\nrm /etc/nginx/sites-available/default\nrm /etc/nginx/sites-enabled/default\ncp ~/ai/server_config/default /etc/nginx/sites-available\nsudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/\nsudo nginx -t\nsudo systemctl restart nginx\n```\n\n**Optional:** Test if Nginx and the application work as expected:\n\n```bash\ncd ~/ai\n\n# Build frontend\ncd ui\nnpm run build\n\n# Run backend\ncd ..\nsource .env\ngo run cmd/main.go\n```\n\n---\n\n### 3. Systemd Service\n\n**Step 1:** Edit `server_config/ai.service` and update environment variables (`.env`).\n**Step 2:** Move the file to systemd:\n\n```bash\nmv ai/server_config/ai.service /etc/systemd/system\n```\n\n**Step 3:** Manage the service:\n\n```bash\nsudo service ai start\nsudo service ai status\nsudo service ai stop\n# check the log\njournalctl -u ai.service -n 50\n```\n\n## Admin endpoints(only via api)\nrm docker\n```bash\nexport JWT=\"\"\nexport P_ID=\"\"\ncurl -i -X POST \"https://n73.agustfricke.com/admin/rm/docker/$P_ID\" \\\n     -H \"Authorization: Bearer $JWT\"\n```\n\ncheck projects\n```bash\nexport JWT=\"\"\ncurl -i -X GET \"https://n73.agustfricke.com/admin/projects\" \\\n     -H \"Authorization: Bearer $JWT\"\n```\n\ncheck the logs\n```bash\ncurl -i -X GET \"http://localhost:8080/logs\" | jq\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fn73-ai%2Fn73","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fn73-ai%2Fn73","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fn73-ai%2Fn73/lists"}