[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-build-language-servers-in-go-without-boilerplate-en":3,"tags-build-language-servers-in-go-without-boilerplate-en":30,"related-lang-build-language-servers-in-go-without-boilerplate-en":41,"related-posts-build-language-servers-in-go-without-boilerplate-en":45,"series-tools-4d82e908-1cbb-4b7b-b081-be9074cf846c":82},{"id":4,"title":5,"content":6,"summary":7,"source":8,"source_url":9,"author":10,"image_url":11,"keywords":12,"language":18,"translated_content":10,"views":19,"is_premium":20,"created_at":21,"updated_at":21,"cover_image":11,"published_at":22,"rewrite_status":23,"rewrite_error":10,"rewritten_from_id":24,"slug":25,"category":26,"related_article_id":27,"status":28,"google_indexed_at":29,"x_posted_at":10,"tweet_text":10,"title_rewritten_at":10,"title_original":10,"key_takeaways":10,"topic_cluster_id":10,"embedding":10,"is_canonical_seed":20},"4d82e908-1cbb-4b7b-b081-be9074cf846c","Build language servers in Go without the boilerplate","\u003Cp>A new Go project is trying to make language servers much less painful to build. The pitch is simple: support for the \u003Ca href=\"https:\u002F\u002Fmicrosoft.github.io\u002Flanguage-server-protocol\u002Fspecifications\u002Flsp\u002F3.17\u002Fspecification\u002F\" target=\"_blank\" rel=\"noopener\">Language Server Protocol 3.17\u003C\u002Fa>, automatic handler registration, and a debug server that helps you see messages as they move through the system.\u003C\u002Fp>\u003Cp>That matters because language servers are one of the few ways to write editor features once and ship them to \u003Ca href=\"https:\u002F\u002Fcode.visualstudio.com\u002F\" target=\"_blank\" rel=\"noopener\">Visual Studio Code\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fwww.jetbrains.com\u002F\" target=\"_blank\" rel=\"noopener\">JetBrains IDEs\u003C\u002Fa>, and other editors without rewriting the same logic over and over. In the Hacker News thread, the project’s author said they built it for an infracost LSP, then used it to generate extensions for multiple IDEs.\u003C\u002Fp>\u003Cp>What makes this interesting is the shape of the API, not just the protocol support. The library uses interface-based auto-registration, which means you can define handlers like hover, diagnostics, and completion without a pile of manual wiring. For Go developers who like small abstractions and explicit code paths, that is a pretty appealing trade.\u003C\u002Fp>\u003Ch2>What the Go library actually does\u003C\u002Fh2>\u003Cp>The project, called \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fowenrumney\u002Fglsp\" target=\"_blank\" rel=\"noopener\">glsp\u003C\u002Fa>, is built to help developers create full language servers in Go. On the surface, that sounds niche. In practice, it opens the door to editor integrations for tools that were never meant to become programming languages.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775261571253-4o9s.png\" alt=\"Build language servers in Go without the boilerplate\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>The examples linked in the thread make that clear. The author already published language servers for \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fowenrumney\u002Fmake-ls\" target=\"_blank\" rel=\"noopener\">Makefile\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fowenrumney\u002Fgoreleaser-ls\" target=\"_blank\" rel=\"noopener\">GoReleaser\u003C\u002Fa>, which are exactly the sort of files that developers edit often enough to want better completion, diagnostics, and jump-to-definition support.\u003C\u002Fp>\u003Cp>That practical angle is probably why the post got attention. Language servers are often discussed in abstract terms, but the real value shows up in annoying file types: build scripts, infrastructure configs, and internal YAML formats that are hard to validate by hand.\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fowenrumney\u002Fglsp\" target=\"_blank\" rel=\"noopener\">glsp\u003C\u002Fa> supports LSP 3.17\u003C\u002Fli>\u003Cli>The author says it was built for an infracost language server\u003C\u002Fli>\u003Cli>Demo servers already exist for Makefile and GoReleaser\u003C\u002Fli>\u003Cli>The library includes a debug server for inspecting messages\u003C\u002Fli>\u003Cli>Handlers auto-register through interfaces instead of manual setup\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Why the API design got people interested\u003C\u002Fh2>\u003Cp>The strongest reaction in the thread was about the interface-based registration model. One commenter said they liked the “interface-based auto-registration pattern” and called the implementation of HoverHandler clever because there is “no manual wiring.” That kind of feedback matters more than generic praise, because language server libraries usually fail on ergonomics before they fail on features.\u003C\u002Fp>\u003Cp>The author also explained one design tradeoff that matters a lot in production: if a handler returns a normal error, the server sends an error response and keeps going. If the handler panics, the server crashes, and the author said they were going to fix that. That is the kind of detail that tells you this is a real developer tool, not a demo wrapper around the protocol.\u003C\u002Fp>\u003Cblockquote>“That’s the kind of API design that makes Go’s implicit interfaces shine.”\u003C\u002Fblockquote>\u003Cp>That quote from the HN thread captures the core appeal. Go developers tend to like systems that feel direct, and this library seems to aim for that: define a handler, let the framework find it, and keep the protocol plumbing out of the way.\u003C\u002Fp>\u003Cp>The debug server is another smart choice. Anyone who has built integration code knows that being able to see the raw messages can save hours. In LSP work, the bug is often not the editor or the parser, but the translation layer between them.\u003C\u002Fp>\u003Ch2>How it compares with other LSP options\u003C\u002Fh2>\u003Cp>glsp is not the only Go library in this space. The author said they started with \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftliron\u002Fglsp\" target=\"_blank\" rel=\"noopener\">tliron\u002Fglsp\u003C\u002Fa> before building their own version, mainly because they wanted a debug UI to track messages. That is a useful clue: this is not a case of “the first tool was bad,” but of “the first tool did not fit my workflow.”\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775261572537-09j8.png\" alt=\"Build language servers in Go without the boilerplate\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>For teams choosing an LSP stack, the comparison comes down to ergonomics, observability, and how much protocol code you want to write by hand. Here is the practical view:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftliron\u002Fglsp\" target=\"_blank\" rel=\"noopener\">tliron\u002Fglsp\u003C\u002Fa> already exists and is a known option\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fowenrumney\u002Fglsp\" target=\"_blank\" rel=\"noopener\">owenrumney\u002Fglsp\u003C\u002Fa> adds the debug-first workflow the author wanted\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fcode.visualstudio.com\u002Fapi\u002Flanguage-extensions\u002Flanguage-server-extension-guide\" target=\"_blank\" rel=\"noopener\">VS Code’s LSP guide\u003C\u002Fa> shows why protocol reuse matters across editors\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fmicrosoft.github.io\u002Flanguage-server-protocol\u002F\" target=\"_blank\" rel=\"noopener\">LSP\u003C\u002Fa> keeps the editor-specific work smaller than writing separate plugins\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbbkane\u002Fwarg\" target=\"_blank\" rel=\"noopener\">warg\u003C\u002Fa> was mentioned in the thread as a CLI framework that could add LSP support\u003C\u002Fli>\u003C\u002Ful>\u003Cp>The thread also included a useful example from another commenter: they had once used a language server to connect two related blocks in a proprietary YAML file, and later to make SSH hosts clickable for terminal sessions or system stats. That is the real argument for LSP. Once the protocol is in place, editor behavior can be tied to any structured text, not just source code.\u003C\u002Fp>\u003Cp>That flexibility is why language servers keep spreading into places that used to depend on custom editor plugins. A Makefile server, a Terraform helper, or a YAML tool all benefit from the same protocol surface, even if the underlying logic is completely different.\u003C\u002Fp>\u003Ch2>Why this matters for Go developers\u003C\u002Fh2>\u003Cp>Go is a good fit for this kind of tooling because the language makes it easy to build small services with clear boundaries. The library’s author seems to have leaned into that by using interfaces for registration and keeping the protocol layer separate from the domain logic.\u003C\u002Fp>\u003Cp>There is also a subtle ecosystem effect here. If building a language server gets easier, then more command-line tools can grow editor features without a rewrite. That means better completions for config files, richer diagnostics for build systems, and fewer one-off plugins that break when an editor updates.\u003C\u002Fp>\u003Cp>For developers who already ship CLIs, the idea is tempting: your parser is already there, your validation rules are already there, and your editor integration may be one protocol layer away. That is why the HN commenter thinking about adding LSP to a CLI framework made so much sense.\u003C\u002Fp>\u003Cp>My read is that the important number here is not the 92 points on the HN post. It is the number of tools that could use editor support once the boilerplate gets smaller. If glsp keeps its current shape and fixes the panic path, I would expect more niche file formats to get first-class editor features over the next year, especially in Go-heavy infrastructure teams.\u003C\u002Fp>\u003Cp>If you maintain a CLI or config tool today, the question is simple: would your users benefit more from another flag, or from hover, diagnostics, and jump-to-definition in their editor? For a lot of tools, the answer is probably the editor.\u003C\u002Fp>","A Go library for LSP 3.17 aims to make editor support easier, with auto-registered handlers and real-world Makefile and GoReleaser demos.","news.ycombinator.com","https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=47510005",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775261571253-4o9s.png",[13,14,15,16,17],"language server protocol","Go","LSP 3.17","editor tooling","CLI frameworks","en",0,false,"2026-04-04T00:12:36.986072+00:00","2026-04-04T00:12:36.95+00:00","done","b9d4aad4-fcb1-427e-829a-4f6ed7489ea5","build-language-servers-in-go-without-boilerplate-en","tools","492a63a6-26d1-41fc-9267-a302acf67f45","published","2026-04-07T07:41:08.469+00:00",[31,33,35,37,39],{"name":15,"slug":32},"lsp-317",{"name":13,"slug":34},"language-server-protocol",{"name":14,"slug":36},"go",{"name":17,"slug":38},"cli-frameworks",{"name":16,"slug":40},"editor-tooling",{"id":27,"slug":42,"title":43,"language":44},"build-language-servers-in-go-without-boilerplate-zh","Go 寫 LSP 少寫一堆樣板","zh",[46,52,58,64,70,76],{"id":47,"slug":48,"title":49,"cover_image":50,"image_url":50,"created_at":51,"category":26},"a6c1d84d-0d9c-4a5a-9ca0-960fbfc1412e","why-gemini-api-pricing-is-cheaper-than-it-looks-en","Why Gemini API pricing is cheaper than it looks","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778869846824-s2r1.png","2026-05-15T18:30:26.595941+00:00",{"id":53,"slug":54,"title":55,"cover_image":56,"image_url":56,"created_at":57,"category":26},"8b02abfa-eb16-4853-8b15-63d302c7b587","why-vidhub-huiyuan-hutong-bushi-quan-shebei-tongyong-en","Why VidHub 会员互通不是“买一次全设备通用”","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778789439875-uceq.png","2026-05-14T20:10:26.046635+00:00",{"id":59,"slug":60,"title":61,"cover_image":62,"image_url":62,"created_at":63,"category":26},"abe54a57-7461-4659-b2a0-99918dfd2a33","why-buns-zig-to-rust-experiment-is-right-en","Why Bun’s Zig-to-Rust experiment is the right move","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778767895201-5745.png","2026-05-14T14:10:29.298057+00:00",{"id":65,"slug":66,"title":67,"cover_image":68,"image_url":68,"created_at":69,"category":26},"f0015918-251b-43d7-95af-032d2139f3f6","why-openai-api-pricing-is-product-strategy-en","Why OpenAI API pricing is a product strategy, not a footnote","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778749841805-uyhg.png","2026-05-14T09:10:27.921211+00:00",{"id":71,"slug":72,"title":73,"cover_image":74,"image_url":74,"created_at":75,"category":26},"7096dab0-6d27-42d9-b951-7545a5dddf33","why-claude-code-prompt-design-beats-ide-copilots-en","Why Claude Code’s prompt design beats IDE copilots","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778742651754-3kxk.png","2026-05-14T07:10:30.953808+00:00",{"id":77,"slug":78,"title":79,"cover_image":80,"image_url":80,"created_at":81,"category":26},"1f1bff1e-0ebc-4fa7-a078-64dc4b552548","why-databricks-model-serving-is-right-default-en","Why Databricks Model Serving is the right default for production infe…","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778692290314-gopj.png","2026-05-13T17:10:32.167576+00:00",[83,88,93,98,103,108,113,118,123,128],{"id":84,"slug":85,"title":86,"created_at":87},"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":89,"slug":90,"title":91,"created_at":92},"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":94,"slug":95,"title":96,"created_at":97},"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":99,"slug":100,"title":101,"created_at":102},"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":104,"slug":105,"title":106,"created_at":107},"d6653030-ee6d-4043-898d-d2de0388545b","evolving-world-prompt-engineering-en","The Evolving World of Prompt Engineering","2026-03-26T01:29:42.061205+00:00",{"id":109,"slug":110,"title":111,"created_at":112},"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":114,"slug":115,"title":116,"created_at":117},"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":119,"slug":120,"title":121,"created_at":122},"231306b3-1594-45b2-af81-bb80e41182f2","claude-code-vs-cursor-2026-en","Claude Code vs Cursor in 2026","2026-03-26T13:27:14.177468+00:00",{"id":124,"slug":125,"title":126,"created_at":127},"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":129,"slug":130,"title":131,"created_at":132},"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"]