StudsUp β€” Version history

Every change, fix and new feature tracked here. Current version: v9.0

v9.4 Current August 4, 2026
Account deletion system, LUGBULK database automation, LUG cleanup, admin monitoring
πŸ—‘οΈ
Account deletion & recovery β€” Delete button (Profile β†’ Settings β†’ Danger zone) soft-deletes the account, blocks login, starts a 400-day timer. Users can request recovery via email β†’ admin approves β†’ account restored with all data. After 400 days: permanent hard-delete via daily cron sweep New Backend
πŸ€–
LUGBULK database automation — Reusable Excel→DB import pipeline (import_lugbulk_excel.py). Auto-detects ORDER sheets, member columns, element-to-BrickLink mapping. CLI with --dry-run, --list-members. All 14 LUGBULK Excel files archived on GitHub + server New Backend
πŸ“¦
Full LUGBULK history 2018-2025 β€” Imported 2022 ORDER + 2025 EstLUG project list. Georgs now has all 8 years: 143 orders, 32,175 pieces, $2,283.75 total value. Per-year order price row in footer New
πŸ–ΌοΈ
LUGBULK part images fixed β€” Switched from BrickLink URLs (44/86 broken) to local element-id images (85/86 load). Images now guaranteed correct colour since element_id encodes part+colour. Fixed 4 bad colour names, enriched 8 unmapped 2023/24 parts Fix
πŸ“…
Year dropdown + sticky header β€” LUGBULK table header and price footer stick while scrolling. Year visibility dropdown with checkboxes, "Show all"/"Only with orders" quick actions. Shows 2018-2027 including empty planning years New
🧱
LUG creation endpoint β€” POST /api/lugs: any user can register a new LUG, creator becomes head. Slug auto-generated with uniqueness. Edge cases handled (short names, duplicates, no auth) New Backend
🧹
Fake data purge β€” Deleted 11 fake/demo users + their data (stores, posts, collections, listings). Stream page rewired to real /api/streams with empty state (removed 48 fake streams + auto-chat). LUG page loads real members/gallery/events/votes (all were hardcoded fakes). Removed 6 fake DB streams Fix
🏠
LUG page real data β€” Name, description, location, breadcrumb, leadership sidebar, member grid, stats all populate from /api/lugs/{slug}. Gallery/Events/Voting show honest empty states. Works for any LUG via ?lug=slug. Stale 284β†’1 member count fixed Fix
πŸ‘₯
Admin user monitoring β€” Dashboard shows total users, new-in-7d/30d counters, full user table (role, LUG membership, LUGBULK orders), LUG list with head + member counts. Recovery requests card with approve/deny buttons New
πŸ“ˆ
CPU/RAM history chart β€” 24-hour resource history (metrics sampled every 15 min), SVG line chart in admin dashboard. IP country lookup with flag emoji. Visitors show username instead of fingerprint hash New
πŸ”—
Wishlist navigation β€” Added full site nav (Marketplace, Parts, Search, Collection) + clickable logo. Was previously a dead-end page Fix
πŸ“Ί
Streams page β€” Rewired to real /api/streams with All/Live/VOD filter + search. Clean empty state. Removed fake auto-chat simulator that generated random messages every 1.5s Fix
v9.1 July 25, 2026
Own mail server, real password reset, parts-image overhaul, and profile-blog fixes
βœ‰οΈ
Own mail server β€” StudsUp now runs its own Postfix server with DKIM signing for studsup.eu, relayed for delivery. Powers password resets and account emails New Backend
πŸ”‘
Real password reset β€” "Forgot password?" now actually works: secure 1-hour token emailed to you, dedicated reset page. Previously just showed a fake success message Fix
πŸ“§
Email verification on signup β€” new accounts receive a welcome/verification email; existing accounts are grandfathered in as verified New
πŸ””
Notification settings β€” new "Alerts" tab in profile settings: master email toggle, new-listing alert toggle, and a configurable check frequency (2/5/10/20/30/60 min) New
πŸ–ΌοΈ
Parts catalogue images fixed at the root cause β€” the LDraw fallback colour code used everywhere ('16') was a meta-colour that never renders; changed to '0' across the catalogue, collection, missing-parts checklist and homepage. Coverage on a broad sample jumped from ~19% to 84%+ Fix Backend
πŸ“„
Honest icons for unphotographable items β€” activity booklets, cards and manuals now show a document icon instead of a broken-looking placeholder; wire/cable parts show a plug icon when no real photo exists Improved
πŸ”—
Printed/decorated part variants β€” BrickLink usually only photographs the plain mold, not every print; added a base-mold fallback so parts like printed minifig pieces and dragon wings find a real photo more often Fix
πŸ“‘
Pagination bug fixed β€” Technic/Duplo filtering was happening client-side after the page was already fetched, occasionally producing "No parts found" on a valid page number. Moved server-side so totals and page counts are always accurate Fix Backend
↕️
Parts sort dropdown β€” was previously decorative only; now actually sorts by price, availability, sold quantity or element ID Fix
πŸ“Έ
Blog photo/video posts β€” Photo and Video post types can now actually attach a real upload; previously there was no file picker at all despite the option existing Fix
πŸ’Ύ
Profile settings actually save β€” display name, bio, location, avatar photo/colour and password changes were previously cosmetic only (localStorage-only, no server call); all now persist for real Fix
πŸ“±
Mobile camera fix β€” scanning a set or identifying a brick now opens a single native camera/gallery picker instead of forcing the camera and sometimes double-capturing a photo Fix
v9.0 June 27, 2026
Color system overhaul β€” accurate colours, instant filter, multi-select
🎨
Color accuracy fix β€” GROUP BY rp.part_num replaced with correlated subquery that picks the best representative element per part (local_img first). Eliminated ~70% grey (#cccccc) colour swatches Fix Backend
⚑
Instant colour filter β€” clicking a colour in the sidebar now immediately filters parts without needing "Apply filters" button Fix
πŸŽ›οΈ
Multi-colour filter β€” new color_ids query parameter accepts comma-separated IDs; selecting multiple colours now works New Backend
0️⃣
Black (color_id=0) fix β€” falsy zero was skipped by colour filter logic; now correctly filters 10,047 black parts Fix
πŸ”
Search page β€” removed both occurrences of dev uvicorn startup instructions shown to production users Fix
πŸ§ͺ
Full deployment check β€” automated 10-point test suite: API health, colour accuracy, Black/multi-colour filters, BL fields, search warning, part detail, builder, category images, instant filter Improved
v8.9 June 27, 2026
Parts catalogue β€” 12 categories, real LEGO images, BrickLink fallback
πŸ“¦
12 clean categories β€” replaced 60+ raw Rebrickable categories with 12 BrickArchitect-inspired groups: Basic Β· Plates Β· Slopes Β· Round & Curved Β· SNOT Β· Panels & Windows Β· Minifig Β· Nature Β· Vehicle Β· Technic Β· Duplo Β· Other New
🧱
Category thumbnails β€” each category now shows a real 36px LEGO part photo instead of emoji. Images sourced from local element DB with BrickLink CDN fallback New
πŸ–ΌοΈ
4-source image waterfall β€” part images try: local DB β†’ BrickLink colored (PN/{color_id}/{part_id}) β†’ BrickLink no-color (PL/{part_id}) β†’ Rebrickable LDraw render Improved
πŸ”—
API fields β€” /api/catalog now returns bl_part_id, bl_color_id, part_name, color_css for BrickLink image URL construction Backend New
πŸ—‘οΈ
Removed "Rebrickable catalogue" button from parts page header Fix
πŸ”
Part detail β€” dynamic loading β€” /pages/part-detail.html?part=6396802 now resolves correct part by element_id or bl_part_id instead of showing hardcoded Plate 2Γ—4 demo Fix
v8.8 June 27, 2026
MOC Builder v9.4 β€” connection engine, stud-exact positioning, PDF generation
πŸ”©
Connection engine β€” getConnectionY(partNum) returns correct LDraw Y offset per part type. 6157 wheel holder: Y=βˆ’8 (stug anti-stud at Y=8). All others: Y=0. Eliminates parts floating inside the plate New
πŸ“
Stud-exact placement β€” 1762 go-cart parts placed on real stud positions derived from .dat geometry: steering at Z=βˆ’30, round bricks at Z=+30, holders at Z=Β±20 Y=βˆ’8, wheels at Y=βˆ’3 (holder βˆ’8 + wpin +5) Fix
πŸ“„
PDF hang fix β€” pre-renders all step screenshots before PDF generation; eliminated indefinite hang on tyre subfile loading Fix
πŸ›
Duplicate DOCTYPE fix β€” Python string replace was appending full file as text inside template literal; caused SyntaxError and blank builder page Fix
🎨
CHART_COLORS guard β€” shared.js redeclaration on repeated navigation caused builder JS to silently fail; wrapped in if(typeof…===undefined) guard Fix
πŸ§ͺ
POC 33/33 β€” all tests passing: core:16/16 Β· 1762:8/8 Β· db:9/9. Every run generates 2 PDFs (1762 go-cart + 60400 go-kart) Improved
πŸ—οΈ
LUGBULK order page β€” new /pages/lugbulk-order.html with 4 tabs (Order Β· Nominations Β· Voting Β· Summary), 3-tier voting system (5ptΓ—5 Β· 3ptΓ—10 Β· 1ptΓ—25), ESTLUG removed New
v8.7 June 27, 2026
Security, cleanup & mobile fixes
πŸ”’
GitHub repo private β€” source code no longer publicly accessible Security New
©️
Copyright headers β€” added to all 23 frontend/backend files Security
πŸ”‘
JWT Auth system β€” /api/auth/login, /api/auth/me, change-password; admin endpoints protected Backend New
πŸ—οΈ
Minification pipeline β€” scripts/minify.py removes comments & collapses CSS/JS Improved
🧹
Removed LUGBULK label from search tabs and nav β€” now shows as Parts. LUGBULK is a LUG-members-only ordering feature, not a public catalogue name Fix
πŸ“±
Mobile fix β€” removed red placeholder square from index page card Fix
v8.6 June 25, 2026
Search Engine Phase 1 β€” FTS5 BM25 ranked search across all 78k parts
πŸ”
rb_parts_fts index β€” FTS5 trigram virtual table built over all 78,633 catalogue parts on startup Backend New
πŸ“Š
BM25 ranking β€” parts catalogue search now ranks by relevance (exact part_num first, prefix second, BM25 score third) instead of plain LIKE scan Improved
⚑
Global search parts β€” /api/search now queries 78k rb_parts via FTS before falling back to LUGBULK parts table Improved
πŸ—‚οΈ
/api/catalog/facets β€” new endpoint returning category counts for the active search query; powers live sidebar filter badges New
πŸ”Ž
Sets search BM25 β€” global search sets section now uses sets_fts BM25 ranking instead of LIKE, matching sets page behavior Improved
v8.5 June 20, 2026
Order flow, payments, shipping map, role system & god mode
πŸ›’
Order modal β€” full checkout flow on part detail pages with fee breakdown New
πŸ’³
Payment methods β€” PayPal, Revolut, Card (Stripe), Bank transfer, Cash/local pickup with per-method fee calculation New
πŸ“¦
Shipping options β€” Standard post, DPD Parcelshop, Parcel machine, Local pickup with interactive Leaflet map showing nearby pickup points New
🧾
Fee breakdown β€” Live summary showing subtotal, shipping, payment provider fee, StudsUp fee (1%), import; cash/local shows €0 for platform fees New
⚑
God mode β€” Admin-only floating button, 5-minute timer with countdown, full permissions while active New
πŸ‘₯
Role system β€” admin β€Ί superuser β€Ί power_user β€Ί moderator β€Ί user β€Ί probation hierarchy implemented New
πŸ“„
Real PDF upload β€” Instructions now actually upload files to server via FormData, saved to /uploads/ Fix
πŸ“š
My sets β€” Shows empty state instead of hardcoded demo sets Fix
πŸ†•
LEGO news β€” Home page now shows latest sets from Rebrickable API New
v8.4 June 19, 2026
Upload improvements, API speed fix, color corrections
⚑
API URL fix β€” studsup.eu now routes to Hetzner backend directly, eliminating 30-60s Render cold starts Fix
βœ…
Skip review β€” Admin checkbox to publish instruction uploads immediately without moderation New
🎨
Color corrections β€” 46 BrickLink color CSS values fixed from #cccccc to accurate hex values Fix
πŸ“¦
lugbulk.html β†’ parts.html β€” Page renamed, all references updated Improve
v8.3 June 17, 2026
Hetzner VPS migration, SSL, live backend
πŸš€
Hetzner VPS β€” Migrated from Render to CX23 Helsinki server, FastAPI+uvicorn+nginx stack New
πŸ”’
SSL/HTTPS β€” certbot configured for studsup.eu New
πŸ—„οΈ
SQLite backend β€” 12,658 LUGBULK 2026 parts in persistent database Improve
v8.0 June 13, 2026
Full account settings, real downloads, live camera/mic, currency selector, all fake data removed
βš™οΈProfile settings modal β€” Edit name, handle, location, bio; change email; reset password with strength meter; upload avatar photo (drag & drop) or choose colour; cover image URL New
πŸ“₯Real instruction downloads β€” All 10 sets now link to official LEGO.com PDF booklets that open directly; Rebrickable parts list link; no more fake progress bar Fix
πŸ–ΌοΈReal set images β€” All instruction set cards now display real Rebrickable CDN photos with emoji fallback Fix
πŸ”΄Live camera & microphone β€” Go Live now requests real camera/mic via getUserMedia; individual toggles for camera, microphone, and speaker audio; device labels shown; live timer and simulated viewer count New
πŸ’±Currency selector β€” Parts catalogue now has a top-20 currency dropdown (USD, EUR, GBP, JPY, CNY, CAD, AUD, CHF, INR, BRL, MXN, KRW, SEK, NOK, DKK, PLN, CZK, HUF, TRY, SGD); all prices convert instantly New
πŸ“¦Parts catalogue renamed β€” Removed "LUGBULK 2026 β€”" prefix; page title is now simply "Parts catalogue" Fix
πŸ“ŠPer-page selector β€” New dropdown: 48 / 200 / 500 / 1000 / 2000 / All results per page New
🎨Color filter fixed β€” Root cause: API only loaded 200 of 12,658 parts. Now loads ALL parts in parallel chunks; color names display correctly; "Color 110" = Charcoal Fix
πŸ”‘Admin password updated β€” New secure admin password active for both georgs@studsup.com and admin@studsup.com; old demo1234 still works for testing Fix
v7.1 June 13, 2026
Full mobile responsive β€” hamburger nav, bottom tab bar, per-page breakpoints
πŸ“±Hamburger menu β€” horizontal nav hidden on mobile, replaced with slide-down drawer containing all links New
⬇️Bottom tab bar β€” fixed 5-tab navigation bar at screen bottom: Home / Search / Parts / Profile / AI New
πŸ“Per-page breakpoints β€” all 13 pages get responsive CSS at 768px and 480px: stacked grids, hidden sidebars, full-width buttons New
πŸ”½Modal sheets β€” modals slide up from bottom on mobile instead of appearing centred Improved
βš™οΈFilter FAB on parts catalogue β€” fixed floating button to open/close filters panel on mobile New
v7.0 June 13, 2026
Zero fake data, all buttons fixed, Rebrickable CDN for images
🧹All fake data removed β€” no more 2.4M, 94K, 12K, 340 LUGs; replaced with real DB counts Fix
πŸ”§19 broken alert() buttons fixed β€” now use proper toast(), navigation, or clipboard API Fix
πŸͺFake store names removed β€” BrickMaster_Shop, PartsBarn_EU, BrickMasterPaul replaced with generic labels Fix
πŸ–ΌοΈRebrickable CDN β€” all 12,658 part images and 8 set images updated to cdn.rebrickable.com (works in all browsers) Improved
πŸ”API research β€” BrickLink requires seller OAuth (unusable); Rebrickable free CDN confirmed working; Brickset API returns instruction PDF URLs Improved
v6.2 June 13, 2026
Live deployment + admin accounts + parts catalogue API fix
πŸš€Live deployment started β€” running on a Hetzner VPS Improved
πŸ”‘Admin accounts added β€” georgs_bricks (admin) and admin@studsup.com have admin role New
πŸ“¦Parts catalogue API β€” paginated, server-side filtering & sorting Fix
πŸ–ΌοΈPart images β€” Rebrickable CDN (100% coverage for 12,658 LUGBULK parts) Improved
πŸ”Search & API endpoints β€” robust element_id lookup, Rebrickable fallback Fix
⚑Auto-deploy β€” push to GitHub β†’ GitHub Actions β†’ live on Hetzner VPS Improved
v6.0 June 12, 2026
Real backend + full-text search across all categories
πŸ—„οΈSQLite database β€” 4.3 MB, 12,658 parts from LUGBULK_2026.xlsx, FTS5 full-text indexes on all tables Backend
πŸš€FastAPI REST backend β€” 15 endpoints, paginated results, <20ms query time Backend New
πŸ”Global search page rebuilt β€” searches Parts, Sets, Stores, Discounts, Users, LUGs, Streams, Videos simultaneously New
πŸ“¦Parts catalogue β€” removed 3.5 MB JS file, API serves paginated parts on demand Improved
🏷️Discounts as a separate search category with promo codes, min order, validity dates New
⚑Search fallback β€” if backend is not running, search page shows demo results with a warning banner Improved
πŸ“‹This page β€” version history added New
v5.0 June 11, 2026
Stream chat fixed, buy buttons wired, LUGBULK in global nav
πŸ”΄Stream live chat β€” fixed DOM timing bug (autoChat ran before page loaded), Enter key works, user name shown from session Fix
πŸ’°Buy buttons β€” fully wired on part detail page: confirm panel, order confirmation, Add to cart with mini summary New
πŸ”Login-aware buy panel β€” shows sign-in prompt for guests, full buy/cart/wishlist for signed-in users New
πŸͺSeller rows β€” each seller now has a Buy button, clicking selects that seller and updates buy panel New
πŸ“¦Parts catalogue added to main navigation on all pages Improved
πŸ”‘"+ Sell parts" button β€” redirects to login for guests, to profile/shop for signed-in users Fix
v4.0 June 10, 2026
LUGBULK catalogue from real Excel data + LUGBULK history in profile
πŸ“ŠLUGBULK_2026.xlsx imported β€” 12,658 parts with BrickLink price data (sold/available min/avg/max) New
πŸ–ΌοΈPart images β€” lazy-loaded from BrickLink CDN using Element ID + BL Color ID pattern New
πŸ›’Cart panel β€” slide-in cart, qty adjust, CSV export, running total New
πŸ“‹LUGBULK history tab in profile β€” year-by-year order table (2000β†’present), qty input per year, localStorage save, CSV export/import New
🎨147 color swatches in sidebar filter β€” searchable, multi-select New
v3.0 June 10, 2026
Login system, profile setup wizard, LUG public/private separation
πŸ”Login page β€” sign in, register, forgot password, social login (Google/Facebook/Apple), password strength meter New
πŸ‘€Profile setup wizard β€” 4 steps: avatar colour, LEGO interests (12 themes), build skill sliders, privacy toggles New
πŸ”’LUG privacy β€” voting always private/anonymous, full member list members-only, about/events/gallery public New
🌐Nav login-awareness β€” shows user name/avatar when signed in, Sign in button for guests on all pages Improved
🏠Project index (index.html) β€” cards for all pages with features listed New
v2.0 June 9, 2026
LUG governance, voting system, custom roles, postal address
πŸ‘‘LUG governance rules β€” first registrant = Head, one LUG per user, leave/dissolve logic, LUG auto-dissolves when empty New
πŸ—³οΈVoting system β€” elections (52% threshold), polls, rule changes; anonymous votes, active/closed states New
πŸ…Custom roles β€” create/edit/delete roles with granular permissions (8 permission types) New
πŸ“¬Postal address in LUG settings β€” official shipping/letter address, visible only to Head and Ambassador New
πŸ‘‘Head transfer β€” voluntary transfer modal + 52% member vote path New
πŸ“„PDF download on part detail β€” datasheet, XML parts list, CSV, LDR 3D model with progress animation New
πŸ“–Instructions library page β€” 5 tabs, build checker (cross-reference collection vs set parts), download modal New
πŸ”§Shared CSS + JS β€” global variables, nav, buttons, modals, toast, tabs extracted to css/shared.css + js/shared.js Improved
v1.0 June 8, 2026
Initial prototype β€” all core pages designed and built
🏠Homepage β€” hero, category grid, featured listings, feature cards, live stream preview, LUG spotlight, blog feed, footer New
🧱Part detail page β€” price history chart (Chart.js, 4 time ranges), sellers tab, reviews, in-sets tab, color picker, price alert New
πŸ”Search results β€” sidebar filters (category, condition, price, location, rating, color), sort, list/grid view, pagination New
πŸ“¦My Collection β€” parts table with qty editing, sets with ROI, wishlist, build checker, value charts (Chart.js), trade offers New
πŸ›οΈLUG club page β€” cover, stats bar, gallery, events, members grid, tabs, join/follow/leave actions New
πŸŽ₯Live streams page β€” featured stream with live chat, stream grid with live/VOD badges, filters, Go Live button New
✍️User profile + blog β€” cover, stats, blog posts, blog editor, gallery, shop, activity feed, build skill bars New
🎨Design system β€” dark navy + gold LEGO palette, StudsUp brand, responsive layout New
πŸ“„ All pages in this release
🏠
Homepage
home.html
πŸ”
Search
search.html
πŸ“¦
Parts catalogue
parts.html
🧱
Part detail
part-detail.html
πŸ“‹
My Collection
collection.html
πŸ›οΈ
LUG club
lug.html
πŸŽ₯
Streams
stream.html
πŸ‘€
Profile + Blog
profile-blog.html
πŸ“–
Instructions
instructions.html
πŸ”
Sign in
login.html
βš™οΈ
Profile setup
profile-setup.html
πŸ“
Changelog
changelog.html