hashrocket/tilex
50.0
Adequate · 3 October 2026
4k
lines of production code
Elixir
with JavaScript
2
measurements over time
What this system is
Tilex is a Phoenix-based blogging platform designed for tracking 'Today I Learned' posts, featuring a robust content management system with draft support, markdown processing, and channel-based organization. It provides a modern frontend via Phoenix LiveView and includes a public API and an MCP server for external tool integration. The system also handles user authentication, asynchronous notifications to social channels, and detailed usage statistics.
How it got here
2016 — Project rename and Phoenix 1.5 migration
19 changes.
The project was rebranded from TodayILearned to Tilex and upgraded to Phoenix 1.5.6, introducing runtime configuration and switching the asset pipeline from Brunch to esbuild. This period established the core application structure, including database schema updates for post publishing and developer API access, while replacing legacy scaffolding with comprehensive test coverage using Wallaby.
2017 — Phoenix 1.4 upgrade and feature expansion
23 changes.
The project upgraded to Phoenix 1.4, restructuring the web layer under the TilexWeb namespace and introducing Phoenix LiveView for a modernized frontend. This period also saw significant feature additions, including a public API, developer profile management with MCP key generation, and an extensible asynchronous notification system for Slack and Twitter.
2018–2025 — Core blog infrastructure and modernization
11 changes.
This period focused on establishing the foundational blog data models, content sanitization, and an MCP server for external integration. It also involved modernizing the frontend by migrating layouts to HEEx with LiveView support and converting stylesheets from Sass to plain CSS, alongside comprehensive test coverage for authentication and core modules.
Features
Add public API endpoints for querying posts and developer feeds
New API controllers have been introduced to expose public endpoints for retrieving post data. The new \TilexWeb.Api.PostController\ provides an endpoint to query the main feed of posts with pagination support, while \TilexWeb.Api.DeveloperPostController\ allows external users to retrieve the three most recent posts for a specific developer by username. These changes enable external applications to consume Tilex content via JSON responses.
_lib/tilex\web/controllers/api · high confidence
Add random post navigation to channel view
The channel show page now includes a link to view a random post within the selected channel, displayed as a 'surprise' icon next to the channel header. This allows users to quickly discover content by jumping to a random entry in the channel's post list.
_lib/tilex\web/templates/channel · high confidence
Add text conversion WebSocket channel and update socket configuration
The application now supports a new WebSocket channel for converting Markdown to HTML. A new \TextConverterChannel\ module has been added to handle the \text\_converter\ topic, allowing clients to send Markdown content and receive the converted HTML. The \UserSocket\ has been updated to register this new channel, and the module structure has been migrated from the legacy \web/\ directory to \lib/tilex\_web/\, with the socket module renamed to \TilexWeb.UserSocket\ to reflect the new application structure.
_lib/tilex\web/channels · high confidence
Added PrismJS 1.16.0 syntax highlighting support
The project now includes PrismJS 1.16.0 in the vendor assets to provide syntax highlighting for code blocks. This addition introduces the 'prism-tomorrow' theme and supports a wide range of programming languages, including JavaScript, CSS, HTML, C, C\#, Bash, Python, and many others, along with plugins for code toolbars and language display.
assets/vendor · high confidence
Initial project scaffolding and configuration
The repository is initialized with the foundational configuration files required to run the Tilex application. This includes the Credo linter configuration (.credo.exs), Elixir formatter settings (.formatter.exs), and an IEx session helper (.iex.exs) for developer convenience. Environment variables are standardized via .env.example, and deployment is configured for Heroku through app.json, Procfile, and buildpack configs (elixir\_buildpack.config, phoenix\_static\_buildpack.config). Developer workflows are streamlined with a Makefile and tool versioning via .tool-versions (Elixir 1.18.4, Erlang 28.1, Node.js 19.0.0). The project also introduces OpenSpec-based AI instructions (AGENTS.md) and standard open-source documentation (README, CONTRIBUTING, CODE\_OF\_CONDUCT, LICENSE).
(repo-wide) · high confidence
Initial release of the Tilex application core
This change introduces the foundational library code for the Tilex application, replacing the previous 'TodayILearned' codebase. It establishes the OTP application structure with a supervision tree including the database repository, Phoenix endpoint, Cachex cache, and new services for notifications, rate limiting, and an MCP server. The update implements core domain logic for managing blog posts (including creation, updates, deletion, and search with weighted ranking), a markdown processing pipeline with caching and HTML sanitization, and a statistics engine for tracking page views, most viewed posts, and developer activity. It also adds infrastructure for asynchronous notifications, ETS-based rate limiting to prevent abuse, and configurable pagination.
lib/tilex · high confidence
Introduce blog data models and content sanitization
This change introduces the core Ecto schemas for the blog feature, including Post, Developer, Channel, and Request, establishing the data structure for managing blog content and user accounts. It also adds a PostScrubber module that sanitizes HTML output from markdown conversion, allowing a specific set of safe tags and attributes while stripping potentially dangerous content to ensure user safety.
lib/tilex/blog · high confidence
New MCP server for creating and listing TIL posts
lib/tilex/mcp · high confidence
New Mix tasks for database migration, page view reports, and posting streaks
Three new CLI commands are now available for managing and inspecting Tilex data. \mix tilex.hdb\ allows developers to replace their local PostgreSQL database with a dump from a specified Heroku app, facilitating easier local development with production-like data. \mix tilex.page\_views\ prints a summary of page view statistics for the last two weeks and can optionally send this report to configured notifiers via the \notify\ flag. \mix tilex.streaks\ calculates and displays the longest consecutive days (streaks) in which posts were published, supporting an optional username filter to view streaks for specific authors.
lib/mix/tasks/tilex · high confidence
New controllers for authentication, developer management, and site infrastructure
This change introduces several new controller modules to handle specific application features and infrastructure needs. The AuthController manages OAuth sign-in and sign-out via Ueberauth and Guardian, enforcing domain and allowlist checks. The DeveloperController allows authenticated users to view their profile, update their details, and generate MCP API keys. The PixelController handles asynchronous page-load tracking via a JavaScript pixel. Additionally, new controllers are added for site infrastructure: FeedController serves RSS/Atom feeds, SitemapController generates the XML sitemap, WebManifestController serves the PWA manifest, and StatsController provides statistics views for both general visitors and authenticated developers. The PostController is also updated to support these new flows, including structured data injection and specific handling for search and random post views.
_lib/tilex\web/controllers · high confidence
New developer profile management and MCP API key generation
Developers can now edit their profile settings, specifically selecting their preferred code editor (Text Field, Vim, or Code Editor) via a new edit page. Additionally, the profile interface includes a dedicated section for generating and managing MCP API keys, providing ready-to-use configuration snippets for integrating with Claude Code and Cursor, along with security messaging for key regeneration.
_lib/tilex\web/templates/developer · high confidence
New extensible notification system with Slack, Twitter, and Webhook support
The platform now includes a new notification infrastructure that allows posts and engagement metrics to be reported to external channels. Users can now receive Slack notifications for new posts and like milestones (including specific emojis for high engagement), have new posts automatically tweeted to the X (Twitter) API v2, and trigger custom webhooks with basic authentication when posts are created. This system is built on a shared \Notifier\ behavior, making it easy to add or modify notification sources in the future.
lib/tilex/notifications/notifiers · high confidence
New mix tasks for deployment and migration testing
Added two new Mix tasks to the CLI: \mix deploy\ allows users to deploy to staging or production environments by fetching remote tags, resetting local tags, pushing to Heroku, running database migrations, and restarting the app; \mix ecto.twiki\ provides a convenience command to run an Ecto migration up, then down, then up again to verify migration reversibility for a single repository.
lib/mix/tasks · high confidence
New shared post template and marketing footer components
The application now includes a new shared post template that displays a draft badge for unpublished posts, renders the post body as raw HTML, and provides links to view the raw markdown source, edit, or delete the post (for creators/admins). It also includes a Twitter share button (hidden in test environments) and a like button with a heart icon. Additionally, new marketing footer components have been added for Elixir, JavaScript, Rails, React, Ruby, SQL, and Vim, each linking to relevant Hashrocket service pages or community resources.
_lib/tilex\web/templates/shared · high confidence
Removals
Removal of default Phoenix application layout and page templates
The default application layout template (app.html.eex) and the default page index template (page/index.html.eex) have been removed from the web/templates directory. This eliminates the standard Phoenix scaffolding that previously provided the base HTML structure, navigation, flash message display, and the initial welcome page content, indicating that the application is moving away from the out-of-the-box Phoenix starter UI towards a custom implementation.
web/templates · high confidence
Removal of legacy TodayILearned application scaffolding
The legacy \TodayILearned\ application structure has been removed, specifically deleting the \PageController\ and the main \Router\ configuration. This eliminates the default root route (\/\) and the associated browser pipeline that previously handled session fetching, flash messages, and security headers for the main application scope.
web · high confidence
Behavioural changes
API posts now include channel and developer details
The API response for posts has been expanded to include the channel name and developer username alongside the existing slug, title, and insertion timestamp. This change introduces a new view template (post\_with\_developer.json) used for the main post listing, while a simpler template remains for individual post views, ensuring clients receive richer context about the post's origin and author.
_lib/tilex\web/views/api · high confidence
Add podcast channels to the site sitemap
The sitemap template now includes URLs for podcast channels alongside existing posts and the homepage. This ensures that channel pages are discoverable by search engines with a daily change frequency and a priority of 0.4.
_lib/tilex\web/templates/sitemap · high confidence
Add standalone 404 and 500 error templates
The application now renders dedicated error pages for 404 (Not Found) and 500 (Internal Server Error) conditions. These new templates provide specific user-facing messages—"...that there is no page at this URL!" for missing pages and "...that something is broken!" for server errors—replacing any previous generic or layout-dependent error handling in this location.
_lib/tilex\web/templates/error · high confidence
Application renamed to Tilex and web module updated for Phoenix 1.5
The application has been renamed from TodayILearned to Tilex, with the main application module simplified and the web interface module (TilexWeb) restructured to align with Phoenix 1.5 conventions. This includes adding support for LiveView and LiveComponents, updating controller and view imports to use the new namespace, and integrating Appsignal for observability.
lib · high confidence
Asynchronous notification system with configurable webhooks
The notification system has been refactored to run asynchronously via a supervised GenServer, decoupling post creation and liking events from the main request flow. This change introduces a new NotifiersSupervisor that manages Slack, Twitter, and a newly added Webhook notifier, allowing posts to trigger notifications to all three channels without blocking the user. Additionally, a weekly page views report is now scheduled to run automatically every Monday at 9 AM.
lib/tilex/notifications · high confidence
Custom authentication error handling and session clearing
The authentication system now includes a dedicated error handler that intercepts Guardian plug pipeline errors. When an authentication failure occurs, the system automatically signs out the current user, clears the session, and redirects them to the blog index page with an informational flash message stating that authentication is required. This ensures a consistent user experience by preventing partial login states and guiding unauthenticated users back to the main content.
lib/tilex/auth · high confidence
Database schema updates for post publishing, developer API access, and request tracking performance
The database schema has been updated to support new content and operational capabilities. Posts now support draft states via a nullable \published\_at\ timestamp, and developers can authenticate via a new unique \mcp\_api\_key\ column. To improve admin dashboard performance, the \requests\ tracking table now includes a database index on \request\_time\ converted to the application's configured timezone (defaulting to America/Chicago), replacing the previous hardcoded Chicago-specific index. Additionally, the schema retains support for channels, post likes with constraints, and developer profile details like editor preference and admin status.
priv/repo/migrations · high confidence
Database structure and seed data updated for Tilex
The database schema has been updated to include a new \channels\ table and a \published\_at\ timestamp on posts, while the \developers\ table now includes an \mcp\_api\_key\ field. The project has been renamed from TodayILearned to Tilex, reflected in the seed script which now populates the database with Tilex-specific channels (phoenix, elixir, erlang) and posts. Additionally, error message translations have been refreshed to align with Ecto changeset updates, such as adding 'must be accepted' and correcting association phrasing.
priv/repo · high confidence
Migrate layout templates to HEEx and introduce LiveView support
The application's layout templates have been converted from EEx to HEEx syntax, aligning with the modern Phoenix rendering approach. A new \live.html.heex\ layout has been added to support Phoenix LiveView, featuring specific flash handling with \phx-click\ attributes for dismissing alerts. The main \app.html.heex\ layout now conditionally applies a banner class based on the \banner\_image\_source\ environment configuration. Additionally, the \root.html.heex\ template has been updated to include structured data (JSON-LD) for organization and post metadata, along with meta tags for social sharing (Open Graph, Twitter Cards) and configurable robots directives.
_lib/tilex\web/templates/layout · high confidence
Migrate stylesheets from Sass to plain CSS with modular structure
The application's styling system has been converted from Sass to plain CSS, introducing a modular file structure in the assets/css directory. The new layout includes a main app.css entry point that imports distinct modules for variables (CSS custom properties), normalization, resets, layout, site navigation, components, pages, and icons. This change replaces the previous single-file or Sass-based approach with a flat, import-based architecture that defines global design tokens and component styles using standard CSS syntax.
assets/css · high confidence
Migrate to Phoenix 1.5.6 runtime configuration and esbuild
The application configuration has been updated to support Phoenix 1.5.6, introducing \config/runtime.exs\ to handle production secrets and environment variables (such as \DATABASE\_URL\, \SECRET\_KEY\_BASE\, and \POOL\_SIZE\) at runtime rather than compile time. The build system has switched from Brunch to esbuild for bundling JavaScript assets, and the configuration module has been migrated from the deprecated \Mix.Config\ to the standard \Config\ module. Additionally, the application has been renamed from \today\_i\_learned\ to \tilex\, and various environment-specific settings for features like Google OAuth, Slack notifications, and rate limiting are now explicitly configured or sourced from environment variables.
config · high confidence
Migrate to Phoenix LiveView and enable image pasting in post editor
The application's frontend JavaScript has been restructured to support Phoenix LiveView, replacing the previous socket-based architecture with a new \LiveSocket\ initialization in \app.js\. This change introduces a new post editor experience powered by CodeMirror (with optional Vim keybindings), which now supports pasting images directly into the text area; these images are asynchronously uploaded to Imgur and inserted as Markdown links, accompanied by a loading indicator during the upload process. Additionally, flash messages now automatically fade out after 10 seconds, and the site navigation has been updated to close other open menu items when a new link is toggled.
assets/js · high confidence
New request handling plugs for canonical URLs, rate limiting, and path rejection
The application now includes four new Plug modules in the \lib/tilex/plug\ directory to handle specific request lifecycle tasks. \SetCanonicalUrl\ automatically assigns a canonical URL to every request based on the configured domain and request path, ignoring query parameters. \RateLimiter\ enforces limits on user actions (such as liking posts) by checking IP-based quotas and returning a 429 status with a custom message if exceeded. \RequestRejector\ blocks requests to forbidden paths, specifically rejecting any path ending in \.php\ with a 404 error. Finally, \FormatInjector\ ensures the correct response format is set by extracting the file extension from the \titled\_slug\ parameter, defaulting to HTML if none is present.
lib/tilex/plug · high confidence
RSS feed titles now include the channel hashtag
The RSS feed template has been updated to append the channel name as a hashtag to each post's title (e.g., "Post Title - \#channel"). This change improves feed readability by immediately identifying the topic category for each item, leveraging the new \post.channel.name\ attribute available in the updated Phoenix 1.3 view context.
_lib/tilex\web/templates/feed · high confidence
Redesign post creation and editing interface with draft support and image upload feedback
The post creation and editing experience has been updated to support saving posts as drafts, indicated by the conditional display of a 'Save & Publish' button that only appears when a post is not yet published. The form now includes a character limit indicator for titles and a word count preview for the body content. Additionally, a loading indicator is displayed to users during image uploads, providing visual feedback while the operation completes.
_lib/tilex\web/templates/post · high confidence
Redesigned statistics dashboard with date filtering and channel context
The statistics pages have been updated to provide more granular insights for developers and general users. The developer-specific statistics view now includes a date range filter, allowing users to view most viewed posts and total page views within a specific period, and displays the channel name alongside post titles. The main statistics index page retains the activity chart for the last 30 days but also lists hottest and most liked posts with their associated channel names. Both views continue to show aggregate counts of posts, channels, and authors.
_lib/tilex\web/templates/stats · high confidence
Refreshed view layer with new Phoenix 1.3 conventions and enhanced metadata support
The view layer has been restructured to align with Phoenix 1.3 standards, introducing dedicated views for channels, developers, feeds, sitemaps, stats, and web manifests. This update adds support for Twitter Card metadata (title, description, and image) and structured data (JSON-LD) for posts and organization info, improving SEO and social sharing. It also introduces timezone-aware date display for posts, SVG icon rendering, and error handling templates for 404 and 500 status codes.
_lib/tilex\web/views · high confidence
Removal of default CSS stylesheets
The default application CSS files, \app.css\ and \phoenix.css\ (which included Bootstrap v3.3.5 and Glyphicons), have been removed from the \web/static/css\ directory. This change eliminates the pre-bundled styling and icon assets, requiring users to provide their own stylesheets or integrate a CSS framework manually.
web/static/css · high confidence
Removal of legacy view modules during project rename
The view modules for error handling, layout, page, and error helpers have been removed from the codebase. This change is part of the broader rename from 'TodayILearned' to 'Tilex', eliminating the old module definitions that are no longer needed in the new project structure.
web/views · high confidence
Removal of main application JavaScript entry point
The primary JavaScript entry point file (app.js) has been deleted from the web/static/js directory. This file previously handled the import of the phoenix\_html dependency and served as the central bundle for local JavaScript files. Its removal indicates a shift in how client-side assets are managed or bundled, potentially moving away from the previous Brunch-based concatenation and import structure.
web/static/js · high confidence
Rename application from TodayILearned to Tilex
The application module names and OTP application identifier have been renamed from TodayILearned to Tilex. This change updates the core application identity, affecting how the application is referenced in configuration and code.
_lib/today\_i\learned · high confidence
Upgrade to Phoenix 1.4 and migrate to modern web architecture
The application has been upgraded to Phoenix 1.4, introducing support for Phoenix LiveView via a new \/live\ socket and enabling the LiveDashboard for development monitoring. The web layer has been restructured under the \TilexWeb\ namespace, replacing the previous \TodayILearned\ module structure, and static assets are now served with gzip compression enabled. Additionally, the router now includes a dedicated \/mcp\ scope for the Anubis MCP server, API endpoints for recent and developer posts, and a rate-limiting pipeline for post interactions.
_lib/tilex\web · high confidence
Test coverage
Added and updated view tests for Tilex; Added controller tests for authentication, posts, stats, and web manifest; Added test controller for authentication flow; Added test coverage for Tilex blog, MCP, and Slack notification modules; Added test stubs for Slack, Twitter, and Webhook notifiers; Added tests for Markdown parsing, rate limiting, and tracking logic; Added tests for auth error handling; Added tests for developer and API post controllers; Added tests for notification report scheduling logic; Added tests for request rejection and canonical URL setting plugs; Integration test suite for post and developer features; New page object modules for integration tests; Refactor test support infrastructure and migrate to Wallaby; Updated test helper to use Tilex application and Wallaby.
Dependencies
Migrate build tooling from Brunch to esbuild and upgrade Elixir/Phoenix stack
The project has replaced the Brunch asset pipeline with esbuild for compiling and minifying static assets, shifting the JavaScript build configuration from the root package.json to a new assets/package.json. This change accompanies a major upgrade of the Elixir runtime to version 1.14 and the Phoenix framework to 1.6, along with significant updates to core dependencies such as Ecto, Phoenix LiveView, Guardian, and Postgrex. The application module and supervision tree have been restructured to align with modern OTP standards, and the project name has been updated from TodayILearned to Tilex.
(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
Score
- CAI 53 → 50 (-3.1)
- Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.
Lenses
- Code Health 67 → 68 (+1.2)
- Architecture 88 → 90 (+2.0)
- Maturity 51 → 51 (+0.0)
- Readiness 46 → 40 (-6.7)
- Security 74 → 71 (-2.8)
- Accessibility 60 → 60 (+0.0)
Resolved (3)
- Coverage not measured — no coverage collector is wired up
- Documentation: no architecture or design documentation (README.md)
- Off-boarding risk: anonymized user #1
New (2)
- End-of-life runtime: Node.js 19
- Off-boarding risk: anonymized user #1
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
hashrocket/tilex 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 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit a5789bdd5ef50153b5304ac217b9f1a64dee94f4 — the exact code this score is about.
- Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-8fe32cd45d00.