{"id":197,"date":"2026-05-13T14:49:03","date_gmt":"2026-05-13T14:49:03","guid":{"rendered":"https:\/\/thesidequestlab.com\/project\/tsql-video\/"},"modified":"2026-05-13T14:58:45","modified_gmt":"2026-05-13T14:58:45","slug":"tsql-video","status":"publish","type":"post","link":"https:\/\/thesidequestlab.com\/old\/project\/tsql-video\/","title":{"rendered":"TSQL Video"},"content":{"rendered":"<figure class=\"project-body-hero\"><img decoding=\"async\" src=\"https:\/\/images.unsplash.com\/photo-1492619375914-88005aa9e8fb?auto=format&#038;fit=crop&#038;w=1400&#038;q=80\" alt=\"Video player and cinematic lighting\" loading=\"lazy\"><\/figure>\n<div class=\"privacy-callout\"><strong data-lang-block=\"en\">Privacy note.<\/strong><strong data-lang-block=\"nl\">Privacy-notitie.<\/strong> <span data-lang-block=\"en\">This write-up explains the architecture and purpose without publishing credentials, private routes that should stay private, personal data, or operational secrets.<\/span><span data-lang-block=\"nl\">Deze beschrijving legt de architectuur en het doel uit zonder credentials, private routes, persoonlijke gegevens of operationele geheimen te publiceren.<\/span><\/div>\n<div class=\"project-facts\">\n<div class=\"project-fact\"><strong>Type<\/strong><span>Private media service<\/span><\/div>\n<div class=\"project-fact\"><strong>Stack<\/strong><span>Invidious, Companion, Postgres, Caddy<\/span><\/div>\n<div class=\"project-fact\"><strong>Purpose<\/strong><span>Cleaner video access<\/span><\/div>\n<\/div>\n<div class=\"project-deep\" data-lang-block=\"en\">\n<h2>What it is<\/h2>\n<p>TSQL Video is a private video front end built around Invidious. It gives a cleaner way to browse video content while keeping the instance out of public directories and away from unauthenticated traffic.<\/p>\n<h2>Architecture<\/h2>\n<div class=\"workflow-steps\">\n<div class=\"workflow-step\">Caddy receives the public route and sends unauthenticated users to Authelia.<\/div>\n<div class=\"workflow-step\">The Invidious web service handles the user-facing interface and API.<\/div>\n<div class=\"workflow-step\">A companion service handles pieces of the video workflow that should be isolated from the main app.<\/div>\n<div class=\"workflow-step\">Postgres stores the application data, with a separate backup path before risky updates.<\/div>\n<\/div>\n<h2>Design choice<\/h2>\n<p>The important decision is privacy and abuse prevention. A public Invidious instance can attract bandwidth, blocking and maintenance problems. Keeping it private makes it a personal tool instead of public infrastructure.<\/p>\n<ul class=\"tech-tags\">\n<li>Invidious<\/li>\n<li>Postgres<\/li>\n<li>Docker<\/li>\n<li>Private media<\/li>\n<\/ul>\n<\/div>\n<div class=\"project-deep\" data-lang-block=\"nl\">\n<h2>Wat het is<\/h2>\n<p>TSQL Video is een private video-frontend rond Invidious. Het geeft een schonere manier om videocontent te bekijken, terwijl de instance niet publiek in directories staat en geen ongeauthenticeerd verkeer hoeft te bedienen.<\/p>\n<h2>Architectuur<\/h2>\n<div class=\"workflow-steps\">\n<div class=\"workflow-step\">Caddy ontvangt de publieke route en stuurt niet-ingelogde gebruikers naar Authelia.<\/div>\n<div class=\"workflow-step\">De Invidious-webservice verzorgt de interface en API.<\/div>\n<div class=\"workflow-step\">Een companion-service isoleert delen van de videoworkflow van de hoofdapp.<\/div>\n<div class=\"workflow-step\">Postgres bewaart applicatiedata, met een aparte backuppad v\u00f3\u00f3r risicovolle updates.<\/div>\n<\/div>\n<h2>Ontwerpkeuze<\/h2>\n<p>De belangrijkste keuze is privacy en abuse-preventie. Een publieke Invidious-instance kan bandbreedte-, blokkade- en onderhoudsproblemen aantrekken. Priv\u00e9 houden maakt het een persoonlijk hulpmiddel in plaats van publieke infrastructuur.<\/p>\n<ul class=\"tech-tags\">\n<li>Invidious<\/li>\n<li>Postgres<\/li>\n<li>Docker<\/li>\n<li>Private media<\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>A private Invidious-based video front end that stays behind authentication to avoid public-instance risk.<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-197","post","type-post","status-publish","format-standard","hentry","category-projects"],"_links":{"self":[{"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/posts\/197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/comments?post=197"}],"version-history":[{"count":1,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/posts\/197\/revisions"}],"predecessor-version":[{"id":205,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/posts\/197\/revisions\/205"}],"wp:attachment":[{"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/media?parent=197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/categories?post=197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/tags?post=197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}