Orbit Core is the template. Orbit is the instance Dopler runs on it — the same code, carrying an actual community rather than placeholder posts. Whatever breaks at that scale has broken for us first.
Dopler Hub
Live
The monorepo ships three apps — auth, platform and docs — so sign-in, the community itself and its documentation deploy as separate surfaces rather than one bundle you have to pull apart.
Not a feed component to build the rest around — the schema, the policies, the surfaces and the admin tooling, wired together and deployed as three apps.
Accounts and profilesSupabase auth, profile rows with slugs and avatars, and the settings surface to edit them.
Feed, posts and commentsText, image, carousel, link and YouTube posts, threaded comments and reactions — chronological, with no ranking layer to tune.
Follows and spacesFollow graph and per-space membership, so a community can be one room or many without a second schema.
Roles and rate limitingAdmin, moderator and member scopes enforced in policies, plus per-action rate limits that survive a client that lies.
Moderation toolingReports, review queue and user management, because the week you need these is not the week to start building them.
NotificationsNotification and recipient tables fed by database triggers, delivered in-app and respecting per-user settings.
HOW IT GOES IN
Three steps, and the database does the rest
There is no scaffolding marathon because the platform's logic lives in Postgres. Notifications, counters and fan-out are triggers and functions in the migration you run.
1
Run the SQLTables, policies, functions and triggers into your own Supabase project.
2
Set the environmentProject URL and keys. Nothing else is required to boot the platform.
3
DeployAuth, platform and docs apps, on your hosting, under your domain.
SELF-HOSTED
What owning it actually means
Your Supabase projectThe rows are in a database you hold the keys to. There is no tenant to be evicted from and no API in the middle that can change its terms.
Chronological by constructionThere is no ranking service to disable, because one was never written. What people post is what the feed queries, in the order they posted it.
Yours to forkFull source under the Dopler CC license: commercial use, your own features, your own schema changes. Nothing phones home.
PRICING
An add-on to Pro
Orbit Core is not sold on its own. Switch it on with Pro — Stack, every block, commercial use — and get the full schema, every surface and the admin tooling.
CREATE OR REPLACE FUNCTION hub_new_follower_notify()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
DECLARE
v_follower_username text;
v_follower_slug text;
v_notification_id uuid;
BEGIN
SELECT p.username, p.slug INTO v_follower_username, v_follower_slug
FROM profiles p WHERE p.id = NEW.follower_id;
INSERT INTO hub_notifications(type, actor_id, resource_type, resource_id, context)
VALUES (
'new_follower',
NEW.follower_id,
'profile',
NEW.following_id,
jsonb_build_object(
'follower_id', NEW.follower_id,
'follower_username', v_follower_username,
'follower_slug', v_follower_slug
)
) RETURNING id INTO v_notification_id;
INSERT INTO hub_notification_recipients(notification_id, user_id, delivered_at)
SELECT v_notification_id, NEW.following_id, now()
FROM (
SELECT coalesce(us.allow_in_app, true) AS allow_in_app
FROM hub_user_notification_settings us