FeatureBeacon
FeatureBeacon
Automate product updates: In-app widgets, email, and social from one place.
Solo developers and small teams building SaaS products frequently waste valuable time manually announcing new features and product updates. Each release cycle, they spend 2-4 hours drafting release notes, crafting emails, and posting individually to Twitter or LinkedIn. This fragmented process leads to inconsistent messaging, low feature adoption, and missed opportunities to re-engage users. Existing solutions are often enterprise-focused, too expensive, or lack the developer-friendly integrations and automation needed by budget-conscious indie hackers. As a result, many new features go unnoticed, directly impacting user retention and growth, turning exciting developments into uncelebrated efforts.
FeatureBeacon streamlines your entire product update workflow into one intuitive platform. It provides a centralized, markdown-first editor to draft rich product announcements. From there, you can publish simultaneously to multiple channels: an embeddable, customizable in-app widget (React component), automated email digests via Resend, and configured social media accounts. Our lightweight, developer-first approach means minimal setup and maximum impact. Key features include scheduling, basic engagement analytics, and a simple API for deep integration. FeatureBeacon saves hours per release, ensures consistent communication, boosts feature adoption, and helps solo devs re-engage their user base without building custom solutions or breaking the bank.
Tech Stack
System Architecture
βββββββββββββββββββ ββββββββββββββ
β Client β β Resend β
β (Browser/App) β β (Email API)β
βββββββββββ¬ββββββββ ββββββββββββββ
β β²
β API Requests β
βΌ β Email Notifications
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Next.js 14 Application (Vercel) β
β βββββββββββββββββββββββββ ββββββββββββββββββββββββββ β
β β Frontend (React) βββββ€ Backend (API Routes) ββββΌβββββββββββββΊ Stripe (Payments)
β β - Dashboard β β - Auth (Supabase) β β
β β - Update Editor β β - CRUD Updates β β
β β - Widget Config β β - Widget Embed API β β
β βββββββββββββββββββββββββ β - User Management β β
β β - Channel Integrationsβ β
β βββββββββββββ¬βββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββ
β Database Queries
βΌ
βββββββββββββββββββ
β Supabase β
β - PostgreSQL β
β - Auth β
βββββββββββββββββββ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 workspaces (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
owner_id UUID REFERENCES users(id) ON DELETE CASCADE NOT NULL,
name TEXT NOT NULL,
slug TEXT UNIQUE NOT NULL, -- Used for public changelog URL or widget identification
stripe_customer_id TEXT,
subscription_plan TEXT DEFAULT 'free',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE updates (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL, -- Stored as Markdown
status TEXT DEFAULT 'draft' CHECK (status IN ('draft', 'published', 'scheduled')) NOT NULL,
publish_at TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_updates_workspace_id_publish_at ON updates(workspace_id, publish_at DESC) WHERE status = 'published';
CREATE TABLE update_channels (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE NOT NULL,
type TEXT NOT NULL CHECK (type IN ('in_app_widget', 'email', 'twitter', 'linkedin')),
config JSONB, -- Stores API keys, template IDs, etc.
enabled BOOLEAN DEFAULT FALSE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE UNIQUE INDEX idx_update_channels_workspace_id_type ON update_channels(workspace_id, type);
CREATE TABLE in_app_widgets (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE NOT NULL,
settings JSONB, -- Stores colors, positions, custom CSS, etc.
embed_token TEXT UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE subscribers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE NOT NULL,
email TEXT NOT NULL,
is_active BOOLEAN DEFAULT TRUE NOT NULL,
subscribed_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
unsubscribed_at TIMESTAMP WITH TIME ZONE
);
CREATE UNIQUE INDEX idx_subscribers_workspace_id_email ON subscribers(workspace_id, email);
CREATE TABLE update_views (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
update_id UUID REFERENCES updates(id) ON DELETE CASCADE NOT NULL,
workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE NOT NULL,
ip_address INET,
viewed_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_update_views_update_id ON update_views(update_id);API Endpoints
/api/auth/signupRegister a new user and create a default workspace./api/auth/loginLog in an existing user./api/workspacesGet all workspaces for the authenticated user./api/workspaces/:workspaceIdGet a specific workspace by ID./api/workspacesCreate a new workspace./api/workspaces/:workspaceId/updatesGet all updates for a specific workspace./api/workspaces/:workspaceId/updatesCreate a new product update./api/workspaces/:workspaceId/updates/:updateIdGet a specific product update./api/workspaces/:workspaceId/updates/:updateIdUpdate an existing product update./api/workspaces/:workspaceId/updates/:updateIdDelete a product update./api/workspaces/:workspaceId/updates/:updateId/publishPublish a drafted or scheduled update to all enabled channels./api/workspaces/:workspaceId/channelsGet configured channels for a workspace./api/workspaces/:workspaceId/channels/:channelTypeUpdate configuration for a specific channel (e.g., enable/disable email, set API key)./api/widgets/:embedToken/updatesPublic endpoint to retrieve published updates for an in-app widget./api/widgets/:embedToken/viewsRecord a view event for an in-app widget./api/webhooks/stripeStripe webhook for handling subscription events./api/workspaces/:workspaceId/in-app-widget-settingsRetrieve in-app widget settings for a workspace./api/workspaces/:workspaceId/in-app-widget-settingsUpdate in-app widget settings for a workspace (colors, position, etc.)./api/workspaces/:workspaceId/subscribersAdd a new email subscriber to a workspace's update list.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.
EcoContent Auditor
Analyze and reduce the digital carbon footprint of your website content.
ClientFlow Metrics
Custom client progress tracking for health & wellness practitioners.
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!)