Add GlobalCard marketing website with pricing, blog, and legal pages#1110
Add GlobalCard marketing website with pricing, blog, and legal pages#1110thomaslovaslokoy-ui wants to merge 3 commits intoanthropics:mainfrom
Conversation
This workflow installs Deno and runs linting and tests on push and pull request events.
Full Next.js 14 project for GlobalCard (NorwegianSpark SA) card issuing SaaS landing site with all pages, SEO, and deployment config. Pages: homepage, pricing, blog (3 full articles), reviews, about, contact, careers, privacy policy, terms of service, cookie policy, 404 page. SEO: dynamic sitemap, robots.ts, OG image, JSON-LD structured data, per-page metadata. Deploy: vercel.json with security headers, next.config.js optimized. https://claude.ai/code/session_013ZR6h28v12WmGz9HKLJT4A
thomaslovaslokoy-ui
left a comment
There was a problem hiding this comment.
AI COST PROTECTION — MANDATORY ON EVERY AI APP
Anthropic Console (One-time setup)
- Set hard monthly spend cap at console.anthropic.com → Billing → Usage Limits
- Create ONE separate API key per app (so you can see which app costs what)
Tiered Limits — implement in EVERY app with AI
| Tier | Model | Msg/day | max_tokens | Context window |
|---|---|---|---|---|
| FREE | Haiku | 5 | 300 | Last 3 msgs |
| PRO (149kr+) | Sonnet | 100 | 1500 | Last 20 msgs |
| ENTERPRISE | Sonnet/Opus | ∞ | 4000 | Full history |
Required in every /api/chat route:
// 1. Always set max_tokens — NEVER omit
const model = isPro ? 'claude-sonnet-4-20250514' : 'claude-haiku-4-5-20251001'
const maxTokens = isPro ? 1500 : 300
// 2. Slice context by tier
const contextWindow = isPro ? messages.slice(-20) : messages.slice(-3)
// 3. Rate limiter — 20 req/hr per IP, all tiers
const requests = rateLimiter.get(ip) ?? []
const recent = requests.filter(t => Date.now() - t < 3_600_000)
if (recent.length >= 20) return new Response('Rate limited', { status: 429 })
// 4. Daily message count from DB/session — hard stop by tier
const dailyLimit = tier === 'free' ? 5 : tier === 'pro' ? 100 : Infinity
if (userMsgCount >= dailyLimit) return new Response('Limit reached', { status: 429 })You are deploying ALL NorwegianSpark projects to production. Work through each one sequentially. Do not stop between projects. Fix any errors inline — never ask for permission.
GLOBAL RULES (apply to every project)
- npm install -g vercel if not installed
- Every project must build clean before deploy
- vercel --prod for every project
- After each deploy: git add . && git commit -m "deploy: production" && git push
- Print the live URL after each deploy
- Never ask questions — fix errors and continue
AI COST PROTECTION — verify or add to every project that has AI
Check if /app/api/chat/route.ts or equivalent exists. If it does, ensure:
- max_tokens is always set (FREE=300, PRO=1500, ENTERPRISE=4000)
- Model by tier: FREE=claude-haiku-4-5-20251001, PRO/PAID=claude-sonnet-4-20250514
- Rate limiter: max 20 req/hr per IP using in-memory Map
- Daily message limits: FREE=5msg/day, PRO=100msg/day
- Context window slicing: FREE=last 3 msgs, PRO=last 20 msgs
- Separate ANTHROPIC_API_KEY per project in .env.example
If any of these are missing — add them before deploying.
PROJECT 1 — ToppAgent
cd ~/projects/toppagent (or wherever the repo lives — find it with: find ~ -name "package.json" -path "/toppagent/" | head -1)
npm install
npm run build
Fix any build errors inline
vercel link --yes
vercel --prod
git add . && git commit -m "deploy: toppagent production" && git push
echo "✅ ToppAgent live at:"
PROJECT 2 — YieldNav
cd ~/projects/yieldnav (find with: find ~ -name "package.json" -path "/yieldnav/" | head -1)
npm install
npm run build
Fix any build errors inline
vercel link --yes
vercel --prod
git add . && git commit -m "deploy: yieldnav production" && git push
echo "✅ YieldNav live at:"
PROJECT 3 — Component Studio
cd ~/projects/component-studio (find with: find ~ -name "package.json" -path "/componentstudio*" | head -1)
npm install
npm run build
Fix any build errors inline
vercel link --yes
vercel --prod
git add . && git commit -m "deploy: component-studio production" && git push
echo "✅ Component Studio live at:"
PROJECT 4 — NorwegianSparkHub (if repo exists)
find ~ -name "package.json" -path "norwegiansparkhub*" | head -1
If found: cd into it, build, deploy same pattern as above
AFTER ALL DEPLOYS — print summary:
echo "=== NORWEGIANSPARK DEPLOY SUMMARY ==="
echo "All live URLs:"
list all URLs
echo ""
echo "
echo "1. Go to console.anthropic.com → set monthly hard cap"
echo "2. Verify each project has its own API key"
echo "3. Submit sitemaps at search.google.com/search-console for any new domains"
thomaslovaslokoy-ui
left a comment
There was a problem hiding this comment.
// 1. Always set max_tokens — NEVER omit
const model = isPro ? 'claude-sonnet-4-20250514' : 'claude-haiku-4-5-20251001'
const maxTokens = isPro ? 1500 : 300
// 2. Slice context by tier
const contextWindow = isPro ? messages.slice(-20) : messages.slice(-3)
// 3. Rate limiter — 20 req/hr per IP, all tiers
const requests = rateLimiter.get(ip) ?? []
const recent = requests.filter(t => Date.now() - t < 3_600_000)
if (recent.length >= 20) return new Response('Rate limited', { status: 429 })
// 4. Daily message count from DB/session — hard stop by tier
const dailyLimit = tier === 'free' ? 5 : tier === 'pro' ? 100 : Infinity
if (userMsgCount >= dailyLimit) return new Response('Limit reached', { status: 429 })
thomaslovaslokoy-ui
left a comment
There was a problem hiding this comment.
brainloop-advisor/src/app/privacy/page.tsx
Summary
This PR adds a complete marketing website for GlobalCard, a card issuing infrastructure platform. The site includes pricing tiers, blog posts, customer reviews, company information, and legal documentation.
Key Changes
Core Pages Added:
Components:
SiteNav- Fixed header navigation with mobile menu supportSiteFooter- Footer with links organized by categoryPricingSection- Reusable pricing cards component with feature listsInfrastructure:
Styling:
Notable Implementation Details
mailto:links for email submission (client-side only)https://claude.ai/code/session_013ZR6h28v12WmGz9HKLJT4A