Commit graph

  • d8492f3720 Phase 1: multi-tenancy design doc + migration scripts ScreenTinker 2026-05-11 19:12:03 -0500
  • fc84ab8d8b
    Merge pull request #2 from albanobattistella/patch-1 screentinker 2026-05-11 19:24:07 -0500
  • 9f1ca2e177
    Add Italian Translation albanobattistella 2026-05-09 15:58:48 +0200
  • 45a6800621 fix: log real client IPs through Cloudflare instead of CF edge ScreenTinker 2026-05-07 15:26:37 -0500
  • 2068bc8833 Video walls: free-form canvas editor, leader-driven sync, group dissolve, progress bars ScreenTinker 2026-04-29 23:11:16 -0500
  • 388e9e6ab8 Admin password reset + widget visibility fix ScreenTinker 2026-04-29 20:45:25 -0500
  • dec56506f9 i18n: add Android localized string resources ScreenTinker 2026-04-29 20:20:14 -0500
  • aebaacf2c1 i18n batch 7: index.html modal + player overlay ScreenTinker 2026-04-29 20:19:06 -0500
  • 6d6f901ef4 i18n batch 6: wire teams + activity + help (~62 keys) ScreenTinker 2026-04-29 20:16:21 -0500
  • 7a17bb5079 i18n batch 5: wire layout-editor + video-wall + billing (~85 keys) ScreenTinker 2026-04-29 20:13:38 -0500
  • f4a81d7be2 i18n batch 4: wire schedule + reports + kiosk (~95 keys) ScreenTinker 2026-04-29 20:09:32 -0500
  • 457a2e4dd4 i18n batch 3b: wire onboarding.js + admin.js (~84 keys) ScreenTinker 2026-04-29 20:04:23 -0500
  • 04891bccee i18n batch 3a: wire playlists.js (~65 keys) ScreenTinker 2026-04-29 20:00:52 -0500
  • 103803fb92 i18n batch 2b: wire designer.js (~80 keys) ScreenTinker 2026-04-29 19:57:12 -0500
  • 0743901e48 i18n batch 2a: wire widgets.js (~107 keys) ScreenTinker 2026-04-29 19:52:31 -0500
  • eccf4b7af1 i18n batch 1/6: wire device-detail + settings (~242 keys) ScreenTinker 2026-04-29 19:47:17 -0500
  • 8e7a093150 i18n: extract all strings, add 6 language translations, restructure i18n module ScreenTinker 2026-04-29 19:25:22 -0500
  • a2c8ab4336 Match YouTube oEmbed embed format (revert nocookie, add referrerpolicy) to fix Error 153 ScreenTinker 2026-04-29 11:32:57 -0500
  • a273e5b2b6 Switch YouTube embed to youtube-nocookie.com to avoid Error 153 from tracking blockers ScreenTinker 2026-04-29 11:28:49 -0500
  • 8bfb4584a1 Ignore local video/ directory ScreenTinker 2026-04-29 11:26:24 -0500
  • a27738120a Add YouTube video embed to landing page ScreenTinker 2026-04-29 11:25:29 -0500
  • 19b62fdc1b Fix landing-page comparison: ScreenTinker 15-device price is \$1,188 not \$989 ScreenTinker 2026-04-28 23:23:58 -0500
  • 25ab1c485b SEO: add meta tags, sitemap, robots.txt, comparison pages, guides, internal linking ScreenTinker 2026-04-28 20:54:32 -0500
  • b2aa7fab54 Player: keep video playing if unmute is blocked ScreenTinker 2026-04-28 16:18:32 -0500
  • a3551a2654 Player: only request fullscreen on real user clicks ScreenTinker 2026-04-28 16:13:58 -0500
  • 63dcc2b656 Drag-and-drop devices into groups on the dashboard ScreenTinker 2026-04-28 15:54:33 -0500
  • 9b26b4930b Make breadcrumb a drop target for moving content out of folders ScreenTinker 2026-04-28 15:51:02 -0500
  • 66a137cffe Android: bump to 1.7.8 + fix safeOn return type ScreenTinker 2026-04-28 15:45:18 -0500
  • a4c85eaabc Remove playerContainer position:relative override that nuked YT iframe ScreenTinker 2026-04-28 15:36:39 -0500
  • fb0a7f48dd Force YouTube iframe fullscreen with absolute positioning ScreenTinker 2026-04-28 15:34:40 -0500
  • ed46011ae4 Pin YouTube iframe to fill the player container ScreenTinker 2026-04-28 14:59:23 -0500
  • fb58256b1c Fix YouTube autoplay block from stale localStorage gesture flag ScreenTinker 2026-04-28 14:56:49 -0500
  • f951d51214 Always show tap overlay on player cold load ScreenTinker 2026-04-28 14:54:19 -0500
  • 06ba054898 Fix web player TDZ crash on cached-playlist startup ScreenTinker 2026-04-28 14:51:35 -0500
  • f8cc62308f Fix screenshot fallback query and API 404 hang ScreenTinker 2026-04-28 14:49:10 -0500
  • 8ec33721f7 Security: sanitize notes, add CSP headers, tighten CORS ScreenTinker 2026-04-28 14:37:31 -0500
  • c105a5941e Security: fix IDORs, XSS, rate limits, SSRF validation ScreenTinker 2026-04-28 14:37:18 -0500
  • 76a0076b65 Fix UTF-8 encoding for special characters in filenames ScreenTinker 2026-04-28 10:13:41 -0500
  • fcecf805ed Add media folder organization to content library ScreenTinker 2026-04-28 10:13:36 -0500
  • 8866e305f0 Fix Android app crash on WebSocket connection loss ScreenTinker 2026-04-28 10:13:26 -0500
  • cd6e39a4a7 Fix Android app OOM crash on 4K images and crash loop recovery ScreenTinker 2026-04-28 10:13:10 -0500
  • ee6888e737 Fix display duplication on WebSocket reconnect ScreenTinker 2026-04-28 10:13:00 -0500
  • 05f70b7910 Update ToS: add CSAM policy, fix MIT license conflict, add governing law ScreenTinker 2026-04-24 11:26:32 -0500
  • c2b1bb20ae Fix stale setup.sh references in Pi installer ScreenTinker 2026-04-23 18:28:26 -0500
  • 261f74e1e4 Rewrite Pi setup script as all-in-one installer ScreenTinker 2026-04-23 18:26:49 -0500
  • 846d61a1b0 Add Discord link and refresh feature copy ScreenTinker 2026-04-23 17:47:00 -0500
  • 2959eaa149 Refresh cached user so admin plan/role changes propagate ScreenTinker 2026-04-22 19:38:46 -0500
  • 281a735e84 Fix white-label settings not applying on page load ScreenTinker 2026-04-22 19:36:20 -0500
  • 4392bb460a Add DISABLE_REGISTRATION env var to block public sign-ups ScreenTinker 2026-04-22 19:35:32 -0500
  • ea86d70475 README: update feature list to reflect current capabilities ScreenTinker 2026-04-21 22:39:07 -0500
  • 6a0e5a28a9 Fix content file access gate for widget references ScreenTinker 2026-04-21 22:28:55 -0500
  • 4e4664b603 Add directory board editor UI with content picker, category/entry management ScreenTinker 2026-04-21 22:28:47 -0500
  • 08a83c9ba9 Add directory board widget renderer with scrolling, anti-burn-in, dark/light themes ScreenTinker 2026-04-21 22:28:37 -0500
  • a981171c94 SEO: open-source positioning, GitHub links, OG image, semantic <main> ScreenTinker 2026-04-21 19:56:22 -0500
  • ea80d3aca5 Landing: replace iframe mock with dashboard screenshot ScreenTinker 2026-04-21 19:47:13 -0500
  • 3476f2b7e7 Landing: group Sign In next to Start Free Trial on the right ScreenTinker 2026-04-21 19:37:41 -0500
  • e0bfa76545 Landing: float Sign In to far top-right, separate from Start Free Trial ScreenTinker 2026-04-21 19:30:33 -0500
  • 87a935cb74 Landing: fix mobile nav overflow so Sign In stays visible ScreenTinker 2026-04-21 19:27:19 -0500
  • 25f3870472 Landing: keep Sign In button visible on mobile nav ScreenTinker 2026-04-21 19:24:57 -0500
  • 52297ec618 Settings: add account profile + password change UI ScreenTinker 2026-04-21 19:13:20 -0500
  • 772ead28a2 Fix reset-admin.js: honor recovery token in requireAuth ScreenTinker 2026-04-21 19:08:49 -0500
  • 8da0e60c20 Mobile: public-facing pages (landing + login) ScreenTinker 2026-04-21 18:52:53 -0500
  • 481ae0209a Mobile: fix modal and form control overflow ScreenTinker 2026-04-21 18:48:51 -0500
  • 0bd34544e5 QA fixes: toast aria-live + scope playlist flex-wrap to mobile ScreenTinker 2026-04-21 16:00:41 -0500
  • 8cd5dd518a Playlist: add up/down reorder buttons ScreenTinker 2026-04-21 15:57:40 -0500
  • 06d3e93e21 Mobile: horizontal-scroll tables + tab fade (Commit 4/4) ScreenTinker 2026-04-21 15:56:01 -0500
  • b45d81cfaa Mobile: modals, forms, tap targets, toast (Commit 3/4) ScreenTinker 2026-04-21 15:51:12 -0500
  • 7c8504d593 Mobile: grid + layout reflow (Commit 2/4) ScreenTinker 2026-04-21 15:50:56 -0500
  • 09dbb4b199 Mobile: sidebar polish (Commit 1/4) ScreenTinker 2026-04-21 15:49:49 -0500
  • 2d3bb55db4 Fix startup crash on existing DB: defer group_id index to migration ScreenTinker 2026-04-16 07:59:49 -0500
  • 52dd44a3e8 Add group-level scheduling, group playlist assignment, and persist audio unlock ScreenTinker 2026-04-15 20:22:42 -0500
  • 2104c9cc9f Auto-reload web player when server code changes ScreenTinker 2026-04-13 22:44:47 -0500
  • ad3095cdf5 Fix player video cycling bug and connecting overlay during cached playback ScreenTinker 2026-04-13 22:34:48 -0500
  • d73abc809d Simplify service worker: stop intercepting content requests ScreenTinker 2026-04-13 22:24:15 -0500
  • b4ac2fb821 Fix broken service worker + device auth rejection on playlist refresh ScreenTinker 2026-04-13 22:18:08 -0500
  • dc7450b6a7 Offline resilience: persist playlist cache for cold-start recovery ScreenTinker 2026-04-13 21:49:45 -0500
  • 470197d203 Fix 8 security findings from Phase 3 audit + device-detail banner refresh ScreenTinker 2026-04-13 21:36:16 -0500
  • f30d8b82cd Unify publish behavior: all edits go to draft, require explicit publish ScreenTinker 2026-04-13 21:22:44 -0500
  • 436a3be7f6 Phase 3: playlist publish/draft state with auto-publish from device detail ScreenTinker 2026-04-13 20:52:29 -0500
  • 1cf6b93512 Update README with Phase 2 features and recent additions pre-phase3 ScreenTinker 2026-04-11 23:20:55 -0500
  • 1d253c4cae Android + web player: handle device_token authentication ScreenTinker 2026-04-11 22:52:52 -0500
  • afbe113acf Security audit remediation: auth, IDOR, XSS, hardening ScreenTinker 2026-04-11 22:48:07 -0500
  • b87904c326 Add schema_migrations table for run-once migration tracking ScreenTinker 2026-04-11 22:28:10 -0500
  • df7919f84f Migration: add detailed logging for device, item, and video probe counts ScreenTinker 2026-04-11 22:25:42 -0500
  • 1483500458 Probe video durations during migration and v1 import ScreenTinker 2026-04-11 22:24:56 -0500
  • aee6766c4c Migration: probe video durations with ffprobe during assignment-to-playlist conversion ScreenTinker 2026-04-11 22:21:40 -0500
  • aca1558702 Show auto-generated playlists by default in playlist list ScreenTinker 2026-04-11 22:17:31 -0500
  • af03615ec0 Phase 2: device-detail.js adds playlist picker dropdown ScreenTinker 2026-04-11 22:12:17 -0500
  • a66feab53e Phase 2: playlists UI shows display count, auto-generated filter toggle ScreenTinker 2026-04-11 22:10:48 -0500
  • 40fcbbc32a Phase 2: add playlist assignment + group assign API methods to frontend ScreenTinker 2026-04-11 22:09:56 -0500
  • 6f01d319f5 Phase 2: playlists API returns display_count, is_auto_generated + assign endpoint ScreenTinker 2026-04-11 22:09:32 -0500
  • 33a5be39ed Phase 2: export v2 format with playlists, backward-compat v1 import ScreenTinker 2026-04-11 22:08:44 -0500
  • 19a08ef5bc Phase 2: schedules accept playlist_id, scheduler overrides device playlist ScreenTinker 2026-04-11 22:07:36 -0500
  • f35894d17a Phase 2: device-groups assign-content uses playlists + new assign-playlist endpoint ScreenTinker 2026-04-11 22:06:26 -0500
  • a9aaebc08d Phase 2: devices.js returns playlist items instead of assignments ScreenTinker 2026-04-11 22:05:48 -0500
  • 55c8e354b4 Phase 2: assignments.js operates on device playlists instead of assignments table ScreenTinker 2026-04-11 22:05:19 -0500
  • 6d4d39c2d8 Phase 2: buildPlaylistPayload reads from playlist_items via device.playlist_id ScreenTinker 2026-04-11 22:04:26 -0500
  • c8dffab5ad Phase 2 migration: convert existing assignments to per-device playlists ScreenTinker 2026-04-11 22:03:41 -0500
  • 2af3cec8a6 Phase 2 schema: add playlist_id to devices/schedules, is_auto_generated to playlists ScreenTinker 2026-04-11 22:00:56 -0500
  • 19fc38a59e Make ffprobe re-probe async to avoid blocking the event loop pre-phase2-security ScreenTinker 2026-04-11 21:30:11 -0500