GreenPage Guardian
GreenPage Guardian
Monitor website efficiency, reduce digital carbon footprint, and display a verifiable green badge.
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.
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
System Architecture
āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā
ā Client ā ā External APIs ā
ā (Web Browser) ā ā (Website Scan, ā
āāāāāāāāāā¬āāāāāāāāā ā Hosting Data) ā
ā HTTP/S āāāāāāāāāā¬āāāāāāāāā
ā¼ ā HTTP/S
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā Next.js App (Vercel Edge) ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā ā
ā ā Next.js Frontend ā ā ā
ā ā (Dashboard, Settings, Public Badges) āāā¼āāāā¤
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā ā
ā ā Next.js API Routes āāā¼āāāā¤
ā ā (Auth, Website Management, Scan Trigger, Webhooks) ā ā ā
ā āāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāā¬āāāāāāāāāāāā¬āāāāāāāāāāā ā ā
āāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāā¼āāāāāāāāāāāā¼āāāāāāāāāāāāā ā
ā ā ā ā
ā ā ā ā
ā¼ ā¼ ā¼ ā¼
āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā
ā Supabase Auth ā ā Supabase DB ā ā Stripe ā ā Resend ā
ā (User Mgmt) ā ā (PostgreSQL) ā ā (Payments) ā ā (Emails) ā
āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā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
/api/auth/signupUser registration with email and password (handled by Supabase Auth)./api/auth/loginUser login (handled by Supabase Auth)./api/userGet current authenticated user's profile./api/userUpdate current authenticated user's profile./api/websitesGet all websites for the authenticated user./api/websitesAdd a new website for monitoring./api/websites/[id]Get a specific website and its latest scan results./api/websites/[id]Update a specific website's details (e.g., scan frequency)./api/websites/[id]Delete a website from monitoring./api/websites/[id]/scanManually trigger a scan for a specific website./api/websites/[id]/resultsGet all historical scan results for a specific website./api/badge/[slug]Public endpoint to retrieve green badge data for embedding./api/stripe/webhookStripe webhook endpoint to handle subscription changes./api/stripe/create-checkout-sessionCreate a Stripe checkout session for a new subscription./api/subscriptionGet current user's subscription status.Start Building with AI
Copy this prompt for Cursor, v0, Bolt, or any AI coding assistant
BuilderDaily Team
VerifiedIndie hackers and full-stack engineers creating validated Micro-SaaS blueprints with production-ready tech stacks.
Related Blueprints
More Micro-SaaS ideas you might like to build
EcoByte Dashboard
Track and reduce your digital carbon footprint effortlessly.
CarePath Flow
Personalize patient education with dynamic, interactive care flows. Boost compliance.
CodeSpark Embeds
Embed interactive, executable code sandboxes directly into your educational content.
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!)