Codebase Scaffolder

Pick a framework and features. Generate a complete project structure with file contents.

100% Free Tool

Project Name

Choose Framework

Select Features

More Free Tools

Get All Tools

Lifetime Pass ($99.99) gets every tool we build. Or resell them all under your brand from $99.

Visit the Store
Copied!
\n \n );\n}`; generatedFiles[srcDir+'/app/page.tsx'] = `export default function Home() {\n return (\n
\n

${name}

\n

Welcome to your Next.js app.

\n
\n );\n}`; generatedFiles['next.config.js'] = `/** @type {import('next').NextConfig} */\nconst nextConfig = {};\nmodule.exports = nextConfig;`; tree.push(' app/',' layout.tsx',' page.tsx'); tree.push(' next.config.js'); } else if(fw === 'vue') { generatedFiles[srcDir+'/main.js'] = `import { createApp } from 'vue';\nimport App from './App.vue';\n\ncreateApp(App).mount('#app');`; generatedFiles[srcDir+'/App.vue'] = `\n\n`; tree.push(' main.js',' App.vue'); } else if(fw === 'svelte') { generatedFiles[srcDir+'/main.js'] = `import App from './App.svelte';\n\nconst app = new App({ target: document.getElementById('app') });\nexport default app;`; generatedFiles[srcDir+'/App.svelte'] = `\n\n
\n

{name}

\n

Welcome to your Svelte app.

\n
`; tree.push(' main.js',' App.svelte'); } else if(fw === 'express') { generatedFiles[srcDir+'/index.js'] = `const express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.use(express.json());\n\napp.get('/', (req, res) => {\n res.json({ message: 'Welcome to ${name}' });\n});\n\napp.listen(PORT, () => {\n console.log(\`Server running on port \${PORT}\`);\n});`; generatedFiles[srcDir+'/routes/index.js'] = `const router = require('express').Router();\n\nrouter.get('/health', (req, res) => res.json({ status: 'ok' }));\n\nmodule.exports = router;`; tree.push(' index.js',' routes/',' index.js'); } else if(fw === 'fastapi') { generatedFiles[srcDir+'/main.py'] = `from fastapi import FastAPI\n\napp = FastAPI(title="${name}")\n\[email protected]("/")\ndef root():\n return {"message": "Welcome to ${name}"}\n\[email protected]("/health")\ndef health():\n return {"status": "ok"}`; generatedFiles[srcDir+'/__init__.py'] = ''; tree.push(' main.py',' __init__.py'); } else if(fw === 'flask') { generatedFiles[srcDir+'/main.py'] = `from flask import Flask, jsonify\n\napp = Flask(__name__)\n\[email protected]("/")\ndef index():\n return jsonify(message="Welcome to ${name}")\n\[email protected]("/health")\ndef health():\n return jsonify(status="ok")\n\nif __name__ == "__main__":\n app.run(debug=True)`; generatedFiles[srcDir+'/__init__.py'] = ''; tree.push(' main.py',' __init__.py'); } // Features if(feats.includes('auth')) { if(isJS) { generatedFiles[srcDir+'/middleware/auth.js'] = `const jwt = require('jsonwebtoken');\n\nfunction authMiddleware(req, res, next) {\n const token = req.headers.authorization?.split(' ')[1];\n if (!token) return res.status(401).json({ error: 'No token provided' });\n try {\n const decoded = jwt.verify(token, process.env.SECRET_KEY);\n req.user = decoded;\n next();\n } catch (err) {\n return res.status(401).json({ error: 'Invalid token' });\n }\n}\n\nmodule.exports = authMiddleware;`; tree.push(' middleware/',' auth.js'); } else { generatedFiles[srcDir+'/auth.py'] = `from datetime import datetime, timedelta\nimport os\n\ndef create_token(data: dict):\n """Create JWT token."""\n from jose import jwt\n expire = datetime.utcnow() + timedelta(hours=24)\n to_encode = {**data, "exp": expire}\n return jwt.encode(to_encode, os.getenv("SECRET_KEY"), algorithm="HS256")\n\ndef verify_token(token: str):\n """Verify JWT token."""\n from jose import jwt\n return jwt.decode(token, os.getenv("SECRET_KEY"), algorithms=["HS256"])`; tree.push(' auth.py'); } } if(feats.includes('db')) { if(isJS) { generatedFiles[srcDir+'/db/index.js'] = `// Database connection\nconst { Pool } = require('pg');\n\nconst pool = new Pool({\n connectionString: process.env.DATABASE_URL,\n});\n\nmodule.exports = { query: (text, params) => pool.query(text, params) };`; tree.push(' db/',' index.js'); } else { generatedFiles[srcDir+'/database.py'] = `from sqlalchemy import create_engine\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy.orm import sessionmaker\nimport os\n\nDATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./app.db")\nengine = create_engine(DATABASE_URL)\nSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\nBase = declarative_base()\n\ndef get_db():\n db = SessionLocal()\n try:\n yield db\n finally:\n db.close()`; generatedFiles[srcDir+'/models.py'] = `from sqlalchemy import Column, Integer, String, DateTime\nfrom datetime import datetime\nfrom .database import Base\n\nclass User(Base):\n __tablename__ = "users"\n id = Column(Integer, primary_key=True, index=True)\n email = Column(String, unique=True, index=True)\n created_at = Column(DateTime, default=datetime.utcnow)`; tree.push(' database.py',' models.py'); } } if(feats.includes('tests')) { const testDir = isPy ? 'tests' : 'tests'; if(isJS) { generatedFiles[testDir+'/app.test.js'] = `import { describe, it, expect } from 'vitest';\n\ndescribe('App', () => {\n it('should pass basic test', () => {\n expect(1 + 1).toBe(2);\n });\n});`; } else { generatedFiles[testDir+'/test_main.py'] = `from fastapi.testclient import TestClient\nfrom app.main import app\n\nclient = TestClient(app)\n\ndef test_root():\n response = client.get("/")\n assert response.status_code == 200\n\ndef test_health():\n response = client.get("/health")\n assert response.json()["status"] == "ok"`; } tree.push(' '+testDir+'/'); tree.push(' '+(isJS?'app.test.js':'test_main.py')); } if(feats.includes('docker')) { generatedFiles['Dockerfile'] = isJS ? `FROM node:20-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --production\nCOPY . .\nEXPOSE 3000\nCMD ["node", "src/index.js"]` : `FROM python:3.12-slim\nWORKDIR /app\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\nCOPY . .\nEXPOSE 8000\nCMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]`; generatedFiles['docker-compose.yml'] = `version: '3.8'\nservices:\n app:\n build: .\n ports:\n - "${isJS?'3000:3000':'8000:8000'}"\n env_file:\n - .env\n volumes:\n - .:/app`; generatedFiles['.dockerignore'] = 'node_modules\n.git\n.env\n__pycache__\nvenv\ndist'; tree.push(' Dockerfile',' docker-compose.yml',' .dockerignore'); } if(feats.includes('cicd')) { generatedFiles['.github/workflows/ci.yml'] = `name: CI\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - ${isJS?'name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 20\n - run: npm ci\n - run: npm run build':'name: Setup Python\n uses: actions/setup-python@v5\n with:\n python-version: "3.12"\n - run: pip install -r requirements.txt'}${feats.includes('tests')?(isJS?'\n - run: npm test':'\n - run: pytest'):''}${feats.includes('lint')?(isJS?'\n - run: npm run lint':''):''}`; tree.push(' .github/',' workflows/',' ci.yml'); } if(feats.includes('lint') && isJS) { generatedFiles['.eslintrc.json'] = JSON.stringify({env:{browser:true,es2021:true,node:true},extends:['eslint:recommended'],parserOptions:{ecmaVersion:'latest',sourceType:'module'},rules:{}},null,2); tree.push(' .eslintrc.json'); } // Render document.getElementById('treeOutput').textContent = tree.join('\n'); const tabs = document.getElementById('fileTabs'); tabs.innerHTML = Object.keys(generatedFiles).map((f,i) => ``).join(''); const firstFile = Object.keys(generatedFiles)[0]; document.getElementById('fileCode').textContent = generatedFiles[firstFile]; document.getElementById('outputSection').style.display = 'block'; gtag('event','generate_scaffold',{event_category:'tool_use',framework:fw,features:feats.join(',')}); } function showFile(el, filename) { document.querySelectorAll('.file-tab button').forEach(b=>b.classList.remove('active')); el.classList.add('active'); document.getElementById('fileCode').textContent = generatedFiles[filename] || '(empty file)'; } function copyTree() { navigator.clipboard.writeText(document.getElementById('treeOutput').textContent); showToast('Tree copied!'); } function copyAll() { let output = ''; for(const [file, content] of Object.entries(generatedFiles)) { output += `\n// ===== ${file} =====\n${content}\n`; } navigator.clipboard.writeText(output); showToast('All files copied!'); gtag('event','copy_scaffold',{event_category:'tool_use'}); }