danielbergholz/techschool.dev
59.1
Adequate · 18 September 2026
5.4k
lines of production code
Elixir
primary language
1
measurement over time
What this system is
TechSchool.dev is a Phoenix LiveView web application designed to curate and display free programming courses and bootcamps sourced from YouTube channels. It provides users with a searchable, filterable catalog of educational content, featuring real-time online user tracking, internationalization in English and Portuguese, and infinite scroll navigation. The system manages structured data for courses, frameworks, and tools, utilizing the YouTube API for metadata and caching to optimize performance.
How it got here
2023 — Initial project setup and core features
22 changes.
This period established the foundational structure for the TechSchool.dev application, implementing core data models for courses, bootcamps, and YouTube integration alongside a modernized Phoenix LiveView stack. Key developments included configuring deployment infrastructure, enabling internationalization with English and Portuguese support, and introducing real-time features such as online user tracking and infinite scrolling.
2024 — LiveView migration and deployment setup
11 changes.
The project migrated key interfaces to Phoenix LiveView, introducing real-time online user tracking, infinite scroll for course listings, and a redesigned homepage with platform statistics. Concurrently, deployment infrastructure was established for Fly.io, including release scripts and IPv6 clustering configuration, while comprehensive tests were added to cover the new LiveView components and features.
Features
Added Portuguese (pt) locale translations
Added the initial Portuguese (pt) translation files for the application, including \default.po\ and \errors.po\ in the \priv/gettext/pt/LC\_MESSAGES\ directory. This enables the UI to display text in Portuguese for users, covering key areas such as the homepage mission statement, course and bootcamp listings, search filters, and standard validation error messages.
priv/gettext/pt · high confidence
Infinite scroll support added to LiveView via new hook
The application now supports infinite scrolling on pages that utilize the new \InfiniteScroll\ LiveView hook. This hook uses an IntersectionObserver to detect when content enters the viewport and automatically pushes an \infinite\_scroll\ event to the server, replacing the need for manual 'Load More' interactions. The change also includes minor formatting updates to the JavaScript file.
assets/js · high confidence
Initial project setup and deployment configuration
This release establishes the foundational structure for the TechSchool.dev application, a Phoenix LiveView platform for curating free programming courses. It introduces the core development tooling, including \.tool-versions\ for Elixir 1.17.3 and Erlang 26.0.2, a \.dockerignore\ file to optimize build contexts, and a multi-stage \Dockerfile\ targeting Ubuntu Noble for GLIBC compatibility. The entry also adds Fly.io deployment configuration (\fly.toml\) with a shared CPU 1x VM, a \fiex.sh\ script for remote production debugging, and an \.env.example\ for the new YouTube API integration. Additionally, it updates the project documentation (\README.md\, \CLAUDE.md\) and corrects the \.gitignore\ and \.formatter.exs\ to include new artifacts and directories.
(repo-wide) · high confidence
New SetLocale plug for URL-based locale detection
A new SetLocale plug has been added to handle locale selection. It detects the user's preferred language from the URL path or an existing cookie, validates it against the available locales, and stores the result in the session and a persistent cookie (valid for one year). If no valid locale is found, it defaults to the system's configured default locale.
_lib/techschool\web/plugs · high confidence
New bootcamp and lesson card components for the course catalog
This change introduces two new HEEx components, \bootcamp\_card\ and \lesson\_card\, which provide a consistent, responsive UI for displaying bootcamp and lesson items in the catalog. Each card features a left-aligned icon, a title, and localized descriptions (English or Portuguese), wrapped in a link that navigates to the specific resource's detail page (e.g., \/bootcamps/:slug\). The layout uses Flexbox to stack vertically on small screens and align horizontally on larger ones, ensuring a clean presentation of course content.
_lib/techschool\_web/live/bootcamp\live/components · high confidence
New bootcamp listing and detail pages
Users can now browse available bootcamps on a new index page and view detailed information on individual bootcamp pages accessed via /bootcamps/:slug. The detail page displays the bootcamp description, an icon, and a list of lessons, and includes a call-to-action link to Course Shelf for further learning resources.
_lib/techschool\_web/live/bootcamp\live · high confidence
New bootcamps, channels, and structured course data with YouTube integration
The application now supports bootcamps, which are collections of lessons, and YouTube channels, which serve as the source for courses. Courses can now be associated with multiple languages, frameworks, tools, and fundamentals, allowing for richer filtering and categorization. The system integrates with the YouTube API to fetch course and channel metadata, and includes a new caching layer via Cachex to optimize external API calls. Seed helpers have been updated to populate these new structures, and the database reset logic has been refined to optionally preserve course data.
lib/techschool · high confidence
New course and platform card components with enhanced metadata and search filters
The course listing interface now uses new \course\_card\ and \platform\_card\ HEEx components. Course cards display view counts, a 'new' badge for recent additions, and country flags (emojis) instead of images, with explicit width/height attributes to prevent layout shifts. Platform cards now support localized descriptions based on the user's language preference. Additionally, a new \search\ component provides filtering capabilities for fundamentals, programming languages, frameworks, and tools.
_lib/techschool\_web/live/course\live/components · high confidence
New online users indicator and componentized icon system
The application now displays a real-time count of online users in the layout, featuring a green pulsing indicator and localized text (e.g., "1 user online"). This functionality is provided by a new \OnlineUsers\ component. Additionally, a new \custom\_icon\ component has been introduced to render a wide variety of technology and social icons (such as GitHub, Discord, and various programming languages) directly within the UI, replacing the previous reliance on static vendor assets.
_lib/techschool\web/components · high confidence
Removals
Home page template removed
The \home.html.heex\ template in the page controllers has been deleted. This removes the default Phoenix home page content, including the introductory text, branding, and navigation links to guides, source code, and changelog.
_lib/techschool\_web/controllers/page\html · high confidence
Behavioural changes
Added Fly.io deployment configuration and release scripts
The application now includes specific configuration and scripts to support deployment on Fly.io. The \rel/env.sh.eex\ file configures the Erlang runtime for distributed nodes over IPv6 and sets up DNS clustering using Fly's internal network. Additionally, new shell and batch scripts (\migrate\, \seed\, \server\) have been added to the release overlays to handle database migrations, data seeding, and starting the Phoenix server in a production release context.
rel · high confidence
Courses page converted to LiveView with search, filters, and infinite scroll
The courses listing page now uses a LiveView component, replacing the previous static or non-live implementation. Users can search for courses and filter results by language, framework, tool, and fundamentals, with filters persisted in the URL. The page supports infinite scrolling to load more courses automatically, replacing the previous 'Load More' button mechanism. Additionally, recently added courses are marked with a 'new' badge, and view counts are tracked when users click on a course.
_lib/techschool\_web/live/course\live · high confidence
Database schema overhaul: icon names replace image URLs and view counts added
The database schema has been updated to support a new icon-based visual system and course analytics. The \image\_url\ column has been removed from the \bootcamps\, \frameworks\, \fundamentals\, \languages\, \lessons\, and \tools\ tables and replaced with an \icon\_name\ string column, enabling the use of inline SVGs instead of external images. Additionally, a \view\_count\ integer field (defaulting to 0) has been added to the \courses\ table to track usage, and the \channels\ table now uses \youtube\_channel\_id\ for unique identification.
priv/repo/migrations · high confidence
Enable local seed helper execution
The seed script now invokes the \Techschool.Helpers.SeedLocal\ module, allowing users to run local seeding operations directly from the script.
priv/repo · high confidence
Home page redirects to localized routes
Visiting the root URL now redirects to a locale-specific path (e.g., /en) instead of rendering a static home page directly. The previous PageController that rendered the home view without a layout has been replaced with a simple redirect logic, and the associated PageHTML view module has been removed, indicating a shift away from the traditional controller/template approach for the home page.
_lib/techschool\web/controllers · high confidence
Homepage UI components restructured with new footer and language grid
The homepage layout components have been updated to improve navigation and presentation. A new footer component now displays the developer credit (Daniel Bergholz) without the previous GitHub link. A programming languages grid component has been added, providing clickable filters for technologies like Go, Elixir, Python, Ruby, React, Node, Laravel, Postgres, Phoenix, and Ash, along with a 'Much more' link. Additionally, a new translate button component replaces previous country images with flag emojis (🇧🇷, 🇺🇸) to toggle between Portuguese and English locales.
_lib/techschool\_web/live/page\live/components · high confidence
Initial English localization for TechSchool platform
The application now includes the default English translation file (\priv/gettext/en/LC\_MESSAGES/default.po\), enabling internationalization support for the TechSchool platform. This change introduces translations for key user-facing strings across the homepage, course search and filtering interface, bootcamp details, and navigation components, ensuring that text such as 'Courses', 'Search', 'Fundamentals', and time-relative labels like 'Last updated' are properly localized for English-speaking users.
priv/gettext/en · high confidence
Live View routing, online user tracking, and i18n improvements
The application now supports Live View for the home page, courses listing, and bootcamp details, with routes scoped by locale (e.g., /:locale). A new online users counter module leverages Phoenix Presence to track and display the number of active users. Internationalization is improved by switching the Gettext backend to use Gettext.Backend and adding a SetLocale plug to the router. Additionally, the LiveView socket endpoint now supports longpolling, and the Tidewave plug is conditionally added if loaded.
_lib/techschool\web · high confidence
LiveView helper functions and static asset updates
The application now includes a sitemap.xml file in the served static assets, making it available to crawlers. For developers building LiveViews, the techschool\_web.ex module now provides convenience helper functions ok/1 and noreply/1 to simplify socket return values. Additionally, the module now automatically mounts the RestoreLocale and OnlineUsersCounter hooks for all LiveViews, ensuring consistent locale restoration and user counting behavior across the application.
lib · high confidence
LiveView hooks for online user tracking and locale restoration
The application now uses dedicated LiveView hooks to manage state on mount. A new OnlineUsersCounter hook automatically subscribes to pub-sub events and assigns the current count of online users to the socket, ensuring the UI reflects real-time activity. Additionally, a RestoreLocale hook replaces the previous plug-based approach by reading the locale from the session (or using a default) and setting it via Gettext during the LiveView mount phase, ensuring consistent language handling across live views.
_lib/techschool\web/hooks · high confidence
Navbar refactored into a LiveView component with updated navigation and styling
The site navigation has been extracted into a dedicated LiveView component (NavbarLive) to enable real-time updates, specifically for the online user count which now subscribes to PubSub events. The navigation structure has been updated to include a new 'Bootcamps' link alongside 'Courses', and the visual style for links has changed to use underline decorations on hover instead of color changes. Additionally, the navigation now supports locale-based routing paths.
_lib/techschool\web/components/layouts/components · high confidence
New global styles, gradient utilities, and floating animations
The application now uses the 'Plus Jakarta Sans' font family with a dark theme (black background, white text). New CSS variables define core colors and a purple-to-pink gradient. Users can now use \.gradient-container\ and \.gradient-item\ classes for styled containers with gradient borders. Tailwind utility classes \.container-l1\, \.container-l2\, and \.container-l3\ provide specific responsive widths. Additionally, new animation classes \.animate-float\, \.animate-float-slow\, and \.animate-float-delayed\ are available for floating effects.
assets/css · high confidence
Redesigned homepage with platform statistics and social links
The homepage has been restructured to display key platform statistics, including total courses, bootcamps, and views, along with a 'last updated' timestamp. A new section highlights social media links for Discord, GitHub, Sponsorship, and Analytics, while the hero area now features a 'Course Shelf' call-to-action banner and floating programming language icons. The page also includes a mission statement section and uses async assignment to fetch GitHub contributors data.
_lib/techschool\_web/live/page\live · high confidence
Redesigned site layout with SEO, analytics, and dynamic branding
The application's visual structure and metadata have been significantly updated. The app layout now uses a sticky black header that renders a new \navbar\ component, replacing the previous static header with version info and external links; this navbar dynamically displays the page title, locale, and online user count. The root layout has been enhanced for search engine optimization and social sharing by adding comprehensive Open Graph and Twitter meta tags, a canonical link, and a dynamic HTML language attribute based on the current locale. Additionally, the site now uses the 'Plus Jakarta Sans' font with optimized loading strategies, includes Plausible analytics for traffic tracking, and updates the default page title suffix to 'TechSchool'.
_lib/techschool\web/components/layouts · high confidence
Switches HTTP adapter to Bandit and updates build tool defaults
The application's HTTP server adapter has been changed from Cowboy2 to Bandit, requiring updated documentation references in the production configuration. Build tool configurations for esbuild and Tailwind CSS have been renamed from the generic 'default' profile to 'techschool', and Tailwind CSS has been upgraded from version 3.3.2 to 3.4.0. Additionally, the default locale for internationalization is now set to 'en', and the test environment's database connection pool size is dynamically calculated based on the number of online schedulers rather than a fixed size of 5.
config · high confidence
Tailwind configuration updates for CSS variables, background patterns, and Heroicon sizing
The Tailwind configuration has been updated to replace hardcoded brand colors with CSS custom properties (gray, green, black, white) and to add a new 'pattern' background image sourced from a CDN. Additionally, the Heroicon plugin now supports a new '-micro' icon size variant and dynamically adjusts icon dimensions based on the specific variant (micro, mini, or default), ensuring consistent sizing across different icon scales.
assets · high confidence
Updated i18n extraction templates
The \default.pot\ template has been regenerated to include new translatable strings extracted from the application's HEEx templates and Elixir modules, covering UI elements such as course search filters, bootcamp details, contributor acknowledgments, and time-relative labels. Additionally, the \errors.pot\ template was cleaned up by removing an extraneous blank line to ensure proper formatting for downstream translation tools.
priv/gettext · high confidence
Test coverage
Added LiveView tests for bootcamp, course, and home pages; Added test fixtures for Bootcamps, Channels, Courses, Frameworks, Fundamentals, Languages, Lessons, Platforms, and Tools; Added tests for the OnlineUsers component; Added tests for the online users counter; Updated page controller tests to verify locale-based redirection.
Dependencies
Major dependency upgrades and new tooling integration
This update upgrades the core Elixir runtime to 1.17 and significantly bumps major framework dependencies, including Phoenix to 1.8, Phoenix LiveView to 1.1, and Phoenix HTML to 4.0. The web server adapter has switched from Cowboy to Bandit, and several supporting libraries have been updated to their latest major versions, such as Gettext (1.0), Telemetry Metrics (1.0), and Ecto SQLite3 (0.22). Additionally, new development and testing tools have been introduced, including Igniter, Lazy HTML, Credo, Req, and Cachex, while the Heroicons library is now sourced directly from GitHub.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 59.
Lenses
- Code Health 98
- Architecture 92
- Maturity 64
- Readiness 46
- Security 84
- Accessibility 64
Changes since last survey
- 300 commits — 277 feature/other, 23 fixes
By area
- (root) — 57 commits
- priv/repo — 56 commits
- lib/techschool_web — 51 commits
- (repo) — 50 commits
- lib/techschool — 32 commits
- priv/static — 14 commits
- priv/gettext — 10 commits
- test/techschool_web — 8 commits
- .github/workflows — 7 commits
- docs/contributing-guide.md — 5 commits
- .github/dependabot.yml — 2 commits
- test/support — 2 commits
- test/techschool — 2 commits
- .github/PULL_REQUEST_TEMPLATE.md — 1 commit
- config/config.exs — 1 commit
- docs/tech-stack.md — 1 commit
- rel/overlays — 1 commit
Notable commits
- fix: Fix GLIBC compatibility issue by upgrading to Ubuntu Noble
- fix: Fix Gettext
- fix: Fix ResetDb bug
- fix: Fix Channels.get_channel_by_youtube_channel_id
- fix: Fix course date
- fix: Fix course type on youtube module
- fix: Fix elixir course image_url
- fix: Fix img shrinking inside flexbox
- fix: Fix links images shrinking when loading
- fix: Fix load more button appears if number of courses is divisible by 20
- fix: Fix load more button breaks filter
- fix: Fix missing associations on platforms fixtures
- fix: Fix online users test
- fix: Fix platforms only showing in english
- fix: Fix wrong format
- fix: Fix youtube module
- fix: Merge pull request #68 from danielbergholz/fix/install-sqlite-on-ci
- fix: Merge pull request #69 from Flo0807/feature/fix-course-loading
- fix: fix ci
- fix: fix ci
- …and 280 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
danielbergholz/techschool.dev was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 18 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 1487edced167f68d05da20d965c6bb77d6dd41da — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-5d04157a340d.