create-0g-app 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/index.js +36 -39
  2. package/dist/index.js.map +1 -1
  3. package/dist/scaffold.d.ts +8 -0
  4. package/dist/scaffold.d.ts.map +1 -0
  5. package/dist/scaffold.js +229 -0
  6. package/dist/scaffold.js.map +1 -0
  7. package/package.json +9 -2
  8. package/templates/{storage → base}/_gitignore +0 -9
  9. package/templates/base/packages/web/app/layout.tsx +42 -0
  10. package/templates/{storage → base}/packages/web/components/Navbar.module.css +2 -34
  11. package/templates/{storage → base}/packages/web/components/Navbar.tsx +3 -15
  12. package/templates/{storage → base}/packages/web/lib/wagmi.ts +2 -2
  13. package/templates/{storage → base}/packages/web/next.config.ts +1 -12
  14. package/templates/compute/packages/web/app/api/compute/route.ts +91 -0
  15. package/templates/compute/packages/web/components/ComputeSection.module.css +84 -0
  16. package/templates/compute/packages/web/components/ComputeSection.tsx +102 -0
  17. package/templates/compute/packages/web/lib/0g-compute.ts +38 -0
  18. package/templates/contracts/packages/contracts/contracts/MyContract.sol +21 -0
  19. package/templates/{storage → contracts}/packages/contracts/hardhat.config.ts +11 -21
  20. package/templates/contracts/packages/contracts/scripts/deploy.ts +33 -0
  21. package/templates/storage/packages/web/app/api/download/[rootHash]/route.ts +34 -0
  22. package/templates/storage/packages/web/app/api/upload/route.ts +51 -0
  23. package/templates/storage/packages/web/components/StorageSection.module.css +80 -0
  24. package/templates/storage/packages/web/components/StorageSection.tsx +92 -0
  25. package/templates/storage/packages/web/lib/0g-storage.ts +16 -37
  26. package/templates/storage/scripts/patch-0g-sdk.js +139 -0
  27. package/templates/storage/README.md +0 -106
  28. package/templates/storage/package-lock.json +0 -15358
  29. package/templates/storage/package.json +0 -15
  30. package/templates/storage/packages/contracts/contracts/FileRegistry.sol +0 -49
  31. package/templates/storage/packages/contracts/scripts/deploy.ts +0 -43
  32. package/templates/storage/packages/web/.env.example +0 -12
  33. package/templates/storage/packages/web/app/layout.tsx +0 -25
  34. package/templates/storage/packages/web/app/page.module.css +0 -74
  35. package/templates/storage/packages/web/app/page.tsx +0 -29
  36. package/templates/storage/packages/web/app/storage/page.module.css +0 -110
  37. package/templates/storage/packages/web/app/storage/page.tsx +0 -167
  38. package/templates/storage/packages/web/lib/abi.ts +0 -48
  39. package/templates/storage/packages/web/next-env.d.ts +0 -6
  40. package/templates/storage/packages/web/package.json +0 -26
  41. /package/templates/{storage → base}/packages/web/app/globals.css +0 -0
  42. /package/templates/{storage → base}/packages/web/app/providers.tsx +0 -0
  43. /package/templates/{storage → base}/packages/web/tsconfig.json +0 -0
  44. /package/templates/{storage → contracts}/packages/contracts/package.json +0 -0
package/dist/index.js CHANGED
@@ -42,21 +42,17 @@ const picocolors_1 = __importDefault(require("picocolors"));
42
42
  const path_1 = __importDefault(require("path"));
43
43
  const fs_extra_1 = __importDefault(require("fs-extra"));
44
44
  const child_process_1 = require("child_process");
45
- const TEMPLATES = {
46
- storage: "File registry (storage SDK + on-chain provenance)",
47
- compute: "Decentralized chat (inference SDK + on-chain logging) — coming soon",
48
- agent: "Autonomous agent (storage + compute + task contract) — coming soon",
49
- };
45
+ const scaffold_1 = require("./scaffold");
50
46
  async function main() {
51
47
  console.log();
52
48
  console.log(picocolors_1.default.cyan([
53
49
  " ╔═══════════════════════════════════╗",
54
- " ║ " + picocolors_1.default.bold("create-0g-app") + " v1.0.0 ║",
50
+ " ║ " + picocolors_1.default.bold("create-0g-app") + " v1.1.0 ║",
55
51
  " ╚═══════════════════════════════════╝",
56
52
  ].join("\n")));
57
53
  console.log();
58
54
  p.intro(picocolors_1.default.bgCyan(picocolors_1.default.black(" 0G App Scaffolder ")));
59
- // Project name from CLI arg or prompt
55
+ // Project name
60
56
  let projectName = process.argv[2];
61
57
  if (!projectName) {
62
58
  const name = await p.text({
@@ -75,11 +71,19 @@ async function main() {
75
71
  }
76
72
  projectName = name;
77
73
  }
78
- const template = await p.select({
79
- message: "Which template would you like to use?",
80
- options: Object.entries(TEMPLATES).map(([value, label]) => ({ value, label: `${value.padEnd(10)} — ${label}` })),
81
- });
82
- if (p.isCancel(template)) {
74
+ // Feature selection
75
+ const contracts = await p.confirm({ message: "Include on-chain contracts? (Hardhat + 0G Galileo)", initialValue: false });
76
+ if (p.isCancel(contracts)) {
77
+ p.cancel("Cancelled.");
78
+ process.exit(0);
79
+ }
80
+ const storage = await p.confirm({ message: "Use 0G Storage?", initialValue: false });
81
+ if (p.isCancel(storage)) {
82
+ p.cancel("Cancelled.");
83
+ process.exit(0);
84
+ }
85
+ const compute = await p.confirm({ message: "Use 0G Compute? (AI inference)", initialValue: false });
86
+ if (p.isCancel(compute)) {
83
87
  p.cancel("Cancelled.");
84
88
  process.exit(0);
85
89
  }
@@ -96,29 +100,10 @@ async function main() {
96
100
  fs_extra_1.default.removeSync(targetDir);
97
101
  }
98
102
  const s = p.spinner();
99
- // Copy template
100
103
  s.start("Scaffolding project");
101
- const templateDir = path_1.default.join(__dirname, "..", "templates", template);
102
- if (!fs_extra_1.default.existsSync(templateDir)) {
103
- s.stop(picocolors_1.default.yellow(`The "${template}" template is coming soon! Only "storage" is available right now.`));
104
- process.exit(0);
105
- }
106
- fs_extra_1.default.copySync(templateDir, targetDir, {
107
- filter: (src) => !src.includes("node_modules") && !src.includes(".next"),
108
- });
109
- // Rename gitignore (npm strips .gitignore on publish)
110
- const gitignoreSrc = path_1.default.join(targetDir, "_gitignore");
111
- const gitignoreDest = path_1.default.join(targetDir, ".gitignore");
112
- if (fs_extra_1.default.existsSync(gitignoreSrc))
113
- fs_extra_1.default.moveSync(gitignoreSrc, gitignoreDest);
114
- // Write .env from .env.example in web package
115
- const envExample = path_1.default.join(targetDir, "packages", "web", ".env.example");
116
- const envDest = path_1.default.join(targetDir, "packages", "web", ".env.local");
117
- if (fs_extra_1.default.existsSync(envExample) && !fs_extra_1.default.existsSync(envDest)) {
118
- fs_extra_1.default.copySync(envExample, envDest);
119
- }
104
+ (0, scaffold_1.scaffold)({ projectName: projectName, contracts: !!contracts, storage: !!storage, compute: !!compute }, targetDir);
120
105
  s.stop(`Scaffolded project in ${picocolors_1.default.green(`./${projectName}`)}`);
121
- // Install dependencies — stream output directly so user can see progress
106
+ // Install
122
107
  console.log(picocolors_1.default.dim("\n Installing dependencies... (this may take a minute, hang tight)\n"));
123
108
  try {
124
109
  (0, child_process_1.execSync)("npm install", { cwd: targetDir, stdio: "inherit" });
@@ -126,21 +111,33 @@ async function main() {
126
111
  p.log.success("Dependencies installed");
127
112
  }
128
113
  catch {
129
- p.log.warn("Dependency install failed — run `npm install` manually inside the project");
114
+ p.log.warn("Dependency install failed — run `npm install` manually");
130
115
  }
116
+ const selectedFeatures = [
117
+ contracts && "contracts",
118
+ storage && "storage",
119
+ compute && "compute",
120
+ ].filter(Boolean);
121
+ const needsPrivateKey = !!(contracts || storage || compute);
131
122
  p.outro([
132
123
  picocolors_1.default.green("Your 0G app is ready!"),
124
+ selectedFeatures.length > 0
125
+ ? ` ${picocolors_1.default.dim("Features:")} ${selectedFeatures.map((f) => picocolors_1.default.cyan(f)).join(", ")}`
126
+ : "",
133
127
  "",
134
128
  " " + picocolors_1.default.dim("Next steps:"),
135
129
  "",
136
130
  ` ${picocolors_1.default.cyan(`cd ${projectName}`)}`,
137
- ` ${picocolors_1.default.dim("# Add your private key to packages/web/.env.local")}`,
138
- ` ${picocolors_1.default.cyan("npm run dev")} ${picocolors_1.default.dim("→ local dev server")}`,
139
- ` ${picocolors_1.default.cyan("npm run deploy")} ${picocolors_1.default.dim("→ compile + deploy contract to Galileo testnet")}`,
140
- ` ${picocolors_1.default.cyan("npm run verify")} ${picocolors_1.default.dim("→ verify contract on 0G explorer")}`,
131
+ needsPrivateKey ? ` ${picocolors_1.default.yellow("⚠")} Add your ${picocolors_1.default.bold("PRIVATE_KEY")} to ${picocolors_1.default.cyan(`${projectName}/packages/web/.env.local`)}` : "",
132
+ needsPrivateKey ? ` ${picocolors_1.default.dim("Get testnet OG at https://faucet.0g.ai")}` : "",
133
+ "",
134
+ contracts ? ` ${picocolors_1.default.cyan("npm run deploy")} ${picocolors_1.default.dim("→ deploy contract to Galileo testnet")}` : "",
135
+ ` ${picocolors_1.default.cyan("npm run dev")} ${picocolors_1.default.dim("→ start local dev server")}`,
141
136
  "",
142
137
  ` ${picocolors_1.default.dim("Docs: https://docs.0g.ai")}`,
143
- ].join("\n"));
138
+ ]
139
+ .filter((l) => l !== "")
140
+ .join("\n"));
144
141
  }
145
142
  main().catch((e) => {
146
143
  console.error(e);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface Features {
2
+ projectName: string;
3
+ contracts: boolean;
4
+ storage: boolean;
5
+ compute: boolean;
6
+ }
7
+ export declare function scaffold(features: Features, targetDir: string): void;
8
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAID,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAoC7D"}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.scaffold = scaffold;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const TEMPLATES_DIR = path_1.default.join(__dirname, "..", "templates");
10
+ function scaffold(features, targetDir) {
11
+ const { contracts, storage, compute } = features;
12
+ // 0. Ensure target directory exists
13
+ fs_extra_1.default.ensureDirSync(targetDir);
14
+ // 1. Always copy base
15
+ fs_extra_1.default.copySync(path_1.default.join(TEMPLATES_DIR, "base"), targetDir, { filter: noDeps });
16
+ // 2. Conditionally copy feature files (lib + components only — no package.json overlap)
17
+ if (contracts) {
18
+ fs_extra_1.default.copySync(path_1.default.join(TEMPLATES_DIR, "contracts"), targetDir, { filter: noDeps });
19
+ }
20
+ if (storage) {
21
+ fs_extra_1.default.copySync(path_1.default.join(TEMPLATES_DIR, "storage"), targetDir, { filter: noDeps });
22
+ }
23
+ if (compute) {
24
+ fs_extra_1.default.copySync(path_1.default.join(TEMPLATES_DIR, "compute"), targetDir, { filter: noDeps });
25
+ }
26
+ // 3. Generate dynamic files
27
+ writeRootPackageJson(targetDir, features);
28
+ writeWebPackageJson(targetDir, features);
29
+ writeEnvExample(targetDir, features);
30
+ writePageTsx(targetDir, features);
31
+ writePageCss(targetDir);
32
+ writeReadme(targetDir, features);
33
+ // 4. Rename _gitignore → .gitignore
34
+ const gi = path_1.default.join(targetDir, "_gitignore");
35
+ if (fs_extra_1.default.existsSync(gi))
36
+ fs_extra_1.default.moveSync(gi, path_1.default.join(targetDir, ".gitignore"));
37
+ // 5. Copy .env.example → .env.local
38
+ const envEx = path_1.default.join(targetDir, "packages", "web", ".env.example");
39
+ const envLocal = path_1.default.join(targetDir, "packages", "web", ".env.local");
40
+ if (fs_extra_1.default.existsSync(envEx) && !fs_extra_1.default.existsSync(envLocal))
41
+ fs_extra_1.default.copySync(envEx, envLocal);
42
+ }
43
+ function noDeps(src) {
44
+ return !src.includes("node_modules") && !src.includes(".next");
45
+ }
46
+ function writeRootPackageJson(targetDir, { projectName, contracts, storage }) {
47
+ const workspaces = ["packages/web"];
48
+ if (contracts)
49
+ workspaces.push("packages/contracts");
50
+ const scripts = {
51
+ dev: "npm run dev --workspace=packages/web",
52
+ build: "npm run build --workspace=packages/web",
53
+ };
54
+ if (storage) {
55
+ scripts.postinstall = "node scripts/patch-0g-sdk.js";
56
+ }
57
+ if (contracts) {
58
+ scripts.deploy = "npm run compile --workspace=packages/contracts && npm run deploy --workspace=packages/contracts";
59
+ scripts.verify = "npm run verify --workspace=packages/contracts";
60
+ }
61
+ fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "package.json"), JSON.stringify({ name: projectName, version: "0.1.0", private: true, workspaces, scripts }, null, 2));
62
+ }
63
+ function writeWebPackageJson(targetDir, { storage, compute }) {
64
+ const deps = {
65
+ "@tanstack/react-query": "^5.62.0",
66
+ next: "^15.0.0",
67
+ react: "^19.0.0",
68
+ "react-dom": "^19.0.0",
69
+ viem: "^2.21.0",
70
+ wagmi: "^2.13.0",
71
+ };
72
+ if (storage) {
73
+ deps["@0glabs/0g-ts-sdk"] = "^0.3.3";
74
+ deps["ethers"] = "^6.13.0";
75
+ }
76
+ if (compute) {
77
+ deps["@0glabs/0g-serving-broker"] = "0.6.2";
78
+ deps["openai"] = "^4.28.0";
79
+ if (!deps["ethers"])
80
+ deps["ethers"] = "^6.13.0";
81
+ }
82
+ const pkg = {
83
+ name: "web",
84
+ version: "0.1.0",
85
+ private: true,
86
+ scripts: { dev: "next dev", build: "next build", start: "next start", lint: "next lint" },
87
+ dependencies: deps,
88
+ devDependencies: {
89
+ "@types/node": "^22.0.0",
90
+ "@types/react": "^19.0.0",
91
+ "@types/react-dom": "^19.0.0",
92
+ typescript: "^5.7.0",
93
+ },
94
+ };
95
+ fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "packages", "web", "package.json"), JSON.stringify(pkg, null, 2));
96
+ }
97
+ function writeEnvExample(targetDir, { contracts, storage, compute }) {
98
+ const lines = [
99
+ "# 0G Galileo Testnet",
100
+ "NEXT_PUBLIC_CHAIN_ID=16602",
101
+ "NEXT_PUBLIC_RPC_URL=https://evmrpc-testnet.0g.ai",
102
+ ];
103
+ if (storage) {
104
+ lines.push("STORAGE_INDEXER_RPC=https://indexer-storage-testnet-turbo.0g.ai");
105
+ }
106
+ if (compute || contracts) {
107
+ lines.push("");
108
+ lines.push("# Private key — used server-side for compute inference payments and/or Hardhat deploy");
109
+ lines.push("# Never committed or exposed to the browser. Get testnet OG at https://faucet.0g.ai");
110
+ lines.push("PRIVATE_KEY=");
111
+ }
112
+ if (storage && !contracts) {
113
+ lines.push("");
114
+ lines.push("# Private key for signing storage transactions — never commit this");
115
+ lines.push("# Get testnet OG at https://faucet.0g.ai");
116
+ lines.push("PRIVATE_KEY=");
117
+ }
118
+ if (contracts) {
119
+ lines.push("");
120
+ lines.push("# Populated automatically after `npm run deploy`");
121
+ lines.push("NEXT_PUBLIC_CONTRACT_ADDRESS=");
122
+ }
123
+ fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "packages", "web", ".env.example"), lines.join("\n") + "\n");
124
+ }
125
+ function writePageTsx(targetDir, { storage, compute }) {
126
+ const hasFeatures = storage || compute;
127
+ const imports = [
128
+ ...(storage ? [`import { StorageSection } from "@/components/StorageSection";`] : []),
129
+ ...(compute ? [`import { ComputeSection } from "@/components/ComputeSection";`] : []),
130
+ ];
131
+ const body = hasFeatures
132
+ ? `
133
+ return (
134
+ <main className={styles.main}>
135
+ ${storage ? "<StorageSection />" : ""}
136
+ ${compute ? "<ComputeSection />" : ""}
137
+ </main>
138
+ );`
139
+ : `
140
+ return (
141
+ <main className={styles.landing}>
142
+ <div className={styles.card}>
143
+ <h1 className={styles.title}><span className={styles.accent}>create</span>-0g-app</h1>
144
+ <p className={styles.subtitle}>Your 0G app is ready. Start editing:</p>
145
+ <ul className={styles.steps}>
146
+ <li>
147
+ <span className={styles.label}>Frontend</span>
148
+ <code className={styles.path}>packages/web/app/page.tsx</code>
149
+ </li>
150
+ </ul>
151
+ <div className={styles.links}>
152
+ <a href="https://docs.0g.ai" target="_blank" rel="noopener noreferrer">Docs ↗</a>
153
+ <a href="https://faucet.0g.ai" target="_blank" rel="noopener noreferrer">Faucet ↗</a>
154
+ <a href="https://chainscan-galileo.0g.ai" target="_blank" rel="noopener noreferrer">Explorer ↗</a>
155
+ </div>
156
+ </div>
157
+ </main>
158
+ );`;
159
+ const content = `"use client";
160
+ import styles from "./page.module.css";
161
+ ${imports.join("\n")}
162
+
163
+ export default function Home() {${body}
164
+ }
165
+ `;
166
+ fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "packages", "web", "app", "page.tsx"), content);
167
+ }
168
+ function writePageCss(targetDir) {
169
+ const css = `
170
+ .main {
171
+ max-width: 800px;
172
+ margin: 0 auto;
173
+ padding: 32px 24px 80px;
174
+ }
175
+
176
+ /* Landing (no features selected) */
177
+ .landing {
178
+ min-height: calc(100vh - 56px);
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ padding: 24px;
183
+ }
184
+ .card { display: flex; flex-direction: column; gap: 28px; max-width: 480px; width: 100%; }
185
+ .title { font-size: 2.2rem; font-weight: 700; letter-spacing: -0.04em; }
186
+ .accent { color: var(--accent); }
187
+ .subtitle { color: var(--muted); font-size: 0.95rem; margin-top: -16px; }
188
+ .steps { list-style: none; display: flex; flex-direction: column; gap: 12px; }
189
+ .steps li {
190
+ display: flex; flex-direction: column; gap: 6px;
191
+ background: var(--surface); border: 1px solid var(--border);
192
+ border-radius: 10px; padding: 14px 16px;
193
+ }
194
+ .label { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--accent); }
195
+ .path { font-family: monospace; font-size: 0.9rem; }
196
+ .links { display: flex; gap: 20px; }
197
+ .links a { font-size: 0.85rem; color: var(--muted); text-decoration: none; transition: color 0.15s; }
198
+ .links a:hover { color: var(--accent); }
199
+ `.trimStart();
200
+ fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "packages", "web", "app", "page.module.css"), css);
201
+ }
202
+ function writeReadme(targetDir, { projectName, contracts, storage, compute }) {
203
+ const lines = [
204
+ `# ${projectName}`,
205
+ "",
206
+ "Built with [create-0g-app](https://www.npmjs.com/package/create-0g-app) on the [0G network](https://0g.ai).",
207
+ "",
208
+ "## Quick Start",
209
+ "",
210
+ "```bash",
211
+ "npm install",
212
+ "cp packages/web/.env.example packages/web/.env.local",
213
+ "# Edit .env.local with your config",
214
+ "npm run dev",
215
+ "```",
216
+ ];
217
+ if (contracts) {
218
+ lines.push("", "## Deploy Contract", "", "```bash", "npm run deploy", "npm run verify", "```");
219
+ }
220
+ if (storage) {
221
+ lines.push("", "## Storage", "", "Files are uploaded to 0G decentralized storage via `@0glabs/0g-ts-sdk`.", "Edit `packages/web/components/StorageSection.tsx` to customize.");
222
+ }
223
+ if (compute) {
224
+ lines.push("", "## Compute", "", "AI inference is routed through the 0G compute network via `@0glabs/0g-serving-broker`.", "Edit `packages/web/components/ComputeSection.tsx` to customize.");
225
+ }
226
+ lines.push("", "## Resources", "", "- [0G Docs](https://docs.0g.ai)", "- [Faucet](https://faucet.0g.ai)", "- [Explorer](https://chainscan-galileo.0g.ai)");
227
+ fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "README.md"), lines.join("\n") + "\n");
228
+ }
229
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-0g-app",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Zero-config scaffold CLI for building on the 0G decentralized AI network",
5
5
  "bin": {
6
6
  "create-0g-app": "./dist/index.js"
@@ -15,7 +15,14 @@
15
15
  "start": "node dist/index.js",
16
16
  "prepare": "npm run build"
17
17
  },
18
- "keywords": ["0g", "scaffold", "cli", "web3", "ai", "decentralized"],
18
+ "keywords": [
19
+ "0g",
20
+ "scaffold",
21
+ "cli",
22
+ "web3",
23
+ "ai",
24
+ "decentralized"
25
+ ],
19
26
  "license": "MIT",
20
27
  "dependencies": {
21
28
  "@clack/prompts": "^0.9.1",
@@ -1,20 +1,11 @@
1
- # deps
2
1
  node_modules/
3
-
4
- # Next.js
5
2
  packages/web/.next/
6
3
  packages/web/out/
7
-
8
- # Hardhat
9
4
  packages/contracts/artifacts/
10
5
  packages/contracts/cache/
11
6
  packages/contracts/typechain-types/
12
7
  packages/contracts/.deployed-address
13
-
14
- # env — never commit private keys
15
8
  packages/web/.env.local
16
9
  packages/web/.env
17
-
18
- # misc
19
10
  .DS_Store
20
11
  *.log
@@ -0,0 +1,42 @@
1
+ import type { Metadata } from "next";
2
+ import { Geist } from "next/font/google";
3
+ import { Providers } from "./providers";
4
+ import { Navbar } from "@/components/Navbar";
5
+ import "./globals.css";
6
+
7
+ const geist = Geist({ subsets: ["latin"] });
8
+
9
+ export const metadata: Metadata = {
10
+ title: "create-0g-app",
11
+ description: "Decentralized app powered by 0G",
12
+ };
13
+
14
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
15
+ const missingKey = !process.env.PRIVATE_KEY;
16
+
17
+ return (
18
+ <html lang="en">
19
+ <body className={geist.className}>
20
+ <Providers>
21
+ <Navbar />
22
+ {missingKey && (
23
+ <div style={{
24
+ background: "#fef3c7",
25
+ borderBottom: "1px solid #f59e0b",
26
+ color: "#92400e",
27
+ fontSize: "0.85rem",
28
+ padding: "10px 24px",
29
+ }}>
30
+ ⚠ <strong>PRIVATE_KEY</strong> is not set.
31
+ Add it to <code>packages/web/.env.local</code> to enable storage and compute.{" "}
32
+ <a href="https://faucet.0g.ai" target="_blank" rel="noopener noreferrer" style={{ color: "#92400e", fontWeight: 600 }}>
33
+ Get testnet OG ↗
34
+ </a>
35
+ </div>
36
+ )}
37
+ {children}
38
+ </Providers>
39
+ </body>
40
+ </html>
41
+ );
42
+ }
@@ -11,12 +11,6 @@
11
11
  z-index: 10;
12
12
  }
13
13
 
14
- .left {
15
- display: flex;
16
- align-items: center;
17
- gap: 24px;
18
- }
19
-
20
14
  .logo {
21
15
  font-size: 1rem;
22
16
  font-weight: 700;
@@ -24,35 +18,9 @@
24
18
  color: var(--text);
25
19
  text-decoration: none;
26
20
  }
21
+ .logo:hover { text-decoration: none; }
27
22
 
28
- .accent {
29
- color: var(--accent);
30
- }
31
-
32
- .tabs {
33
- display: flex;
34
- gap: 4px;
35
- }
36
-
37
- .tab {
38
- padding: 5px 12px;
39
- border-radius: 6px;
40
- font-size: 0.875rem;
41
- color: var(--muted);
42
- text-decoration: none;
43
- transition: color 0.15s, background 0.15s;
44
- }
45
-
46
- .tab:hover {
47
- color: var(--text);
48
- background: var(--surface);
49
- }
50
-
51
- .active {
52
- color: var(--text);
53
- background: var(--surface);
54
- border: 1px solid var(--border);
55
- }
23
+ .accent { color: var(--accent); }
56
24
 
57
25
  .right {
58
26
  display: flex;
@@ -1,30 +1,18 @@
1
1
  "use client";
2
2
  import Link from "next/link";
3
- import { usePathname } from "next/navigation";
4
3
  import { useAccount, useConnect, useDisconnect } from "wagmi";
5
4
  import styles from "./Navbar.module.css";
6
5
 
7
6
  export function Navbar() {
8
- const pathname = usePathname();
9
7
  const { address, isConnected } = useAccount();
10
8
  const { connect, connectors } = useConnect();
11
9
  const { disconnect } = useDisconnect();
12
10
 
13
11
  return (
14
12
  <nav className={styles.nav}>
15
- <div className={styles.left}>
16
- <Link href="/" className={styles.logo}>
17
- <span className={styles.accent}>create</span>-0g-app
18
- </Link>
19
- <div className={styles.tabs}>
20
- <Link
21
- href="/storage"
22
- className={`${styles.tab} ${pathname === "/storage" ? styles.active : ""}`}
23
- >
24
- Storage
25
- </Link>
26
- </div>
27
- </div>
13
+ <Link href="/" className={styles.logo}>
14
+ <span className={styles.accent}>create</span>-0g-app
15
+ </Link>
28
16
  <div className={styles.right}>
29
17
  {isConnected ? (
30
18
  <>
@@ -3,11 +3,11 @@ import { defineChain } from "viem";
3
3
  import { injected, metaMask } from "wagmi/connectors";
4
4
 
5
5
  export const galileo = defineChain({
6
- id: 16601,
6
+ id: 16602,
7
7
  name: "0G Galileo Testnet",
8
8
  nativeCurrency: { name: "OG", symbol: "OG", decimals: 18 },
9
9
  rpcUrls: {
10
- default: { http: [process.env.NEXT_PUBLIC_RPC_URL ?? "https://evmrpc-test.0g.ai"] },
10
+ default: { http: [process.env.NEXT_PUBLIC_RPC_URL ?? "https://evmrpc-testnet.0g.ai"] },
11
11
  },
12
12
  blockExplorers: {
13
13
  default: { name: "0G Chainscan", url: "https://chainscan-galileo.0g.ai" },
@@ -3,23 +3,12 @@ import webpack from "webpack";
3
3
 
4
4
  const nextConfig: NextConfig = {
5
5
  webpack: (config) => {
6
- // Strip the `node:` URI scheme — webpack 5 doesn't handle it by default
7
- // but already knows how to resolve `crypto`, `stream`, etc. without it.
8
6
  config.plugins.push(
9
7
  new webpack.NormalModuleReplacementPlugin(/^node:/, (resource: { request: string }) => {
10
8
  resource.request = resource.request.replace(/^node:/, "");
11
9
  })
12
10
  );
13
-
14
- // Prevent bundling of Node-only modules in the browser
15
- config.resolve.fallback = {
16
- fs: false,
17
- net: false,
18
- tls: false,
19
- dns: false,
20
- child_process: false,
21
- };
22
-
11
+ config.resolve.fallback = { fs: false, net: false, tls: false, dns: false, child_process: false };
23
12
  return config;
24
13
  },
25
14
  };