Quick Start
Clone juju-template to start any new client project. It ships with all pages, components, and integrations wired up — edit two files and replace the dummy data.
1. Clone the template
Section titled “1. Clone the template”git clone https://github.com/ctrl07/juju-template <client-name>cd <client-name>npm install
# Start fresh git history for this clientrm -rf .gitgit initgit add .git commit -m "init: from juju-template"2. Edit src/config/site.ts
Section titled “2. Edit src/config/site.ts”This is the only file that drives the entire site identity. Every field here propagates automatically to meta tags, JSON-LD schema, nav, footer, contact form, WhatsApp float button, and canonical URLs.
export const site = { name: "Client Business Name", domain: "https://clientdomain.com", tagline: "Short punchy tagline.", contact: { email: "hello@clientdomain.com", phone: "+91XXXXXXXXXX", whatsapp: "+91XXXXXXXXXX", address: { street: "...", city: "Pune", state: "Maharashtra", pin: "411001", country: "IN", }, geo: { lat: "18.5204", lng: "73.8567" }, }, ga4: "", // fill in once client provides G-XXXXXXX web3forms: "", // fill in from web3forms.com cashfree: false, // true only if client needs payments};3. Pick a theme in src/config/theme.ts
Section titled “3. Pick a theme in src/config/theme.ts”Change the one import line to switch the entire visual identity:
import { darkGreen } from "../themes/dark-green"; // default (jujualpha style)// import { darkBlue } from "../themes/dark-blue";// import { darkPurple } from "../themes/dark-purple";// import { lightNeutral } from "../themes/light-neutral";
export const theme: Theme = darkGreen;Or create a custom palette — copy src/themes/dark-green.ts, replace the brand color scale (50–950, 11 stops). Use uicolors.app to generate a full scale from a single hex value.
See Theme system for how the build-time CSS injection works.
4. Replace dummy content in src/data/
Section titled “4. Replace dummy content in src/data/”All pages read from these JSON files — no .astro files need touching for content changes.
| File | What to replace |
|---|---|
pricing.json |
Plan names, prices, features |
faqs.json |
FAQs per page (homepage, webDesign, seo, hosting keys) |
about.json |
Team members, stats, tools |
comparison.json |
Comparison table columns and rows |
homepage.json |
Client logos, process steps |
See Data files for the exact JSON shape of each file.
5. Update astro.config.mjs
Section titled “5. Update astro.config.mjs”export default defineConfig({ site: "https://clientdomain.com", // must match site.ts domain exactly // ...});6. Update public files
Section titled “6. Update public files”public/robots.txt— update the sitemap URLpublic/_redirects— update the www domainpublic/favicon.svg— replace the placeholder “A” mark with the client’s logopublic/og-image.jpg— create a 1200×630 social preview imagepublic/llms.txt— update with real business description and service URLs
7. Swap fonts (if needed)
Section titled “7. Swap fonts (if needed)”If staying with Inter + Plus Jakarta Sans, skip this — variable fonts are already in public/fonts/.
If the client has a different typeface:
- Copy the
.woff2variable font file topublic/fonts/ - Update
theme.fonts.sansandtheme.fonts.displayin the theme file - Update
--font-sans/--font-displaydefaults insrc/styles/global.css
8. Build and verify
Section titled “8. Build and verify”npm run buildShould produce a clean output in dist/. If it passes, the site is ready to deploy.
9. Deploy to Cloudflare Pages
Section titled “9. Deploy to Cloudflare Pages”- Push to a new GitHub repo
- Connect in Cloudflare Pages → Create application → Connect to Git
- Build command:
npm run build, output:dist - Add both
clientdomain.comANDwww.clientdomain.comas custom domains - Set environment variables if using Cashfree (see Environment variables)
10. Post-deploy
Section titled “10. Post-deploy”- Submit sitemap in Google Search Console
- Submit sitemap in Bing Webmaster Tools (feeds Perplexity + ChatGPT)
- Run
node scripts/indexnow.mjsto submit all URLs to Bing/Yandex via IndexNow
Minimum viable start
Section titled “Minimum viable start”The absolute minimum before a client sees the site:
site.ts— name, domain, contact- Theme preset selected
pricing.json— real pricesabout.json— real teamastro.config.mjs— correct domainnpm run buildpasses
Everything else (GA4, Web3Forms key, real FAQs, OG image) can be filled in before launch.