[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-golangci-lint-faq-ci-policy-en":3,"article-related-golangci-lint-faq-ci-policy-en":30,"series-tools-76829ec6-953d-4ae8-8cbd-7d4ebf92ed5f":75},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":29},"76829ec6-953d-4ae8-8cbd-7d4ebf92ed5f","golangci-lint-faq-ci-policy-en","Golangci-lint’s FAQ turns CI noise into a policy","\u003Cp data-speakable=\"summary\">This turns golangci-lint’s FAQ into a copy-ready CI policy.\u003C\u002Fp>\u003Cp>I’ve been using \u003Ca href=\"https:\u002F\u002Fgolangci-lint.run\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">golangci-lint\u003C\u002Fa> for a while, and honestly, the tool itself was never the annoying part. The annoying part was the mismatch between what I wanted it to do and what it can actually do. I’d wire it into CI, get a wall of output, and then spend half an hour asking the same stupid question: “Is this a linter problem, a compiler problem, or did I just point it at code that can’t even build?” That’s the kind of friction that makes teams quietly stop trusting the gate.\u003C\u002Fp>\u003Cp>Then I read the FAQ page instead of treating it like filler. That’s where the useful stuff lives. Not marketing. Not feature fluff. Just the rules of the road: what Go versions are supported, why typecheck errors are not optional, why first runs can feel slow, and how to stop drowning a large repo in old issues. The more I used it, the more I realized the FAQ is basically a policy document in disguise.\u003C\u002Fp>\u003Cp>And that’s the part I wish I’d had earlier. If you treat golangci-lint like “run tool, get lint,” you’ll keep fighting it. If you treat it like “compile first, lint only what changed, and don’t lie to yourself about broken code,” it becomes boring in the best way. That’s what I’m breaking down here.\u003C\u002Fp>\u003Cp>I’m using the official FAQ at \u003Ca href=\"https:\u002F\u002Fgolangci-lint.run\u002Fdocs\u002Fwelcome\u002Ffaq\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">golangci-lint.run\u002Fdocs\u002Fwelcome\u002Ffaq\u003C\u002Fa> as the source. The page doesn’t give you a neat playbook, but it does give you the constraints that matter. I’m turning those constraints into something you can actually copy into a team workflow.\u003C\u002Fp>\u003Ch2>Stop asking golangci-lint to support every Go release on day one\u003C\u002Fh2>\u003Cblockquote>\u003Cp>“Golangci-lint supports Go versions lower or equal to the Go version used to compile it.”\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782607698288-yn0f.png\" alt=\"Golangci-lint’s FAQ turns CI noise into a policy\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003C\u002Fblockquote>\u003Cp>What this actually means is simple: your linter binary is not magic. It’s built with a specific Go toolchain, and it can only safely support Go versions up to that point. The FAQ also says support tracks the Go team’s policy, which is the two latest minor versions. So if your repo jumps to a brand-new Go release before golangci-lint has caught up, you don’t get to act surprised when things break or behave weirdly.\u003C\u002Fp>\u003Cp>I’ve run into this in teams that upgrade Go aggressively but leave CI pinned to an older golangci-lint binary. Then the first failure gets blamed on “lint being flaky.” It usually isn’t flaky. It’s stale. The tool is telling you the version combo is out of sync, and that’s on us, not on the linter.\u003C\u002Fp>\u003Cp>How to apply it: pin both Go and golangci-lint in CI, and upgrade them together on purpose. Don’t let local developer machines drift far ahead of the build image. If you’re packaging golangci-lint yourself, make the Go version used to compile it part of the release notes. That one detail saves a lot of nonsense later.\u003C\u002Fp>\u003Cul>\u003Cli>Keep CI’s Go version explicit.\u003C\u002Fli>\u003Cli>Keep the golangci-lint binary version explicit.\u003C\u002Fli>\u003Cli>Test the pair after every Go upgrade.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>If you want a second opinion from the source docs, the FAQ also points to install guidance in the CI section of the site. I’d start there instead of improvising a homegrown “latest everywhere” policy and hoping for the best.\u003C\u002Fp>\u003Ch2>Typecheck is not a linter, and pretending otherwise wastes time\u003C\u002Fh2>\u003Cblockquote>\u003Cp>“typecheck is not a linter, it doesn’t perform any analysis, it’s just a way to identify, parse, and display compiling errors.”\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>This is the most important bit in the whole FAQ, and it’s the one people keep misunderstanding. When golangci-lint reports typecheck errors, it’s not saying “one of your linters found a style issue.” It’s saying your code doesn’t compile cleanly enough for the analyzers to even do their job. That’s a different class of failure.\u003C\u002Fp>\u003Cp>The FAQ is blunt about the consequence: if there are typecheck errors, golangci-lint will not be able to produce other reports. That’s why people see one failure and then wonder why the rest of the linters “didn’t run.” They did not get a valid program to analyze. End of story.\u003C\u002Fp>\u003Cp>I’ve seen this happen in partial-package checks all the time. Someone points golangci-lint at a single file, or a subset of packages, and the analysis fails because dependencies live outside the scope of the command. From the tool’s point of view, that’s not a lint problem. That’s an incomplete program.\u003C\u002Fp>\u003Cp>How to apply it: make compilation a first-class precondition. Run \u003Ccode>go build .\u002F...\u003C\u002Fcode> or \u003Ccode>go run .\u002F...\u003C\u002Fcode> before you expect lint output to mean anything. If you use CGO, install the system libraries first. If you pull private dependencies, get \u003Ccode>GOPROXY\u003C\u002Fcode> and \u003Ccode>GOSUMDB\u003C\u002Fcode> right before blaming the analyzer. And if you’re checking only part of a repo, be honest about whether that subset can compile on its own.\u003C\u002Fp>\u003Cul>\u003Cli>Fix build errors before lint errors.\u003C\u002Fli>\u003Cli>Use whole-package or whole-module checks when possible.\u003C\u002Fli>\u003Cli>Stop treating typecheck output like a suppressible warning.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>The FAQ’s troubleshooting list is basically a short checklist for adulting your pipeline. I’m not being cute there. It’s the difference between “lint is broken” and “our code path is incomplete.”\u003C\u002Fp>\u003Ch2>Don’t ignore typecheck because the tool can’t safely pretend it’s fine\u003C\u002Fh2>\u003Cp>The FAQ repeats this point for a reason: “Why is it not possible to skip\u002Fignore typecheck errors?” Because typecheck errors block analysis. That’s the whole answer. If the program can’t be type-checked, most linters have nothing real to work with, so there’s nothing meaningful to suppress.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782607695426-ji5z.png\" alt=\"Golangci-lint’s FAQ turns CI noise into a policy\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>What this actually means is that ignore rules are the wrong mental model here. Ignore rules work when you have a valid finding and you want to exempt a known case. Typecheck failures are upstream of that. You’re not exempting a result; you’re trying to skip the compiler’s front door and still expect the rest of the house to be usable.\u003C\u002Fp>\u003Cp>I’ve had arguments with teams that wanted a “just ignore the broken package for now” switch. I get the impulse. But once you allow that, you’re training CI to lie. It starts reporting “clean” on code that wasn’t even analyzable. That’s worse than noisy output.\u003C\u002Fp>\u003Cp>How to apply it: split the pipeline into two stages if you need breathing room. Stage one proves the code compiles. Stage two runs golangci-lint on compilable code. If you absolutely need to work around a broken area, isolate it with an explicit exclusion at the package or path level, and document why. Don’t pretend typecheck is a normal lint finding.\u003C\u002Fp>\u003Cp>That distinction matters more as repos grow. The bigger the codebase, the more tempting it is to let one broken corner poison everything. The FAQ is telling you not to do that, and I agree with it.\u003C\u002Fp>\u003Ch2>Use new-code-only linting or you’ll drown in old debt\u003C\u002Fh2>\u003Cblockquote>\u003Cp>“The idea is to not fix all existing issues. Fix only newly added issue: issues in new code.”\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>This is the practical heart of the FAQ. It’s also the part most teams need to hear twice. If your repository already has thousands of findings, the answer is not “pause product work and fix the universe.” The answer is “stop creating new debt.”\u003C\u002Fp>\u003Cp>The FAQ suggests running with \u003Ccode>--new-from-merge-base=main\u003C\u002Fcode> or \u003Ccode>--new-from-rev=HEAD~1\u003C\u002Fcode>. That’s the right instinct. It changes lint from a giant cleanup project into a guardrail for new changes. I’ve used this pattern in codebases that were way too large to clean in one pass, and it’s the only version of lint adoption that didn’t trigger a revolt.\u003C\u002Fp>\u003Cp>What this actually means is that you can ship while paying down debt slowly. You don’t need a heroic cleanup sprint. You need a policy: new code must not make the situation worse. That’s a much saner contract with the team.\u003C\u002Fp>\u003Cp>How to apply it: wire your CI to compare against merge base on the target branch, not just the last commit. The FAQ warns that \u003Ccode>--new\u003C\u002Fcode> can be misleading when CI generates unstaged files, because it may only point at those files instead of the real change set. I’d take that warning seriously. Use the merge-base or revision-based options unless you know exactly what your pipeline is doing.\u003C\u002Fp>\u003Cul>\u003Cli>Use \u003Ccode>--new-from-merge-base=main\u003C\u002Fcode> for branch-based CI.\u003C\u002Fli>\u003Cli>Use \u003Ccode>--new-from-rev=HEAD~1\u003C\u002Fcode> for simple commit-based checks.\u003C\u002Fli>\u003Cli>Keep the “old issues” backlog separate from the gate.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>This is one of those places where the FAQ is more useful than a blog post or a README. It admits reality: big repos exist, old issues exist, and pretending otherwise just blocks adoption.\u003C\u002Fp>\u003Ch2>Know when diff-based filtering misses the real problem\u003C\u002Fh2>\u003Cblockquote>\u003Cp>“If an issue is not reported as the same line as the changes then the issue will be skipped.”\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>This is the gotcha that bites people after they’ve already done the “right” thing with new-code-only linting. The FAQ says the \u003Ccode>--new-from-*\u003C\u002Fcode> options work by comparing git diff output and issues. That means the issue has to line up with the changed lines. If it doesn’t, the issue can get skipped even though the file is clearly involved.\u003C\u002Fp>\u003Cp>What this actually means is that line-based filtering is not a full semantic understanding of your change. It’s a pragmatic shortcut. Useful, yes. Perfect, no. If you move code around, reformat a file, or trigger an issue in a nearby line that isn’t part of the diff, the filter may miss it.\u003C\u002Fp>\u003Cp>I ran into this when a refactor touched a file but the warning appeared in a spot outside the exact diff hunk. The pipeline said nothing. The code was still wrong. That’s the kind of false comfort that makes teams trust automation a little too much.\u003C\u002Fp>\u003Cp>How to apply it: know when to turn on \u003Ccode>--whole-files\u003C\u002Fcode>. The FAQ says that option reports issues inside the file that contains changes, not only inside the changed lines. That’s broader, and yes, it can surface extra noise. But if your diff-based filter is hiding real problems, broader is better than blind.\u003C\u002Fp>\u003Cp>My rule of thumb: start with diff-based new-code checks, then switch to whole-file mode when a refactor or file-level edit makes the signal too narrow. Use the narrowest filter that still catches the class of mistakes you care about. Anything narrower is just theater.\u003C\u002Fp>\u003Ch2>First runs are slow because the cache is doing real work\u003C\u002Fh2>\u003Cblockquote>\u003Cp>“Because the first run caches type information. All subsequent runs will be faster.”\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>This one is easy to misread as “the tool is slow.” The FAQ is saying something more specific: the first run pays the setup cost. It caches type information, and later runs reuse that work. So if your first local invocation feels heavy, that doesn’t automatically mean the configuration is bad.\u003C\u002Fp>\u003Cp>What this actually means is that golangci-lint is optimized for repeated use, not just a one-off demo. That makes sense in developer workflows where compilation already happened and the cache can do its job. It’s less comforting in a cold CI environment, where every run may start from scratch unless you persist caches.\u003C\u002Fp>\u003Cp>I’ve seen people \u003Ca href=\"\u002Ftag\u002Fbenchmark\">benchmark\u003C\u002Fa> a first run, declare the tool “too slow,” and then disable it before the cache ever had a chance to matter. That’s not a fair test. If you want to judge performance, measure the second and third runs too.\u003C\u002Fp>\u003Cp>How to apply it: warm the cache in local development and preserve it in CI when possible. Don’t use \u003Ccode>--fast-only\u003C\u002Fcode> as a magic speed button and then complain about the first run. The FAQ is explicit that the first run pays for cached type info. That’s normal. Build your pipeline around that reality instead of fighting it.\u003C\u002Fp>\u003Cp>If you’re trying to speed up developer loops, make sure the lint step comes after compilation, not before it. The cache works best when the repo state is stable and the tool doesn’t have to rediscover everything from zero on every invocation.\u003C\u002Fp>\u003Ch2>Custom linters are possible, but don’t make the core tool your integration project\u003C\u002Fh2>\u003Cp>The FAQ says you can integrate a custom linter yourself through the manual, or open a \u003Ca href=\"\u002Ftag\u002Fgithub\">GitHub\u003C\u002Fa> issue and wait for the maintainers when time permits. That’s a polite way of saying the integration path exists, but it’s not always instant and it’s not always worth forking the whole workflow around one special case.\u003C\u002Fp>\u003Cp>What this actually means is that golangci-lint is extensible, but extension has a cost. If your team keeps asking for one-off checks that don’t fit the built-in list, you should decide whether they belong in the linter layer at all. Sometimes they do. Sometimes they’re better as a separate script or a dedicated analyzer.\u003C\u002Fp>\u003Cp>I’ve watched teams turn a lint config into a junk drawer. That’s how you end up with nobody understanding why a build failed. The FAQ nudges you toward restraint, and I think that’s the right instinct.\u003C\u002Fp>\u003Cp>How to apply it: only add a custom linter if it has a clear enforcement story, a stable output format, and a real owner. If it’s experimental or team-specific, keep it outside the main gate until it proves itself. Use the manual first, and only escalate to upstream integration when the use case is broad enough to justify it.\u003C\u002Fp>\u003Cul>\u003Cli>Prefer built-in linters when they cover the rule.\u003C\u002Fli>\u003Cli>Keep custom checks small and well-owned.\u003C\u002Fli>\u003Cli>Don’t let special cases pollute the default CI path.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>The FAQ doesn’t oversell customization, which I appreciate. It treats it like engineering work, not a checkbox.\u003C\u002Fp>\u003Ch2>The template you can copy\u003C\u002Fh2>\u003Cpre>\u003Ccode># golangci-lint policy for Go repos\n# Source ideas from: https:\u002F\u002Fgolangci-lint.run\u002Fdocs\u002Fwelcome\u002Ffaq\u002F\n\n# 1) Version policy\n# - Pin Go and golangci-lint in CI.\n# - Keep golangci-lint at a version built with a Go toolchain that supports your repo's Go version.\n# - Upgrade both together on purpose.\n\n# 2) Build first, lint second\n# - Do not treat typecheck as a normal lint finding.\n# - If the code doesn't compile, fix that first.\n# - Run a build check before linting.\n\n# Example CI steps:\n#   go mod tidy\n#   go build .\u002F...\n#   golangci-lint run .\u002F...\n\n# 3) Large repo policy\n# - Do not fail the build on legacy issues already in main.\n# - Fail only on newly introduced issues.\n# - Use merge-base comparison for branch CI.\n\n# Example commands:\n#   golangci-lint run --new-from-merge-base=main\n#   golangci-lint run --new-from-rev=HEAD~1\n\n# 4) When diff-based filtering misses issues\n# - If a refactor hides issues outside changed lines, widen the scope.\n# - Use whole-file mode when line-based filtering is too narrow.\n\n# Example command:\n#   golangci-lint run --new-from-merge-base=main --whole-files\n\n# 5) First-run performance\n# - Expect the first run to be slower.\n# - Reuse caches locally and in CI when possible.\n# - Judge performance after the cache is warm.\n\n# 6) Custom checks\n# - Add custom linters only when they have a clear owner and stable purpose.\n# - Keep one-off checks out of the main lint gate until they prove useful.\n\n# Suggested CI policy text:\n# \"The build must compile cleanly.\n#  golangci-lint is enforced only on new code.\n#  Legacy issues stay visible but do not block delivery.\n#  Typecheck errors are treated as build failures, not lint warnings.\"\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This is the version I’d actually hand to a team. It’s short enough to adopt, but it encodes the important stuff the FAQ is really saying: version compatibility matters, compile errors block analysis, new-code-only linting is the sane way to roll this out, and diff filters need an escape hatch when they get too clever for their own good.\u003C\u002Fp>\u003Cp>If I were setting this up today, I’d drop that policy into the repo, wire the CI commands exactly once, and stop debating whether lint should be “strict” in the abstract. It should be strict about what changed and honest about what it can’t analyze. That’s the whole deal.\u003C\u002Fp>\u003Cp>One last thing: the source page is the \u003Ca href=\"https:\u002F\u002Fgolangci-lint.run\u002Fdocs\u002Fwelcome\u002Ffaq\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">official golangci-lint FAQ\u003C\u002Fa>. My breakdown is original framing and workflow advice, but the underlying rules and command examples come from that page. If you want the canonical wording, go there first.\u003C\u002Fp>","A practical read of golangci-lint’s FAQ, plus a copy-ready CI policy for Go version drift, typecheck pain, and new-code-only linting.","golangci-lint.run","https:\u002F\u002Fgolangci-lint.run\u002Fdocs\u002Fwelcome\u002Ffaq\u002F",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782607698288-yn0f.png","tools","en","04a7998f-745f-4a4d-851b-d5888aac1000",[17,18,19,20,21],"golangci-lint","go","ci","typecheck","lint policy",[23,24,25],"Pin Go and golangci-lint together; version drift causes bogus failure modes.","Treat typecheck as a build blocker, not a lint warning you can ignore.","For large repos, gate only new issues and widen scope when diff filtering misses real problems.",0,"2026-06-28T00:47:54.495313+00:00","2026-06-28T00:47:54.487+00:00","a7343b93-37cc-4634-a2bc-707f6275bdb6",{"tags":31,"relatedLang":34,"relatedPosts":38},[32],{"name":33,"slug":18},"Go",{"id":15,"slug":35,"title":36,"language":37},"golangci-lint-faq-ci-policy-zh","FAQ 把 golangci-lint 變 CI 政策","zh",[39,45,51,57,63,69],{"id":40,"slug":41,"title":42,"cover_image":43,"image_url":43,"created_at":44,"category":13},"a8344911-b020-4892-ba6c-621df2dc11f8","gorm-advanced-query-helpers-guardrails-en","GORM query helpers turn SQL into guardrails","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782606800691-nx1d.png","2026-06-28T00:32:59.159701+00:00",{"id":46,"slug":47,"title":48,"cover_image":49,"image_url":49,"created_at":50,"category":13},"af69202e-8810-49fc-ba85-dfd18ae1217e","golangci-lint-v2-5-0-revive-checks-en","Golangci-lint v2.5.0 adds 8 revive checks","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782605879327-gt0d.png","2026-06-28T00:17:31.879198+00:00",{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":13},"5521addb-874b-44fe-a38d-32f4299010d2","open-source-ai-projects-developers-2026-en","7 open-source AI projects developers need in 2026","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782593283378-u4f3.png","2026-06-27T20:47:36.97629+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":13},"0a5f2eb9-7c4b-4382-b0e0-501f1bc3e70f","midjourney-review-2026-v8-worth-it-en","Midjourney Review 2026: Is V8 Still Worth It?","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782576174182-vc3v.png","2026-06-27T16:02:30.622473+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":13},"3a9390c3-0160-4d2a-bb42-25f6437aecb4","midjourney-v81-faster-renders-pricing-video-en","Midjourney V8.1 lands with 4-5x faster renders","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782573467328-ybtn.png","2026-06-27T15:17:23.634784+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":13},"9e1a94d8-5e53-4bca-b32d-83c73cef1639","mlops-roadmap-2026-turns-learning-into-delivery-en","MLOps Roadmap 2026 Turns Learning Into Delivery","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782567216077-5x25.png","2026-06-27T13:33:07.454419+00:00",[76,81,86,91,96,101,106,111,116,121],{"id":77,"slug":78,"title":79,"created_at":80},"8008f1a9-7a00-4bad-88c9-3eedc9c6b4b1","surepath-ai-mcp-policy-controls-en","SurePath AI's New MCP Policy Controls Enhance AI Security","2026-03-26T01:26:52.222015+00:00",{"id":82,"slug":83,"title":84,"created_at":85},"27e39a8f-b65d-4f7b-a875-859e2b210156","mcp-standard-ai-tools-2026-en","MCP Standard in 2026: Integrating AI Tools","2026-03-26T01:27:43.127519+00:00",{"id":87,"slug":88,"title":89,"created_at":90},"165f9a19-c92d-46ba-b3f0-7125f662921d","rag-2026-transforming-enterprise-ai-en","How RAG in 2026 is Transforming Enterprise AI","2026-03-26T01:28:11.485236+00:00",{"id":92,"slug":93,"title":94,"created_at":95},"6a2a8e6e-b956-49d8-be12-cc47bdc132b2","mastering-ai-prompts-2026-guide-en","Mastering AI Prompts: A 2026 Guide for Developers","2026-03-26T01:29:07.835148+00:00",{"id":97,"slug":98,"title":99,"created_at":100},"3ab2c67e-4664-4c67-a013-687a2f605814","garry-tan-open-sources-claude-code-toolkit-en","Garry Tan Open-Sources a Claude Code Toolkit","2026-03-26T08:26:20.245934+00:00",{"id":102,"slug":103,"title":104,"created_at":105},"66a7cbf8-7e76-41d4-9bbf-eaca9761bf69","github-ai-projects-to-watch-in-2026-en","20 GitHub AI Projects to Watch in 2026","2026-03-26T08:28:09.752027+00:00",{"id":107,"slug":108,"title":109,"created_at":110},"9f332fda-eace-448a-a292-2283951eee71","practical-github-guide-learning-ml-2026-en","A Practical GitHub Guide to Learning ML in 2026","2026-03-27T01:16:50.125678+00:00",{"id":112,"slug":113,"title":114,"created_at":115},"1b1f637d-0f4d-42bd-974b-07b53829144d","aiml-2026-student-ai-ml-lab-repo-review-en","AIML-2026 Is a Bare-Bones Student Lab Repo","2026-03-27T01:21:51.661231+00:00",{"id":117,"slug":118,"title":119,"created_at":120},"6d1bf3f6-e191-4d30-b55b-8a0722fa6afe","ai-trending-github-repos-and-research-feeds-en","AI Trending Tracks Repos and Research Feeds","2026-03-27T01:31:35.709532+00:00",{"id":122,"slug":123,"title":124,"created_at":125},"010539a1-4c3a-4bd3-937a-26616422ee0d","awesome-ai-for-science-research-tools-map-en","Awesome AI for Science Is Becoming a Real Research Map","2026-03-27T01:46:50.89513+00:00"]