RepoPilot

kilimchoi/engineering-blogs

A curated list of engineering blogs

Concerns

Stale and unlicensed — last commit 2y ago

ConcernsDependency

no license — legally unclear; last commit was 2y ago…

ConcernsFork & modify

no license — can't legally use code; no tests detected

HealthyLearn from

Documented and popular — useful reference codebase to read through.

ConcernsDeploy as-is

no license — can't legally use code; last commit was 2y ago

  • Stale — last commit 2y ago
  • No license — legally unclear to depend on
  • No test directory detected
  • 36+ active contributors
  • Distributed ownership (top contributor 29% of recent commits)
  • CI configured

What would improve this?

  • Use as dependency ConcernsMixed if: publish a permissive license (MIT, Apache-2.0, etc.)
  • Fork & modify ConcernsMixed if: add a LICENSE file
  • Deploy as-is ConcernsMixed if: add a LICENSE file

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Great to learn from" badge

Paste into your README — live-updates from the latest cached analysis.

RepoPilot: Great to learn from
[![RepoPilot: Great to learn from](https://repopilot.app/api/badge/kilimchoi/engineering-blogs?axis=learn)](https://repopilot.app/r/kilimchoi/engineering-blogs)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card

This card auto-renders when someone shares https://repopilot.app/r/kilimchoi/engineering-blogs on X, Slack, or LinkedIn.

Ask AI about kilimchoi/engineering-blogs

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question →

Onboarding doc

Onboarding: kilimchoi/engineering-blogs

Generated by RepoPilot · 2026-06-19 · Source

🎯Verdict

AVOID — Stale and unlicensed — last commit 2y ago

  • 36+ active contributors
  • Distributed ownership (top contributor 29% of recent commits)
  • CI configured
  • ⚠ Stale — last commit 2y ago
  • ⚠ No license — legally unclear to depend on
  • ⚠ No test directory detected

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

TL;DR

A curated, community-maintained list of engineering blogs from companies, individuals, and technology products, organized alphabetically and published as both a readable README.md and an OPML feed (engineering_blogs.opml) for podcast/RSS readers. The Ruby-based tooling (generate_opml.rb) automates OPML generation from the markdown source to keep feeds in sync. Single-file data architecture: README.md is the authoritative source (3 main sections: Companies, Individuals/Group Contributors, Products/Technologies, each indexed by letter). generate_opml.rb is a standalone script that parses this markdown and outputs engineering_blogs.opml for feed readers. No backend, database, or complex build pipeline—purely static content + light Ruby tooling.

👥Who it's for

Software engineers, engineering managers, and tech enthusiasts who want a centralized source to discover high-quality technical blogs from industry leaders (Airbnb, Netflix, Stripe, etc.) and individual contributors. Contributors are community members who submit and curate blog links.

🌱Maturity & risk

Actively maintained but lightweight. The repo shows ~3.5KB of Ruby code (just the OPML generator), uses GitHub Actions for CI (engineering_blogs.yml workflow), and is organized with clear contribution guidelines (contributing.md). No test suite visible, but the simplicity and curated nature (pull-request driven) mitigate risk. Clear production-ready status as a curated index with automation support.

Minimal risk: this is a data curation project with no runtime dependencies beyond Ruby's standard library. Main concern is maintenance burden of keeping 100+ blog links alive and current, which depends on community PRs. Single maintainer (kilimchoi) visibility in repo name suggests potential bottleneck for approvals, but the GitHub Actions setup suggests some automation exists.

Active areas of work

Ongoing community curation: the repo accepts Pull Requests to add/update blog links organized alphabetically within the three categories. The GitHub Actions workflow (engineering_blogs.yml) likely validates or regenerates OPML on updates. No visible active development branch changes—this is steady-state maintenance.

🚀Get running

git clone https://github.com/kilimchoi/engineering-blogs.git
cd engineering-blogs
ruby generate_opml.rb

No bundle install needed (generate_opml.rb uses only Ruby stdlib). The output engineering_blogs.opml is ready to import into any OPML-compatible feed reader.

Daily commands: Not a runnable application. To regenerate the OPML feed from README.md changes:

ruby generate_opml.rb

To view/edit the main curated list: open README.md in any text editor or GitHub web UI.

🗺️Map of the codebase

  • README.md — Primary entry point and documentation defining the curated list structure, contribution guidelines, and complete catalog of engineering blogs organized by company and individual contributors.
  • contributing.md — Essential reference for all contributors outlining submission standards, formatting requirements, and the curation process for adding new blogs to the list.
  • generate_opml.rb — Core automation script that programmatically generates the OPML feed file from the README, serving as the build pipeline for the curated list.
  • engineering_blogs.opml — Machine-readable OPML export of all engineering blogs enabling RSS feed reader integration and automated consumption of the curated list.
  • .github/workflows/engineering_blogs.yml — CI/CD automation that validates the list, regenerates OPML on changes, and ensures consistent formatting across all contributions.
  • Gemfile — Ruby dependency manifest declaring all required libraries for running the OPML generation script and supporting development tasks.

🧩Components & responsibilities

  • README.md (Markdown, GitHub rendering) — Primary content store maintaining the curated list of engineering blogs indexed by company and contributor, serving as single source of truth
    • Failure mode: Corruption or loss of blog entries; malformed markdown breaks OPML generation
  • generate_opml.rb (Ruby, markdown parsing, XML generation) — Extracts blog entries from README.md structure and generates valid OPML XML for RSS reader compatibility
    • Failure mode: Parser logic breaks with README structure changes; produces invalid OPML preventing feed subscription
  • engineering_blogs.opml (OPML/XML format, RSS feeds) — Machine-readable export enabling RSS reader integration and automated feed aggregation of curated blogs
    • Failure mode: Malformed XML breaks RSS reader parsing; stale file if generation script fails to run
  • GitHub Actions Workflow (GitHub Actions, shell scripts, Ruby) — Automates validation of markdown formatting, executes OPML generation, and enforces contribution standards on pull requests
    • Failure mode: Workflow disabled or quota exceeded prevents CI validation; broken workflow logic allows malformed contributions

🔀Data flow

  • ContributorREADME.md — Manual additions/edits of new engineering blog entries in alphabetically sorted markdown lists
  • README.mdgenerate_opml.rb — Script parses markdown sections and extracts blog metadata (name, URL, description)
  • generate_opml.rbengineering_blogs.opml — Transforms parsed blog entries into OPML XML structure with RSS feed URLs
  • engineering_blogs.opmlRSS Readers — End users subscribe to OPML file in RSS aggregators to receive blog feed updates
  • GitHub Actions WorkflowREADME.md & engineering_blogs.opml — CI/CD validates changes and regenerates OPML on every PR merge to master branch

🛠️How to make changes

Add a new company engineering blog

  1. Identify the alphabetical section in README.md where the company belongs (e.g., A) (README.md)
  2. Insert a new entry with company name, blog URL, and description in markdown list format following existing style conventions (README.md)
  3. Run generate_opml.rb locally to regenerate the OPML file and verify the entry is included (generate_opml.rb)
  4. Commit changes to README.md (OPML auto-regenerates via CI/CD on merge) (.github/workflows/engineering_blogs.yml)

Add a new individual/group contributor blog

  1. Locate the Individuals/Group Contributors section in README.md and find the alphabetical subsection (README.md)
  2. Add new entry with contributor name, blog URL, and description in consistent markdown format (README.md)
  3. Verify formatting matches existing entries and run generate_opml.rb to ensure OPML regeneration works (generate_opml.rb)
  4. Submit pull request; CI workflow validates structure and auto-updates OPML before merge (.github/workflows/engineering_blogs.yml)

Update or maintain the OPML export

  1. Review generate_opml.rb to understand current parsing logic for README.md structure (generate_opml.rb)
  2. Modify parsing rules if README.md format changes or OPML structure needs improvement (generate_opml.rb)
  3. Test locally and commit changes; CI workflow re-generates and validates OPML output (.github/workflows/engineering_blogs.yml)

🔧Why these technologies

  • Markdown (README.md) — Human-readable format for manual curation, version control friendly, and renders directly on GitHub for discoverability
  • OPML (XML-based feed format) — Standard syndication format enabling RSS reader integration and automated feed subscription without custom tooling
  • Ruby + Gemfile — Lightweight scripting language ideal for parsing markdown and generating XML; minimal runtime overhead for simple list transformation
  • GitHub Actions CI/CD — Native GitHub integration for automated validation, OPML regeneration, and enforcement of contribution standards on every PR

⚖️Trade-offs already made

  • Store source data in Markdown README instead of dedicated database

    • Why: Reduces infrastructure complexity and allows contributors to edit directly in version control without database access
    • Consequence: Manual parsing required to generate machine-readable formats; scaling to thousands of entries could impact parsing performance
  • Auto-generate OPML from README via script rather than hand-maintaining both

    • Why: Single source of truth prevents drift and ensures consistency between human-readable and machine-readable formats
    • Consequence: Requires discipline to run generation on all README changes; CI automation mitigates but adds workflow step
  • Use GitHub workflow actions for validation and OPML regeneration

    • Why: No external services or infrastructure needed; automation runs on every PR for immediate feedback
    • Consequence: Limited to GitHub's platform; contributor experience tied to GitHub's uptime and workflow quota limits

🚫Non-goals (don't propose these)

  • Does not implement authentication or access control—all contributions public and community-driven
  • Does not provide real-time blog feed aggregation—OPML is a static export requiring external RSS readers
  • Does not rank or recommend blogs—purely a curated list without algorithmic personalization
  • Does not host blog content—only links to external engineering blogs
  • Does not provide full-text search—relies on GitHub README rendering and external search engines

⚠️Anti-patterns to avoid

  • Manual OPML maintenance risk (High)README.md + engineering_blogs.opml (if both edited): If contributors manually edit both README and OPML independently, they can diverge causing inconsistent feed data; mitigation is auto-generation via Ruby script
  • Parsing fragility (Medium)generate_opml.rb: Ruby markdown parser may break if README.md structure changes (e.g., header levels, list indentation); no validation of expected format before parsing
  • No schema validation on README entries (Medium)README.md: Contributor guidelines enforce format but no linting prevents missing URLs, typos, or malformed links before merge

🔥Performance hotspots

  • generate_opml.rb (I/O & Processing) — Sequential parsing of entire README.md file; no caching or incremental updates if only one entry changes

🪤Traps & gotchas

No hidden traps; this is a straightforward curation project. Minimal gotchas: (1) OPML generation assumes a specific README.md structure—reformatting sections will break generate_opml.rb; (2) No version pinning in Gemfile (.ruby-version exists, check it before running Ruby scripts); (3) Blog links are not validated for liveness, so dead links can accumulate unless community catches them in reviews.

🏗️Architecture

💡Concepts to learn

  • sindresorhus/awesome — Parent inspiration: the Awesome project is the canonical curated-list format on GitHub; this repo follows the same alphabetical-organization, community-driven model
  • HugoGiraudel/awesome-accessibility — Similar curated list in Awesome format (engineering blogs by accessibility focus); demonstrates variant curation approaches
  • neutralino/awesome-opml — Complements this repo by maintaining a list of high-quality OPML feeds; users of engineering-blogs.opml would find this relevant
  • getify/You-Dont-Know-JS — Predecessor/inspiration: large community-maintained educational resource with similar GitHub-native workflow and markdown-as-content
  • github/gitignore — Sibling Awesome-style community curation project; demonstrates scaling patterns for high-volume pull request review and maintenance

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add automated validation workflow for engineering_blogs.opml feed validity

The repo has a generate_opml.rb script and engineering_blogs.opml file, but no CI check to validate OPML XML structure or detect broken feed URLs. This prevents malformed entries from being merged. A GitHub Actions workflow would catch issues like invalid XML, duplicate entries, or dead links before they're committed.

  • [ ] Create .github/workflows/validate-opml.yml to run on PR for changes to engineering_blogs.opml
  • [ ] Add Ruby script (e.g., scripts/validate_opml.rb) that parses the OPML file and validates XML structure using Nokogiri
  • [ ] Add basic feed URL validation (HTTP HEAD requests to check for 404s or timeouts)
  • [ ] Update README.md's Contributing section to document this validation step for contributors

Enhance generate_opml.rb with duplicate detection and validation

The generate_opml.rb script exists but lacks safeguards. Contributors could accidentally add duplicate blog entries, duplicate URLs, or malformed data. Adding validation logic to this script prevents low-quality contributions and reduces maintainer review burden.

  • [ ] Add duplicate checking logic to generate_opml.rb (by URL and blog title) that warns or errors on duplicates
  • [ ] Add URL format validation (must be valid HTTP/HTTPS URLs with no trailing whitespace)
  • [ ] Add required field validation (each entry must have title, URL, and category)
  • [ ] Update contributing.md to explain how to run generate_opml.rb locally before submitting PRs

Create CONTRIBUTING.md guidance with data entry template and validation checklist

contributing.md exists but likely lacks a structured template for new blog submissions. New contributors don't know the exact format required (JSON? YAML? Plain text?), leading to rejected PRs. A template and checklist would reduce back-and-forth and clarify the data source format.

  • [ ] Document the source data format/file where blogs are stored (e.g., if README.md is parsed, or if there's a structured data file)
  • [ ] Add a 'New Blog Submission' template showing exact format: company name, URL, category, any RSS feed URL
  • [ ] Include a pre-submission checklist: 'Run generate_opml.rb locally', 'Verify no duplicates exist', 'Check URL is reachable', 'Blog is active (not archived)'
  • [ ] Link to the validation script created in PR #1 so contributors know how to test before submitting

🌿Good first issues

  • Add a dead-link checker script: write a Ruby script to periodically verify all URLs in README.md return 200 OK and report 404s; useful for maintenance.
  • Enhance generate_opml.rb with category metadata: parse section headers (Companies/Individuals/Technologies) and add OPML category tags so feed readers can filter by type.
  • Create a blog submission template in contributing.md: add a pull request template with fields (Blog Name, URL, Category, Description) to standardize contributions and reduce back-and-forth.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 50eab27 — Update workflow file (kilimchoi)
  • 54a6e7f — remove blogs that are not working (kilimchoi)
  • 924f9f6 — Add "Palantir" Specializes in big data analytics (#1152) (Erfan-ffa)
  • 5373fe3 — Update README.md (kilimchoi)
  • 24b9a03 — Update README.md (kilimchoi)
  • a00fb44 — add godaddy (Kilim Choi)
  • 995dda5 — fix opml generator (Kilim Choi)
  • f7d1f99 — Update Shopify engineering blog links (readme and opml) (#1057) (summersk)
  • cb0ca61 — add back the check for generating opml file (Kilim Choi)
  • 4b7c232 — use feedly api to fetch the url (Kilim Choi)

🔒Security observations

This is a curated list repository with minimal security surface. No critical vulnerabilities were identified from the visible file structure. The project appears to be a documentation/list repository rather than a production application, which reduces inherent risk. Main recommendations: (1) Perform Ruby dependency auditing with 'bundle audit', (2) Review GitHub Actions workflows for security best practices, (3) Maintain .gitignore to prevent accidental credential commits, (4) Keep Ruby version updated. The repository demonstrates good practices with separate contributing guidelines and automated workflows.

  • Low · Missing dependency security information — Gemfile, Gemfile.lock. The Gemfile and Gemfile.lock were not provided in the analysis context, making it impossible to assess Ruby gem dependencies for known vulnerabilities. This repository uses Ruby (indicated by .ruby-version and Gemfile), which requires explicit dependency auditing. Fix: Run 'bundle audit' regularly to check for vulnerable gems. Implement automated dependency scanning in CI/CD pipeline via GitHub Actions or similar tools.
  • Low · Potential CDN-hosted resource — README.md. The README references a CDN-hosted badge from cdn.rawgit.com. While this is for a badge image (low risk), relying on external CDNs introduces a potential supply chain risk if the CDN is compromised. Fix: Consider self-hosting badges or using a more reliable CDN with SRI (Subresource Integrity) validation. Verify the source URL is legitimate and uses HTTPS.
  • Low · Limited visibility into workflow security — .github/workflows/engineering_blogs.yml. The GitHub Actions workflow file (.github/workflows/engineering_blogs.yml) was not provided for analysis. Workflow files can contain secrets exposure risks, insecure commands, or privilege escalation issues. Fix: Review workflow files to ensure: (1) No hardcoded secrets, (2) Proper use of GitHub secrets for sensitive data, (3) Limited permissions (principle of least privilege), (4) No shell injection vulnerabilities in run commands.

LLM-derived; treat as a starting point, not a security audit.

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/kilimchoi/engineering-blogs shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live kilimchoi/engineering-blogs repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/kilimchoi/engineering-blogs.

What it runs against: a local clone of kilimchoi/engineering-blogs — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in kilimchoi/engineering-blogs | Confirms the artifact applies here, not a fork | | 2 | Default branch master exists | Catches branch renames | | 3 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 4 | Last commit ≤ 656 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>kilimchoi/engineering-blogs</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of kilimchoi/engineering-blogs. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/kilimchoi/engineering-blogs.git
#   cd engineering-blogs
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of kilimchoi/engineering-blogs and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "kilimchoi/engineering-blogs(\\.git)?\\b" \\
  && ok "origin remote is kilimchoi/engineering-blogs" \\
  || miss "origin remote is not kilimchoi/engineering-blogs (artifact may be from a fork)"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 4. Critical files exist
test -f "README.md" \\
  && ok "README.md" \\
  || miss "missing critical file: README.md"
test -f "contributing.md" \\
  && ok "contributing.md" \\
  || miss "missing critical file: contributing.md"
test -f "generate_opml.rb" \\
  && ok "generate_opml.rb" \\
  || miss "missing critical file: generate_opml.rb"
test -f "engineering_blogs.opml" \\
  && ok "engineering_blogs.opml" \\
  || miss "missing critical file: engineering_blogs.opml"
test -f ".github/workflows/engineering_blogs.yml" \\
  && ok ".github/workflows/engineering_blogs.yml" \\
  || miss "missing critical file: .github/workflows/engineering_blogs.yml"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 656 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~626d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/kilimchoi/engineering-blogs"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Embed this chat in your README →

Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/kilimchoi/engineering-blogs"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>