<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/sources/lobsters/best-of/2025/12" -->

---
title: Best Lobsters posts — December 2025 | daily.dev
description: The most upvoted Lobsters posts from December 2025, curated by the daily.dev community.
canonical: https://daily.dev/sources/lobsters/best-of/2025/12
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:url: https://daily.dev/sources/lobsters/best-of/2025/12
og:type: website
og:site_name: daily.dev
og:title: Best Lobsters posts — December 2025 | daily.dev
og:description: The most upvoted Lobsters posts from December 2025, curated by the daily.dev community.
og:image: https://media.daily.dev/image/upload/s--VAY5ToZt--/f_auto/v1724209435/public/daily.dev%20-%20open%20graph
---

# Best of Lobsters — December 2025

1. 1  
[](https://daily.dev/posts/i-m-a-former-cto-here-is-the-15-sec-coding-test-i-used-to-instantly-filter-out-50-of-unqualified-a-gyi9vs462 "I’m a former CTO. Here is the 15 sec coding test I used to instantly filter out 50% of unqualified applicants. – Jose Zarazua")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 37w  
I’m a former CTO. Here is the 15 sec coding test I used to instantly filter out 50% of unqualified applicants. – Jose Zarazua  
A former CTO shares a simple coding screening question used to filter job applicants. The test presents basic code logic that qualified developers can solve mentally in seconds, while unqualified candidates resort to copy-pasting into interpreters or AI tools. The question includes a hidden character that produces different results when copy-pasted versus solved manually. Results showed 50% of applicants used automated tools, 47% answered correctly, and 3% answered incorrectly, effectively halving the candidate pool requiring deeper review.  
917  
100
2. 2  
[](https://daily.dev/posts/vanilla-css-is-all-you-need-yaq77f62e "Vanilla CSS is all you need")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 39w  
Vanilla CSS is all you need  
Modern CSS has evolved to include native variables, nesting, container queries, and advanced features like :has() and color-mix(), making build tools and preprocessors unnecessary for many projects. An analysis of three production applications from 37signals (Campfire, Writebook, and Fizzy) reveals a consistent nobuild CSS architecture using OKLCH colors, character-based spacing, semantic component classes with minimal utilities, and progressive adoption of cutting-edge CSS features. The approach demonstrates that vanilla CSS can handle real-time chat, publishing platforms, and project management tools with 14,000 lines across 105 files, achieving sophisticated interactions like animated dialogs, dynamic theming, and stateful UI without JavaScript or build steps.  
212  
15
3. 3  
[](https://daily.dev/posts/use-python-for-scripting--2rd0sg3m6 "Use Python for Scripting!")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 39w  
Use Python for Scripting!  
Python 3 offers significant advantages over shell scripts for automation tasks, particularly for cross-platform compatibility. While Bash scripts often fail between Linux and Mac due to GNU vs BSD tool differences, Python's standardized library works consistently across systems. Python provides better readability with human-readable method names, a comprehensive standard library covering JSON, HTTP, and data structures, and is pre-installed on most machines. The article demonstrates practical examples comparing Bash's cryptic syntax with Python's clearer alternatives, recommending Python for scripts that grow beyond 10-20 lines or become difficult to maintain.  
131  
21
4. 4  
[](https://daily.dev/posts/go-ahead-self-host-postgres-9xxotfi6r "Go ahead, self-host Postgres")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 38w  
Go ahead, self-host Postgres  
Self-hosting Postgres is more practical than cloud providers suggest. The author shares two years of experience running self-hosted Postgres serving millions of daily queries with minimal operational overhead (30 minutes monthly). Managed services like AWS RDS run standard Postgres with operational tooling, but at significant markup. Self-hosting offers better performance tunability, lower costs (dedicated servers cost less than equivalent RDS instances), and comparable reliability. The article provides specific configuration guidance for memory, connections, storage, and WAL settings, plus realistic time estimates for maintenance tasks. Self-hosting makes sense for most teams between complete beginners and enterprise-scale operations requiring dedicated database engineers.  
76  
5
5. 5  
[](https://daily.dev/posts/gin-is-a-very-bad-software-library-8mxglpldh "Gin is a very bad software library")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 39w  
Gin is a very bad software library  
Gin is criticized as an overly complex Go web framework with massive bloat compared to the standard library. The framework requires over 1 million lines of code and 55MB of dependencies to accomplish what net/http does in 25,000 lines. Its API design violates Unix philosophy with enormous interfaces (gin.Context has 100+ methods), creates unnecessary abstraction layers that obscure control flow, and makes migration away nearly impossible once adopted. The article demonstrates how Gin's complexity provides no real benefit over using Go's standard library directly, while significantly increasing binary size, compilation time, and cognitive overhead.  
60  
8
6. 6  
[](https://daily.dev/posts/goodbye-sass-lf9vddw6q "Goodbye SASS")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 36w  
Goodbye SASS  
A developer shares their experience migrating from SASS to native CSS after modern features like nesting became widely supported. They replaced SASS with simple file concatenation and esbuild for minification, reducing critical dependencies. The decision prioritizes long-term maintainability over short-term optimization, as esbuild is optional for minification while SASS was required for compilation. The approach reflects lessons from maintaining a website for over 30 years, emphasizing the importance of choosing tools based on what happens when they disappear.  
44  
5
7. 7  
[](https://daily.dev/posts/you-can-t-opt-out-of-accessibility-qatebjjev "You Can't Opt-Out of Accessibility")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 37w  
You Can't Opt-Out of Accessibility  
Web accessibility is a fundamental requirement, not an optional feature. The industry has deprioritized accessibility in favor of developer convenience, treating it as an afterthought rather than a core responsibility. Legal mandates like the EAA and ADA have led to checkbox compliance rather than genuine improvement. Accessible design benefits everyone through universal design principles like captions, alt text, and intuitive interfaces. Real accessibility requires hiring professionals, integrating accessibility into every development phase, testing with actual users of assistive technologies, and recognizing it as everyone's responsibility. The human cost of inaccessible products is severe for people with disabilities who face physical exhaustion and exclusion from digital experiences.  
25  
9
8. 8  
[](https://daily.dev/posts/a-solid-load-of-bull-hw6sdv1co "A SOLID Load of Bull")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 36w  
A SOLID Load of Bull  
A critical examination of the SOLID principles in object-oriented programming. The Liskov substitution principle is endorsed as mathematically sound and universally applicable. The open-closed principle is deemed obsolete in modern languages with proper tooling. The single-responsibility, interface segregation, and dependency inversion principles are criticized as misguided heuristics that lead to over-engineered code. The author argues for focusing on module depth (small interfaces with substantial implementations) rather than blindly following SOLID, and advocates injecting dependencies only when genuinely necessary rather than as default practice.  
23  
2
9. 9  
[](https://daily.dev/posts/the-html-elements-time-forgot-8irc0ubvy "The HTML Elements Time Forgot")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 37w  
The HTML Elements Time Forgot  
HTML has evolved significantly since 1993, leaving behind numerous obsolete elements that were once part of the standard. This exploration covers deprecated tags like <marquee>, <bgsound>, framesets, various code display elements (<xmp>, <listing>, <plaintext>), <spacer>, <keygen>, <nextid>, <isindex>, and <dir>. Each represented experiments in web development that addressed specific needs of their era, from background sounds and frame-based layouts to primitive search functionality and cryptographic key generation. While most are no longer supported or have modern equivalents, they illustrate how the web platform evolved through trial and error, with backward compatibility sometimes preserving these relics even after deprecation.  
23  
1
10. 10  
[](https://daily.dev/posts/in-defense-of-lock-poisoning-in-rust-sunshowers-gbd3raimp "In defense of lock poisoning in Rust · sunshowers")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 40w  
In defense of lock poisoning in Rust · sunshowers  
Lock poisoning in Rust detects when a thread panics while holding a mutex, preventing silent data corruption. When a panic occurs during a critical section, the mutex is marked poisoned, causing subsequent lock attempts to fail. This mechanism is crucial because panics can leave shared data in inconsistent states. The author argues against proposals to remove poisoning by default, advocating instead for making lock() automatically panic on poison while maintaining safety. The piece explores how unexpected cancellations—both from panics and async future cancellations—can violate mutex invariants, and why detection through poisoning is more important than recovery.  
22  
1
11. 11  
[](https://daily.dev/posts/please-just-fucking-try-htmx-ncu8zbk1v "Please Just Fucking Try HTMX")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 38w  
Please Just Fucking Try HTMX  
HTMX offers a middle ground between raw HTML limitations and JavaScript framework complexity. By adding HTML attributes that trigger server requests and swap in HTML responses, you can build interactive web apps without bundlers, state management, or massive dependencies. A case study shows a company reduced their codebase by 67% and improved performance by switching from React to HTMX. The approach works best for typical CRUD apps, dashboards, and forms—not highly interactive applications like Google Docs. The core idea: let the server return HTML fragments and use hypermedia architecture as originally intended.  
21  
3
12. 12  
[](https://daily.dev/posts/ty-ydfunckai "ty")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 40w  
ty  
ty is a new Python type checker written in Rust that emphasizes speed. It can be run via uvx or installed directly, and checks Python files in a project directory for type errors. The tool automatically discovers virtual environments and installed packages, with configuration options available through CLI commands. An online playground is available for quick testing.  
19  
1
13. 13  
[](https://daily.dev/posts/garbage-collection-in-rust-got-a-little-better-zximifcs8 "Garbage collection in Rust got a little better")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 36w  
Garbage collection in Rust got a little better  
The dumpster garbage collection library for Rust has been updated with significant improvements after two years. Key enhancements include making the Trace trait dyn-compatible to support trait objects inside Gc pointers, enabling dynamic dispatch while maintaining compile-time performance guarantees. A new\_cyclic function simplifies creating self-referential garbage-collected structures by using a dead Gc sentinel approach that gets rehydrated after construction. These changes make dumpster more flexible and ergonomic for handling cyclic data structures and graph algorithms in Rust.  
16  
3
14. 14  
[](https://daily.dev/posts/package-managers-keep-using-git-as-a-database-it-never-works-out-aolr660qk "Package managers keep using git as a database, it never works out")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 37w  
Package managers keep using git as a database, it never works out  
Git repositories initially seem ideal for package registries with built-in version control and distributed architecture, but major package managers like Cargo, Homebrew, CocoaPods, and Go modules all eventually abandoned git-based indexes due to performance problems. As registries grow, git's filesystem limitations cause slow clones, expensive delta resolution, and CI bottlenecks. The pattern is consistent: start with git, hit scaling issues around directory limits and cross-platform compatibility, implement workarounds like sharding, then migrate to HTTP-based protocols or CDNs. Git lacks database features like constraints, indexes, and efficient point queries that package registries actually need.  
14  
1
15. 15  
[](https://daily.dev/posts/pre-commit-hooks-are-fundamentally-broken-0qjwlwweb "pre-commit hooks are fundamentally broken")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 37w  
pre-commit hooks are fundamentally broken  
Pre-commit hooks are fundamentally flawed because they run on the working tree instead of the index, fail during rebases and interactive operations, and break workflows where commits are used for local state management. They can't handle commits without relevant files, run on branches being rebased, and create friction when dealing with code that predates the hook. Pre-push hooks are a better alternative as they avoid these issues while still providing automated checks before code is shared.  
12  
1
16. 16  
[](https://daily.dev/posts/text-editors-should-be-worse-f4uolgi8v "Text Editors Should Be Worse")  
Article  
![Avatar of lobsters](https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg)Lobsters · 38w  
Text Editors Should Be Worse  
Auto-completion features in text editors create frustrating inconsistencies across different tools. The author argues for simpler default behavior that matches basic text inputs like HTML textareas, particularly criticizing automatic quote pairing and cursor movement. They propose a NO\_AUTOINPUT environment variable to disable these "smart" features by default, allowing developers to maintain consistent muscle memory across all text input contexts.  
11  
4

[See all Lobsters archives](/sources/lobsters/best-of)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@graph":[{"@type":"CollectionPage","@id":"https://daily.dev/sources/lobsters/best-of/2025/12#page","url":"https://daily.dev/sources/lobsters/best-of/2025/12","name":"Best Lobsters Posts — December 2025","description":"The most upvoted Lobsters posts from December 2025, curated by the daily.dev community.","isPartOf":{"@type":"WebSite","url":"https://daily.dev"}},{"@type":"ItemList","@id":"https://daily.dev/sources/lobsters/best-of/2025/12#items","numberOfItems":16,"itemListElement":[{"@type":"ListItem","position":1,"url":"https://daily.dev/posts/i-m-a-former-cto-here-is-the-15-sec-coding-test-i-used-to-instantly-filter-out-50-of-unqualified-a-gyi9vs462","name":"I’m a former CTO. Here is the 15 sec coding test I used to instantly filter out 50% of unqualified applicants. – Jose Zarazua"},{"@type":"ListItem","position":2,"url":"https://daily.dev/posts/vanilla-css-is-all-you-need-yaq77f62e","name":"Vanilla CSS is all you need"},{"@type":"ListItem","position":3,"url":"https://daily.dev/posts/use-python-for-scripting--2rd0sg3m6","name":"Use Python for Scripting!"},{"@type":"ListItem","position":4,"url":"https://daily.dev/posts/go-ahead-self-host-postgres-9xxotfi6r","name":"Go ahead, self-host Postgres"},{"@type":"ListItem","position":5,"url":"https://daily.dev/posts/gin-is-a-very-bad-software-library-8mxglpldh","name":"Gin is a very bad software library"},{"@type":"ListItem","position":6,"url":"https://daily.dev/posts/goodbye-sass-lf9vddw6q","name":"Goodbye SASS"},{"@type":"ListItem","position":7,"url":"https://daily.dev/posts/you-can-t-opt-out-of-accessibility-qatebjjev","name":"You Can't Opt-Out of Accessibility"},{"@type":"ListItem","position":8,"url":"https://daily.dev/posts/a-solid-load-of-bull-hw6sdv1co","name":"A SOLID Load of Bull"},{"@type":"ListItem","position":9,"url":"https://daily.dev/posts/the-html-elements-time-forgot-8irc0ubvy","name":"The HTML Elements Time Forgot"},{"@type":"ListItem","position":10,"url":"https://daily.dev/posts/in-defense-of-lock-poisoning-in-rust-sunshowers-gbd3raimp","name":"In defense of lock poisoning in Rust · sunshowers"},{"@type":"ListItem","position":11,"url":"https://daily.dev/posts/please-just-fucking-try-htmx-ncu8zbk1v","name":"Please Just Fucking Try HTMX"},{"@type":"ListItem","position":12,"url":"https://daily.dev/posts/ty-ydfunckai","name":"ty"},{"@type":"ListItem","position":13,"url":"https://daily.dev/posts/garbage-collection-in-rust-got-a-little-better-zximifcs8","name":"Garbage collection in Rust got a little better"},{"@type":"ListItem","position":14,"url":"https://daily.dev/posts/package-managers-keep-using-git-as-a-database-it-never-works-out-aolr660qk","name":"Package managers keep using git as a database, it never works out"},{"@type":"ListItem","position":15,"url":"https://daily.dev/posts/pre-commit-hooks-are-fundamentally-broken-0qjwlwweb","name":"pre-commit hooks are fundamentally broken"},{"@type":"ListItem","position":16,"url":"https://daily.dev/posts/text-editors-should-be-worse-f4uolgi8v","name":"Text Editors Should Be Worse"}]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Sources","item":"https://daily.dev/sources"},{"@type":"ListItem","position":3,"name":"Lobsters","item":"https://daily.dev/sources/lobsters"},{"@type":"ListItem","position":4,"name":"Best of","item":"https://daily.dev/sources/lobsters/best-of"},{"@type":"ListItem","position":5,"name":"December 2025"}]}]}
```

