changelog
everything we've shipped, in order. receipts below.
v3.1.02026-07-25
- Full technical SEO pass: robots.txt, dynamic sitemap.xml, Open Graph + Twitter cards, and JSON-LD structured data (WebSite, SocialMediaPosting, ProfilePage/Person, CollectionPage).
- Individual commits and profiles now get real per-page titles, descriptions, and share previews reflecting their actual content instead of a generic site-wide default.
- Private routes (Settings, DMs, Admin, etc.) excluded from search indexing.
- No ranking outcome is ever guaranteed by any SEO work — this is the full set of technical fundamentals done right, which is the honest, real version of that ask.
v3.0.02026-07-24
- Upgraded Next.js (14.2.5 → 14.2.35) to close a known security vulnerability, plus a matching firebase bump.
- Edit post — commits can now be edited after posting (shows an "edited" tag), instead of delete-and-repost being the only option.
- Block/mute users — hides their posts from your feeds, and blocks DMs both directions. Manage blocked accounts from Settings.
- Post view counts — authors now see how many people viewed their own commits.
- Delete a single DM message instead of only whole conversations.
- Keyboard shortcuts: g+h/e/n/m/b/p to jump around, / to search, ? for a shortcuts cheat sheet.
- A subtle top-of-page loading bar on route changes, so navigation always feels responsive.
- Accessibility pass — verified every icon-only button has a proper label for screen readers.
- Verified with a real production build — 21/21 routes compile clean.
v2.3.02026-07-24
- Fixed the Following tab: same root cause as the DM inbox bug from before — a where('in') filter combined with orderBy needed a manual Firestore index that didn't exist, so it silently failed. Sorted client-side instead; no index required now.
- Full responsive pass: fixed a flexbox issue that could force horizontal scroll on narrow phones, added a proper breakpoint for very small screens (~320px), and tuned spacing/type scale so everything fits from small phones up to ultra-wide monitors.
- Added two more decorative doodles — a little rocket on the home feed header, a trophy on your rank card in Settings.
- Verified with a real production build — 21/21 routes compile clean.
v2.2.02026-07-24
- Added hand-drawn style SVG doodles across every empty state and system page — empty feed, empty bookmarks, empty notifications, no search results, empty DM inbox, empty tag page, no-commits profiles, 404, error page, and the welcome/onboarding screen.
- Small confetti doodle on a couple of success moments (saving your profile, resetting your password).
- All doodles are theme-aware (colored via CSS vars) so they adapt across Light/Dark/Mint automatically.
- Verified with a real production build — 21/21 routes compile clean.
v2.1.22026-07-24
- Found and fixed two more instances of the same production-breaking bug class: the profile page and single-post page were Server Components fetching Firestore data (which includes non-plain Timestamp objects) and passing it straight into Client Components — invalid in the App Router, and exactly the kind of thing that shows as a generic digest-only error. Both converted to Client Components with proper loading skeletons, matching the rest of the app's pattern.
- Verified this time with an actual production build (`next build`) rather than static analysis alone — it now compiles clean with zero errors across all 21 routes.
v2.1.12026-07-23
- Fixed a bug breaking every single page in production: the Supabase client was being constructed at module load time, which Next.js still executes once on the server during SSR for every page (even for client components) — Supabase's realtime client touching browser-only globals during that server pass threw and took down the whole app. Now constructed lazily, client-side only, on first real use.
- Fixed a second real bug on profile pages specifically: a function was being passed as children from a Server Component to a Client Component (an invalid pattern in the App Router — functions can't cross that boundary), which is exactly the kind of thing that shows as a generic, digest-only error in production. Profiles now compute ownership internally instead.
v2.1.02026-07-23
- Bloom filters added in two real spots: username availability now skips a Firestore read whenever a handle is provably free, and bookmark-status checks went from one read per post in a feed down to one read total per session.
- Real syntax highlighting via PrismJS on code snippets, themed to match all three app themes.
- Lazy loading on images that scale with content (DM threads, media grids).
- Infinite scroll (IntersectionObserver-based) on the main feed and Explore, replacing manual 'load more' buttons.
- Optimistic UI everywhere it matters: posting, commenting, and following/unfollowing all update instantly and roll back cleanly on failure.
- Profiles got a real upgrade: stats row (commits, stars earned, rank score) and tabs for Commits / Replies / Media.
v2.0.02026-07-23
- Report/flag button on posts and comments, feeding a real admin moderation queue.
- Client-side rate limiting on posts, comments, and DMs — plus a basic word/link spam filter.
- Quote-commits, pinned commits on profile, @mentions (with notifications + links), and a Latest / For You / Following feed.
- DMs leveled up: fixed a real bug where the inbox silently failed to load, plus group DMs, typing indicators, read receipts, and image attachments.
- Admin panel got tabs: bulk select + bulk ban/suspend/delete, a full audit log of every admin action, and an analytics dashboard (signups/posts/DAU) backed by Supabase.
- Pagination added to search/explore, client-side image compression before upload, and rank checks now read cached counters instead of scanning.
- New onboarding flow for first-time signups, a PWA manifest + offline app-shell service worker.
- Deleting anything — an account, a post, a comment — now actually cascades: posts delete their replies, accounts wipe their posts/replies/bookmarks/notifications/follows/DMs, nothing is just orphaned anymore.
- Email verification removed completely, per request.
- Real password rules (upper/lower/number/special character) with a live strength meter.
- Real-time username availability checking on signup, X/Instagram-style.
- Added a way to financially support Compile — sidebar, settings, and footer all link out.
v1.6.12026-07-22
- Stopped silently swallowing verification/reset email failures — every failed send now logs the real Firebase error code to the browser console and shows an actual reason in the UI instead of just "try again".
- Added specific messages for the most common real causes: Email/Password sign-in disabled, quota exceeded, and (most common) still running on placeholder Firebase config instead of a real connected project.
- Password reset copy is now honest about Firebase's email enumeration protection — a 'sent' response doesn't guarantee an email went out if that address has no account, by design.
- Full troubleshooting checklist added to the README for anyone still not receiving emails.
v1.6.02026-07-22
- Actually fixed email verification for good: if your domain isn't in Firebase's Authorized Domains list yet, sending now falls back to Firebase's default flow automatically instead of failing silently.
- Same fix applied to password reset links.
- New standalone profile edit page (avatar, display name, bio, handle) — separate from Settings.
- Settings got way more real: change email, change password, per-type notification toggles, one-click data export, plus theme/rank/danger zone.
- Added local draft autosave (IndexedDB) — the composer never loses what you were typing.
- Added an optional 'online now' presence dot on profiles, backed by Supabase (public anon key only — no admin credentials anywhere in the app).
v1.5.02026-07-22
- Fixed a real bug: starring someone's post or following someone silently failed to update their rank/counters (Firestore rules were blocking it without erroring). Fixed.
- Fixed rank badges disappearing on older accounts missing newer fields — now defaults gracefully instead of needing account recreation.
- Fixed email verification & password reset links dumping you on a generic Firebase page — now they route through our own /auth/action page.
- Added an "i verified it" button since Firebase doesn't auto-refresh your verified status in an open tab.
- New followers and following list pages for every profile.
- Every schema addition since launch is additive and defensive — nobody ever needs to delete or recreate their account for an update to work.
v1.4.02026-07-22
- Email verification on signup + a resend banner if you're unverified.
- Forgot password flow — real reset emails via Firebase Auth.
- Delete account (with password re-confirmation) in Settings, under Danger Zone.
- DMs are live — unlock at rank 5, auto-delete after 14 days to keep the database lean.
- Big Firestore optimization pass: cached counters instead of collection scans for rank checks, denormalized DM inbox data to avoid N+1 reads.
v1.3.02026-07-21
- Rank system: 10 earnable ranks (Newbie Committer → Legendary Shipper), auto-assigned from commits, stars, and followers.
- Rank 11 (Owner) reserved for hand-picked admins — DM Zelvior@proton.me for exclusive ranks.
- New owner-only admin panel: ban, suspend, delete, create, and assign ranks to any account.
- Rank badges now show next to names on posts and profiles.
v1.2.02026-07-21
- Comments — every commit now supports threaded replies (we call them PR comments).
- Follows, followers, and a real notifications feed.
- Bookmarks so you can save commits for later.
- Forking a commit (our version of the repost).
- Explore page — search people and commits.
- Three themes: Light, Dark, and Mint.
- Profile editing: display name, bio, avatar.
v1.1.02026-07-15
- Zero-build static fallback (public/fallback) for environments without a Next.js build step.
- Storage + Firestore security rules locked down: images only, 5MB cap, 280-char commits.
v1.0.02026-07-10
- Compile launches. Push commits, star good ships, browse the build log.
- Email/password auth, image-only attachments, full client + server validation.