Community service.

Retry creating the skeleton ZIP in a fresh session.

import os, zipfile, json, shutil
from datetime import date

today = date.today().strftime(“%Y-%m-%d”)
root = “/mnt/data/fwhfc-skeleton”
public_dir = os.path.join(root, “public”)
pages_dir = os.path.join(root, “pages”)
api_dir = os.path.join(pages_dir, “api”)
lib_dir = os.path.join(root, “lib”)
components_dir = os.path.join(root, “components”)

for d in [root, public_dir, pages_dir, api_dir, lib_dir, components_dir, os.path.join(public_dir, “downloads”)]:
os.makedirs(d, exist_ok=True)

components = r”””import React from “react”;

export const THEME = {
brandHex: “#0B63F6”,
logoSrc: “/fwhfc-logo.png”
};

export default function Index(){
React.useEffect(()=>{ document.documentElement.style.setProperty(‘–brand’, THEME.brandHex); }, []);
return (

FWHFC logo

Far West Helping Foundation Corp

Skeleton project with your brand color and logo baked in. Plug in your Stripe, PayPal, and email secrets privately in .env.local.

DonatePrograms
);
}
“””
with open(os.path.join(components_dir, “Index.tsx”), “w”) as f:
f.write(components)

with open(os.path.join(pages_dir, “index.tsx”), “w”) as f:
f.write(‘import Index from “@/components/Index”; export default Index;’)

with open(os.path.join(pages_dir, “donate.tsx”), “w”) as f:
f.write(“””export default function Donate(){ return (

Donate

Connect Stripe/PayPal in .env.local. The DonatePage with full UI is included in your previous package; this skeleton keeps secrets out.);}”””)

with open(os.path.join(pages_dir, “programs.tsx”), “w”) as f:
f.write(“””export default function Programs(){ return (

Programs

Add your content here, or copy the richer ProgramsPage from the full starter.);}”””)

env_example = “””NEXT_PUBLIC_SITE_URL=https://www.fwhfc.org
STRIPE_SECRET_KEY=sk_live_REPLACE_ME
STRIPE_WEBHOOK_SECRET=whsec_REPLACE_ME
NEXT_PUBLIC_PAYPAL_DONATE_LINK=https://www.paypal.com/donate/?hosted_button_id=REPLACE_ME
SMTP_HOST=smtp.REPLACE_ME
SMTP_PORT=587
SMTP_USER=REPLACE_ME
SMTP_PASS=REPLACE_ME
EMAIL_FROM=”FWHFC “
NOTIFY_TO=intake@REPLACE_ME
“””
with open(os.path.join(root, “.env.local.example”), “w”) as f:
f.write(env_example)

assets_zip = “/mnt/data/fwhfc-website-assets-2025-10-02.zip”
if os.path.exists(assets_zip):
with zipfile.ZipFile(assets_zip) as z:
for zi in z.infolist():
if zi.filename.startswith(“public/”):
dest_path = os.path.join(root, zi.filename)
os.makedirs(os.path.dirname(dest_path), exist_ok=True)
with z.open(zi) as src, open(dest_path, “wb”) as dst:
shutil.copyfileobj(src, dst)

tsconfig = {“compilerOptions”:{“target”:”es5″,”lib”:[“dom”,”dom.iterable”,”esnext”],”skipLibCheck”:True,”strict”:False,”noEmit”:True,”module”:”esnext”,”moduleResolution”:”node”,”resolveJsonModule”:True,”isolatedModules”:True,”jsx”:”preserve”,”baseUrl”:”.”},”include”:[“next-env.d.ts”,”/.ts”,”/.tsx”],”exclude”:[“node_modules”]}
with open(os.path.join(root, “tsconfig.json”), “w”) as f:
json.dump(tsconfig, f, indent=2)

package_json = {
“name”: “fwhfc-skeleton”,
“private”: True,
“scripts”: { “dev”: “next dev”, “build”: “next build”, “start”: “next start” },
“dependencies”: { “next”: “14.2.5”, “react”: “18.2.0”, “react-dom”: “18.2.0” }
}
with open(os.path.join(root, “package.json”), “w”) as f:
json.dump(package_json, f, indent=2)

with open(os.path.join(root, “README.md”), “w”) as f:
f.write(f”# FWHFC Skeleton Starter — {today}\n\n- Brand color + logo baked in\n- Secrets kept out (use .env.local)\n- Public assets & downloads included if available\n\n## Run\n\nnpm i\ncp .env.local.example .env.local # fill real secrets\nnpm run dev\n\n”)

skeleton_zip = f”/mnt/data/fwhfc-skeleton-{today}.zip”
with zipfile.ZipFile(skeleton_zip, “w”, zipfile.ZIP_DEFLATED) as z:
for base_path, _, files in os.walk(root):
for fname in files:
fpath = os.path.join(base_path, fname)
z.write(fpath, arcname=os.path.relpath(fpath, root))

skeleton_zip