Discover why Lovable skips automated feature tracking and how to track progress, feature completion, and apply best practices for success.

Book a call with an Expert
Starting a new venture? Need to upgrade your web app? RapidDev builds application with your growth in mind.
Feature tracking isn’t automated in Lovable because it depends on human judgments, external systems, and environment access that Lovable deliberately doesn’t assume or run for you — automating it reliably would create brittle, insecure, and often incorrect results. Lovable provides templates and conversational helpers, but it can’t (and shouldn’t) make the final call about what “done” means, nor run arbitrary CI/build/test steps or reach into third-party project tooling without explicit human configuration.
Here are the concrete reasons Lovable leaves feature-tracking to humans or your configured tooling rather than committing to a single automatic system:
Paste the following prompt into Lovable’s chat to add a clear in-repo document plus a small dashboard notice explaining why feature tracking isn’t automated (this teaches teammates and avoids false expectations). This does not implement automatic tracking — it only creates docs/UI that explain the reasons.
// Create docs/why-feature-tracking-not-automated.md with explicit reasons and guidance
// also add a small React component that shows this note in the project dashboard
// Update the dashboard page to import and render the notice near the top.
Create file docs/why-feature-tracking-not-automated.md with this content:
# Why feature tracking isn't automated in this Lovable project
This project does not automatically mark features as "complete" inside Lovable. Reasons:
- Definitions of "done" vary widely between teams and features (UI, tests, migrations, docs, stakeholder acceptance).
- Commits and diffs don't reliably represent product intent.
- Integration with issue trackers, CI, feature flags, and analytics requires credentials and processes outside Lovable.
- Automated checks often need external runners, build artifacts, or DB access; running those outside human control can be insecure or brittle.
- Lovable is chat-first and file-edit-driven; it intentionally doesn't run background agents or terminal commands for you.
If you want automated signals, we recommend integrating with your external CI/issue-tracker and surfacing results here via documentation or a status endpoint.
Create file src/components/FeatureTrackingNotice.tsx with this content:
import React from 'react'
// Small notice component to explain why feature tracking isn't automated
export default function FeatureTrackingNotice() {
return (
<div style={{border: '1px solid #e2e8f0', padding: 12, borderRadius: 8, background: '#fffdfa'}}>
<strong>Why feature tracking isn't automated</strong>
<p style={{margin: '8px 0 0 0', fontSize: 13}}>
Automatic "feature complete" status is intentionally not provided. It requires project-specific rules,
external tooling, and human acceptance. See <code>docs/why-feature-tracking-not-automated.md</code> for details.
</p>
</div>
)
}
Update src/pages/Dashboard.tsx:
- add import: import FeatureTrackingNotice from 'src/components/FeatureTrackingNotice'
- render <FeatureTrackingNotice /> directly under the main page heading or at the top of the main column
Commit message: "docs: explain why feature-tracking isn't automated; add dashboard notice"
What this does: It makes the repository and app explicit about Lovable’s limitation and the rationale — reducing confusion. If you later want automation, do it via external CI/GitHub Actions or a tracked integration (outside Lovable) and then surface its results in Lovable or the docs.
This prompt helps an AI assistant understand your setup and guide you through the fix step by step, without assuming technical knowledge.
Paste the prompts below into Lovable’s chat to add a visible feature checklist and completion tracking. Use the first prompt for a quick single-developer solution (localStorage). Use the second prompt to add persistent team-wide tracking backed by Supabase (requires setting Secrets in Lovable and creating the DB table in Supabase outside Lovable). After each change use Lovable’s Preview to verify and Publish or GitHub sync if you need deeper control.
// Create src/components/FeatureChecklist.tsx
// React component: reads a features array prop and persists checked state to localStorage
import React, {useEffect, useState} from "react";
type Feature = { id: string; title: string; description?: string };
export default function FeatureChecklist({features}: {features: Feature[]}) {
const key = "feature-checklist:v1";
const [checked, setChecked] = useState<Record<string, boolean>>({});
useEffect(() => {
const raw = localStorage.getItem(key);
if (raw) setChecked(JSON.parse(raw));
}, []);
useEffect(() => {
localStorage.setItem(key, JSON.stringify(checked));
}, [checked]);
return (
<div>
{features.map(f => (
<div key={f.id} style={{marginBottom: 12}}>
<label>
<input
type="checkbox"
checked={!!checked[f.id]}
onChange={() => setChecked(prev => ({...prev, [f.id]: !prev[f.id]}))}
/>
<strong style={{marginLeft: 8}}>{f.title}</strong>
</label>
{f.description && <div style={{marginLeft: 24, color: "#666"}}>{f.description}</div>}
</div>
))}
<div style={{marginTop: 16}}>
<small>{Object.values(checked).filter(Boolean).length} / {features.length} complete</small>
</div>
</div>
);
}
// Create src/pages/FeaturesPage.tsx
// Page that imports FeatureChecklist and supplies a canonical features list
import React from "react";
import FeatureChecklist from "../components/FeatureChecklist";
const FEATURES = [
{ id: "signup", title: "User signup flow", description: "Email + password signup" },
{ id: "profile", title: "User profile page", description: "Edit avatar & bio" },
{ id: "payments", title: "Payments integration", description: "Stripe test mode" }
];
export default function FeaturesPage() {
return (
<div style={{padding: 24}}>
<h2>Feature Checklist</h2>
<FeatureChecklist features={FEATURES} />
</div>
);
}
// Update src/App.tsx in the <Routes> block
// Add a route to /features that renders FeaturesPage
// import FeaturesPage at top of file
import FeaturesPage from "./pages/FeaturesPage";
// inside <Routes> add:
<Route path="/features" element={<FeaturesPage />} />
// After these edits use Lovable Preview to open /features and verify the checklist.
<h3>Team persistence with Supabase (persistent, multi-user)</h3>
<ul>
<li><b>What this does:</b> Adds a server API (/api/features) that reads/writes a Supabase table and a frontend page that uses that API. You must set SUPABASE_URL and SUPABASE_KEY via Lovable Secrets UI. Creating the DB table can be done in Supabase UI or via SQL (outside Lovable).</li>
<li><b>Paste into Lovable chat:</b> Request file creates/edits exactly as shown and then use the Secrets UI to set values.</li>
</ul>
// Create src/pages/api/features.ts
// Simple serverless handler: GET returns all features, PATCH toggles completion for a user.
// It reads SUPABASE_URL and SUPABASE_KEY from process.env
import type {NextApiRequest, NextApiResponse} from "next";
import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = process.env.SUPABASE_URL!;
const SUPABASE_KEY = process.env.SUPABASE_KEY!;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
// GET /api/features?userId=...
// PATCH /api/features body: { userId, featureId, completed }
if (req.method === "GET") {
const { userId } = req.query;
const { data, error } = await supabase
.from("features")
.select("*");
if (error) return res.status(500).json({ error: error.message });
// join with user_completions if userId provided
if (userId) {
const { data: comps } = await supabase
.from("feature_completions")
.select("*")
.eq("user_id", userId);
const map = (comps || []).reduce((acc: any, c: any) => ({...acc, [c.feature_id]: true}), {});
return res.json({ features: data, completions: map });
}
return res.json({ features: data });
}
if (req.method === "PATCH") {
const { userId, featureId, completed } = req.body;
if (!userId || !featureId) return res.status(400).json({ error: "userId & featureId required" });
if (completed) {
const { error } = await supabase.from("feature_completions").insert([{ user_id: userId, feature_id: featureId }]);
if (error) return res.status(500).json({ error: error.message });
return res.json({ ok: true });
} else {
const { error } = await supabase.from("feature_completions").delete().match({ user_id: userId, feature_id: featureId });
if (error) return res.status(500).json({ error: error.message });
return res.json({ ok: true });
}
}
res.setHeader("Allow", "GET,PATCH");
res.status(405).end("Method Not Allowed");
}
// Create/update frontend page src/pages/FeaturesPage.tsx
// Fetches /api/features?userId=me and lets the signed-in user toggle completion.
import React, {useEffect, useState} from "react";
export default function FeaturesPage() {
const userId = "demo-user"; // replace later with real auth
const [features, setFeatures] = useState<any[]>([]);
const [completions, setCompletions] = useState<Record<string, boolean>>({});
useEffect(() => {
fetch(/api/features?userId=${userId}).then(r => r.json()).then(data => {
setFeatures(data.features || []);
setCompletions(data.completions || {});
});
}, []);
const toggle = async (featureId: string, value: boolean) => {
await fetch("/api/features", { method: "PATCH", headers: {"Content-Type":"application/json"}, body: JSON.stringify({ userId, featureId, completed: value }) });
setCompletions(prev => ({...prev, [featureId]: value}));
};
return (
<div style={{padding: 24}}>
// Use Lovable Secrets UI to add SUPABASE_URL and SUPABASE_KEY (set these keys exactly).
// Create the DB schema in Supabase (outside Lovable): run the SQL below in Supabase SQL editor or via migrations.
-- outside Lovable (Supabase SQL editor or terminal)
-- Create features table and feature_completions table
-- Create features table
create table if not exists features (
id text primary key,
title text not null,
description text
);
-- Create completions
create table if not exists feature_completions (
id bigint generated by default as identity primary key,
user_id text not null,
feature_id text references features(id) on delete cascade,
created_at timestamptz default now()
);
The fastest practical approach in Lovable is to track features with a small on-disk manifest + a UI that persists state locally by default and optionally syncs to a hosted DB (Supabase) via Lovable Secrets. Use Chat Mode edits to add the manifest and UI, Preview to validate, Publish to deploy, and GitHub sync only if you need terminal-based DB migrations or deeper CI control.
// Prompt 1: Create a local-first feature manifest and UI components
// Ask Lovable to create files below and wire them into the app route /progress.
// Files to create:
// data/features.json
// src/components/FeatureCard.tsx
// src/components/FeatureList.tsx
// src/pages/ProgressPage.tsx
//
// Implementation notes:
// - Persist progress in localStorage under key "featureProgress".
// - Provide a toggle button per feature that marks it complete/incomplete.
// - Keep UI framework-agnostic React/TSX. If app is JS-only, adjust imports; prefer TypeScript if project already uses it.
Create file data/features.json with sample content:
[
{ "id": "signup-flow", "title": "Signup flow", "description": "Email + verification" },
{ "id": "payments", "title": "Payments", "description": "Stripe checkout" },
{ "id": "profile", "title": "Profile editor", "description": "Upload avatar and bio" }
]
Create file src/components/FeatureCard.tsx with a React component that accepts feature and completed boolean and a toggle callback.
// Component should show title, description, and a button to toggle completion.
Create file src/components/FeatureList.tsx that:
// - Imports data/features.json
// - Loads progress from localStorage
// - Renders FeatureCard for each feature
// - Saves updates back to localStorage
// - Exposes an optional prop `onSync` called with the full progress object (for optional Supabase sync)
Create file src/pages/ProgressPage.tsx that:
// - Renders FeatureList
// - Shows counts: completed / total
// - Adds a "Sync to Cloud" button visible only if environment variable REACT_APP_SUPABASE_URL is present (use process.env)
// - Use client-side fetch to call sync when clicked, calling onSync prop if provided
// Ask Lovable to wire route /progress (create or update routing file if needed) and open Preview after changes.
// Prompt 2: Add optional Supabase sync using Lovable Secrets
// Before running this in Lovable: open Lovable Secrets UI and add two secrets named SUPABASE_URL and SUPABASE_ANON_KEY.
// Then ask Lovable to create these files and package.json changes.
// Files to create/update:
// src/lib/supabaseClient.ts
// src/api/syncProgress.ts (client-side helper that writes to Supabase or calls a server endpoint)
// update package.json to include "@supabase/supabase-js"
//
// Implementation notes:
// - Use the client library to upsert a row keyed by user or project id.
// - If DB schema/migrations are needed, mark that as "outside Lovable (terminal required)" and recommend GitHub sync.
Create src/lib/supabaseClient.ts:
// // Initialize Supabase client using process.env.SUPABASE_URL and process.env.SUPABASE_ANON_KEY
// // Export a function saveProgress(projectId, progress) that upserts progress into a "feature_progress" table.
Create src/api/syncProgress.ts:
// // Lightweight client wrapper that calls saveProgress. Use in the ProgressPage's onSync.
// // Handle failures gracefully and fall back to localStorage.
Update package.json dependencies to include "@supabase/supabase-js".
// // Lovable will install on Publish/Deploy. No terminal inside Lovable.
Add note in the page UI: "Configure Supabase via Lovable Secrets to enable cloud sync."
From startups to enterprises and everything in between, see for yourself our incredible impact.
Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We’ll discuss your project and provide a custom quote at no cost.