GreenPage Guardian

SustainabilityIntermediateJan 16, 2026

GreenPage Guardian

Monitor website efficiency, reduce digital carbon footprint, and display a verifiable green badge.

The Problem

Solo developers and small teams often build and deploy websites with a strong focus on functionality and initial performance, but rarely consider the long-term environmental impact of their digital infrastructure. They lack easy-to-use, continuous tools to monitor their website's 'digital carbon footprint' – factors like page size, excessive asset loading, inefficient code, and the energy sources of their hosting provider. Manually checking tools like Lighthouse is time-consuming and doesn't provide continuous tracking or direct, actionable sustainability insights. This oversight can lead to slower sites, higher energy consumption (both for visitors and servers), and missed opportunities to attract eco-conscious users. There's no simple, automated way for these builders to identify specific areas for improvement, quantify their site's 'greenness,' or proudly display their efforts without significant research or complex integrations, costing them hours of manual analysis and potential user trust.

The Solution

GreenPage Guardian provides an automated, continuous monitoring service that evaluates website efficiency and sustainability. Users simply add their website URL, and our system regularly performs deep scans, analyzing page weight, asset optimization, network requests, and even attempting to infer hosting provider's green credentials (if publicly available). The core solution offers a dashboard displaying a 'Green Score' alongside actionable recommendations (e.g., compress images, lazy load scripts, consider a greener CDN). A unique differentiator is the embeddable, verifiable 'Green Badge' that updates dynamically based on the latest scan, allowing developers to proudly showcase their commitment to sustainable web practices. The product simplifies complex sustainability metrics into an understandable, actionable format, empowering developers to optimize their sites for both performance and planetary health, attracting a growing segment of environmentally aware users.

Tech Stack

Frontend
Next.js 14ReactTailwind CSSshadcn/ui
Backend
Next.js API Routes (Edge Functions)Node.js
Database
PostgreSQL (Supabase)
APIs
Stripe (for subscriptions)Resend (for email notifications)Custom external API for website scanning (e.g., headless browser service or integrating open-source tools like Lighthouse CI)

System Architecture

Database Schema

-- Users Table
CREATE TABLE public.users (
  id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
  email TEXT UNIQUE NOT NULL,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  full_name TEXT,
  avatar_url TEXT,
  billing_id TEXT -- Stripe Customer ID
);
COMMENT ON TABLE public.users IS 'Stores user profiles linked to Supabase Auth.';
COMMENT ON COLUMN public.users.billing_id IS 'Stripe Customer ID for billing purposes.';

-- Websites Table
CREATE TABLE public.websites (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID NOT NULL REFERENCES public.users(id) ON DELETE CASCADE,
  url TEXT UNIQUE NOT NULL,
  name TEXT,
  last_scanned_at TIMESTAMP WITH TIME ZONE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  scan_frequency TEXT DEFAULT 'daily', -- 'daily', 'weekly', 'monthly'
  is_active BOOLEAN DEFAULT TRUE,
  badge_slug TEXT UNIQUE DEFAULT gen_random_uuid() -- Unique identifier for public badge
);
CREATE INDEX idx_websites_user_id ON public.websites(user_id);
CREATE INDEX idx_websites_badge_slug ON public.websites(badge_slug);
COMMENT ON TABLE public.websites IS 'Stores websites added by users for monitoring.';
COMMENT ON COLUMN public.websites.url IS 'The URL of the website to monitor.';
COMMENT ON COLUMN public.websites.badge_slug IS 'Unique slug for embedding the public green badge.';

-- Scan Results Table
CREATE TABLE public.scan_results (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  website_id UUID NOT NULL REFERENCES public.websites(id) ON DELETE CASCADE,
  scanned_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  green_score INT NOT NULL, -- 0-100 score
  page_weight_kb INT,
  num_requests INT,
  asset_optimization_score INT, -- 0-100
  hosting_green_rating TEXT, -- e.g., 'A+', 'B', 'C', 'Unknown'
  recommendations JSONB, -- JSON array of actionable recommendations
  raw_data JSONB -- Raw data from the scanning service
);
CREATE INDEX idx_scan_results_website_id ON public.scan_results(website_id);
CREATE INDEX idx_scan_results_scanned_at ON public.scan_results(scanned_at DESC);
COMMENT ON TABLE public.scan_results IS 'Stores detailed results of each website scan.';
COMMENT ON COLUMN public.scan_results.green_score IS 'Overall green score for the website (0-100).';
COMMENT ON COLUMN public.scan_results.recommendations IS 'JSON array of actionable tips for improvement.';

-- Subscriptions Table (Stripe integration)
CREATE TABLE public.subscriptions (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID NOT NULL REFERENCES public.users(id) ON DELETE CASCADE,
  stripe_customer_id TEXT NOT NULL,
  stripe_subscription_id TEXT NOT NULL UNIQUE,
  stripe_price_id TEXT NOT NULL,
  status TEXT NOT NULL, -- 'active', 'canceled', 'past_due', 'unpaid'
  current_period_start TIMESTAMP WITH TIME ZONE,
  current_period_end TIMESTAMP WITH TIME ZONE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_subscriptions_user_id ON public.subscriptions(user_id);
CREATE INDEX idx_subscriptions_stripe_customer_id ON public.subscriptions(stripe_customer_id);
COMMENT ON TABLE public.subscriptions IS 'Manages user subscriptions linked to Stripe.';

API Endpoints

POST/api/auth/signupUser registration with email and password (handled by Supabase Auth).
POST/api/auth/loginUser login (handled by Supabase Auth).
GET/api/userGet current authenticated user's profile.
PUT/api/userUpdate current authenticated user's profile.
GET/api/websitesGet all websites for the authenticated user.
POST/api/websitesAdd a new website for monitoring.
GET/api/websites/[id]Get a specific website and its latest scan results.
PUT/api/websites/[id]Update a specific website's details (e.g., scan frequency).
DELETE/api/websites/[id]Delete a website from monitoring.
POST/api/websites/[id]/scanManually trigger a scan for a specific website.
GET/api/websites/[id]/resultsGet all historical scan results for a specific website.
GET/api/badge/[slug]Public endpoint to retrieve green badge data for embedding.
POST/api/stripe/webhookStripe webhook endpoint to handle subscription changes.
POST/api/stripe/create-checkout-sessionCreate a Stripe checkout session for a new subscription.
GET/api/subscriptionGet current user's subscription status.
šŸ¤–

Start Building with AI

Copy this prompt for Cursor, v0, Bolt, or any AI coding assistant

šŸ‘·

...

builders copied today

Found this useful? Share it with your builder friends!

BD

BuilderDaily Team

Verified

Indie hackers and full-stack engineers creating validated Micro-SaaS blueprints with production-ready tech stacks.

Sustainability
Code TestedSchema ValidatedProduction Ready
Coming Soon in Beta

Gap Alert

Today's gap expires in ~14 hours

Get tomorrow's blueprint delivered to your inbox so you never miss a profitable idea.

(Email delivery launching soon — sign up to be first!)

No spam, ever•Unsubscribe anytime