Documentation
Add your Lovable app to the catalogue
The catalogue is opt-in. Apps register themselves by calling a public endpoint. No accounts, no API keys, no review queue.
1. Drop in the opt-in snippet
Paste this into your Lovable app. The first time it runs, your app appears in the catalogue. Every subsequent visit refreshes its last seen timestamp so active apps bubble to the top.
// Add anywhere in your Lovable app (e.g. src/main.tsx or a top-level component)
useEffect(() => {
fetch("https://hackathon.co.il/api/public/apps/register", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name: "My Awesome App",
url: window.location.origin,
tagline: "One-line pitch (optional)",
description: "What it does (optional, up to 500 chars).",
image_url: "https://yourapp.com/og.png", // optional preview image
author: "Your name or handle", // optional
}),
}).catch(() => {}); // fire-and-forget; never blocks your app
}, []);Required:
name and url. Everything else is optional but recommended — a tagline + preview image make your card stand out.2. (Optional) Opt out anytime
Want off the list? Call the opt-out endpoint with your app URL. Your entry is immediately hidden and future registrations from that URL are ignored.
await fetch("https://hackathon.co.il/api/public/apps/optout", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url: "https://yourapp.com" }),
});Opt-out is sticky: once flagged, re-registering won't bring the app back automatically. Email opt-in@hackathon.co.il if you change your mind.
API reference
POST/api/public/apps/register
Upsert your app in the catalogue.
{
"name": "string (required, max 80)",
"url": "string (required, valid https URL)",
"tagline": "string (optional, max 120)",
"description": "string (optional, max 500)",
"image_url": "string (optional, https URL)",
"author": "string (optional, max 80)"
}POST/api/public/apps/optout
Hide your app from the catalogue.
{ "url": "string (required, must match your registered URL)" }FAQ
›Does this slow my app down?
No. The call is fire-and-forget — wrap it in a
.catch(() => ) so a network blip never breaks your app.›Can I register from localhost?
You can, but URLs like http://localhost:5173 won't show up — only apps reachable on the public web are listed.
›How is duplication handled?
Entries are keyed by URL. Calling register again from the same URL updates the existing entry instead of creating a duplicate.
›Is there auth?
No. The opt-in endpoint is intentionally open. Spam protection is rate-limit based; abusive entries are removed.