Loading...
Verejný changelog. Žiadne marketingové zhrnutia. Postujeme, keď sa niečo stane.
Ported the full landing page design from Claude design bundle. HeroReceipt, TrustBar, Explainer, HowItWorks, PricingCalc, Comparison, UseCasesBundle, LiveMap, Features, PartnerSplit, Testimonials, Guarantee, FAQ, FinalCTA all rebuilt flat with Satoshi. User-approved 22.04.2026.
Promo code AD10 gives new customers €10 checkout credit. Capped at 100 redemptions. Applied at Stripe checkout step, no manual claim needed.
Queue engine now tracks actual vs. target share-of-voice per screen and applies up to ±15 pp drift correction per cycle — capped at the screen's configured SOV ceiling. Result: delivered SOV stays within ±1% of booked share.
Fixed UUID validation, device_enabled check ordering, alert dedup using maybeSingle(), lexicographic version comparison replaced with semver, health fields no longer default to "healthy" on missing data, auto-resolve for clock_drift and version alerts, app_config parsing made type-safe, play_count now stored correctly.
Toggling is_24h: true via the OperatingHoursEditor spread preserved stale start/end/time_slots from the previous state. Fixed in 3 places: SimpleDayRow toggle, enable switch, and AdvancedDayConfig.
4 bugs fixed: pairing recursion replaced with while-loop + exponential backoff, pairing timeout triggers auto-restart, setup thread retries 10 attempts (was 1), empty queue no longer shows black screen — falls back to backup-logo.png.
resolveThingName() returned player-{device.id[:8]} but ALL MQTT topics use screens/{screen_id}/... and the IoT Policy scopes by ThingName. Fix: ThingName now equals the screen UUID directly. Also fixed in 3 auto-provisioning paths.
is_active controls whether a screen is available for booking. device_enabled is the admin kill-switch — when false: no queue, no impressions, no heartbeat updates. Old code used is_active for device control which broke revenue on screens taken off sale.
Three revenue share fields used different numeric formats (0–1 float, 0–100 int, dual-format). resolveRevenueSharePct() now normalises all cases. percentage_share divided by 100 before use, verified across 5 files.
Fire TV isVideo() checked file extension in URL. Proxy URLs (/api/v2/media/proxy?u=BASE64) have no extension → all videos treated as images → playback failure. Fix: playlist API now sends media_type field (video|image) derived from the original URL before proxy rewrite.
Ad decision engine runs as AWS Lambda triggered by EventBridge every 5 minutes. Calculates and pushes updated queues for all v2 screens via MQTT. Replaces the old player-side queue polling. SOV pacing tracked server-side.
4-step flow: Dates → Screens → Content (skippable) → Review & Pay. No Quick/Pro mode distinction. Desktop: split-view map + sidebar. Mobile: map/list toggle. Slot language replaced with Ad Share %, Price per Day, Available throughout the UI.