EcoContent Auditor
EcoContent Auditor
Analyze and reduce the digital carbon footprint of your website content.
Solo developers, indie hackers, and small marketing teams spend countless hours creating and optimizing product pages, blog posts, and documentation. While focused on SEO and conversion, they often overlook the environmental impact of their digital assets. Large, unoptimized images and videos, inefficient fonts, and heavy CSS/JS files lead to increased data transfer and storage, contributing directly to a higher digital carbon footprint. There's no simple, budget-friendly tool specifically designed for this audience to easily quantify, track, and reduce the environmental impact of their content, leading to slower page loads, higher hosting costs, and a missed opportunity to market their commitment to sustainability. They lack actionable insights tailored to content assets, wasting time trying to manually identify and fix issues.
EcoContent Auditor provides a simple, actionable platform for solo developers and small teams to assess and optimize their website's content for sustainability. Users input a URL, and our system scans for digital assets (images, videos, fonts, scripts). It then generates a 'Digital Carbon Score' based on asset size, type, and estimated data transfer. The core feature provides specific, prioritized recommendations: suggesting WebP conversion for images, identifying oversized videos, recommending font subsetting, and highlighting areas for lazy loading. A dashboard tracks progress over time, showing the reduction in estimated carbon footprint. What makes it unique is its focus on content assets specifically, offering a 'sustainability score' rather than just a performance score, enabling creators to align their digital presence with their environmental values and communicate that commitment to their audience.
Tech Stack
System Architecture
ββββββββββββββββββββ
β Client (Browser)β
β (Next.js React) β
ββββββββββββ¬ββββββββ
β
β HTTP Request (URL for Audit)
βΌ
ββββββββββββββββββββ
β Next.js Server β
β (API Routes) β
ββββββββββββββββββββ€
β - Authenticationβ
β - URL/Asset Fetchβ
β - Content Scan β
β - Report Gen. β
ββββββββββββ¬ββββββββ
β
βββββββββββΌββββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββ βββββββββββββ βββββββββββββ
β PostgreSQLβ β Resend β β Stripe β
β (Supabase)β β (Emails) β β (Payments)β
βββββββββββββ βββββββββββββ βββββββββββββDatabase Schema
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE audits (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
url TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending', -- pending, processing, completed, failed
estimated_carbon_g_initial NUMERIC(10, 2), -- estimated carbon footprint before optimization
estimated_carbon_g_optimized NUMERIC(10, 2), -- estimated carbon footprint if recommendations applied
score NUMERIC(5, 2), -- e.g., 0-100 score, higher is better
report_summary JSONB, -- Store high-level report data
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_audits_user_id ON audits(user_id);
CREATE INDEX idx_audits_status ON audits(status);
CREATE TABLE audit_assets (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
audit_id UUID REFERENCES audits(id) ON DELETE CASCADE,
asset_type TEXT NOT NULL, -- e.g., 'image', 'video', 'font', 'css', 'js'
asset_url TEXT NOT NULL,
original_size_kb NUMERIC(10, 2) NOT NULL,
potential_savings_kb NUMERIC(10, 2) DEFAULT 0,
estimated_carbon_impact_g NUMERIC(10, 2) DEFAULT 0,
recommendation TEXT, -- e.g., 'Compress to WebP', 'Lazy Load', 'Sub-set font'
is_optimized BOOLEAN DEFAULT FALSE, -- To track if recommendation was applied (future feature)
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_audit_assets_audit_id ON audit_assets(audit_id);
CREATE TABLE subscriptions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
stripe_customer_id TEXT UNIQUE NOT NULL,
stripe_subscription_id TEXT UNIQUE,
plan TEXT NOT NULL, -- e.g., 'free', 'basic', 'pro'
status TEXT NOT NULL, -- e.g., 'active', 'canceled', 'past_due'
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 subscriptions(user_id);
CREATE INDEX idx_subscriptions_stripe_customer_id ON subscriptions(stripe_customer_id);API Endpoints
/api/auth/signupRegisters a new user with email and password./api/auth/loginAuthenticates a user and returns a session token./api/userRetrieves the currently authenticated user's profile./api/auditSubmits a URL for a new content sustainability audit. Initiates background processing./api/auditsRetrieves a list of all audits performed by the authenticated user./api/audits/[id]Retrieves a detailed report for a specific audit by ID./api/stripe/checkout-sessionCreates a Stripe checkout session for a new subscription./api/stripe/webhookStripe webhook endpoint to handle subscription status changes and payments.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
API CostPilot
Real-time API expense tracking, forecasting, and optimization for developers.
ClientFlow Metrics
Custom client progress tracking for health & wellness practitioners.
DevRecall
Spaced repetition for developers' code and concepts. Learn once, retain forever.
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!)