<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: epage</title><link>https://news.ycombinator.com/user?id=epage</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 21 Jun 2026 14:59:46 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=epage" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by epage in "If you are asking for human attention, demonstrate human effort"]]></title><description><![CDATA[
<p>As a prolific PR author, I've found how I communicate has a major factor on how well and quickly people respond to PRs. I've recorded my lessons at <a href="https://epage.github.io/dev/pr-style/" rel="nofollow">https://epage.github.io/dev/pr-style/</a>.</p>
]]></description><pubDate>Fri, 12 Jun 2026 14:18:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=48504481</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=48504481</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48504481</guid></item><item><title><![CDATA[New comment by epage in "Conventional Commits encourages focus on the wrong things"]]></title><description><![CDATA[
<p>As a reviewer, I love type first because it sets expectations for what I'm going to look at. Similar if I'm bisecting or doing other history operations.<p>I don't do automated changelogs or versioning but it also makes it faster for me to do so.<p>I really dislike focusing on issue ids. I only want to jump to another tool if I need more information, so put it in the footer for after I've read what is there, like a front page news article giving you the option to go to the back to read more. Worst case that I've seen is people that think the Issue ID is all you need.</p>
]]></description><pubDate>Fri, 05 Jun 2026 18:27:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=48416345</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=48416345</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48416345</guid></item><item><title><![CDATA[New comment by epage in "Uv is fantastic, but its package management UX is a mess"]]></title><description><![CDATA[
<p>Not having used uv but being on the Cargo team for Rust, I wish `cargo update` was `cargo lock update` because it is making our life more difficult to add a version requirement update command/mode inside of Cargo. The effort has been stalled for years.<p>- Our compatibility guarantees mean we can't fundamentally change `cargo update`<p>- Using the third-party package name of `cargo upgrade` would be confusing in the distinction between the two<p>- We have to be very careful adding the mode to the existing command</p>
]]></description><pubDate>Fri, 22 May 2026 04:26:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48231919</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=48231919</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48231919</guid></item><item><title><![CDATA[New comment by epage in "Before GitHub"]]></title><description><![CDATA[
<p>An important part to me that gets overlooked is shared logins. Rust runs the tests of all known Rust projects in a tool called `crater`. I was analyzing a run identifying projects relying on internals of Cargo and opening issues. When making 200 issues by hand, it is a big help when the process is low friction: I had credentials for the site and allowing blank templates. Any time I came across a self-hosted instance, I usually ended up giving up.</p>
]]></description><pubDate>Wed, 29 Apr 2026 00:11:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=47942589</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=47942589</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47942589</guid></item><item><title><![CDATA[New comment by epage in "Reinventing the Pull Request"]]></title><description><![CDATA[
<p>I appreciate you recognize there is still a reason for grouping commits into mergeable units (PRs). Some go too far and only want every commit to be independent.<p>I also appreciate the ordering. In my projects, we put an extra focus on tests by having having a commit that adds new tests to reproduce the bad behavior so when you diff the tests with the fix commit, you get a visual of how things changed.<p>I also find that the order can be PR specific. I wonder about allowing the contributor or reviewrs reorder on per-PR basis.<p>There are also times we have a lot of test or doc changes. I wonder about grouping items to jump between or collapsing to more easily navigate around than opening and browsing a file picker.</p>
]]></description><pubDate>Thu, 02 Apr 2026 11:32:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=47612999</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=47612999</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47612999</guid></item><item><title><![CDATA[New comment by epage in "Hypothesis, Antithesis, synthesis"]]></title><description><![CDATA[
<p>Yeah, having `cargo test` require another binary like `uv` is not idiomatic. 99% of the time, I should be able to walk up to a Rust project and run `cargo test` and it should just work.</p>
]]></description><pubDate>Wed, 25 Mar 2026 00:10:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=47511429</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=47511429</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47511429</guid></item><item><title><![CDATA[New comment by epage in "Terminals should generate the 256-color palette"]]></title><description><![CDATA[
<p>Really interested in this for cargo/rustc. We run into issues where we need one or two more colors but all that is left after going for the basic semantic colors is magenta (odd choice), and black and white (not safe without inspecting the theme).</p>
]]></description><pubDate>Wed, 18 Feb 2026 12:25:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=47060276</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=47060276</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47060276</guid></item><item><title><![CDATA[New comment by epage in "Prek: A better, faster, drop-in pre-commit replacement, engineered in Rust"]]></title><description><![CDATA[
<p>For me the issue isn't performance but bad hook updating logic. They expect hooks to be managed in isolated repos with exclusive use of tags. I have my gh action and hook in the repo of my program and it has been a source of pain to users but I'd rather drop pre-commit support than have to deal with update across repos. prek fixed this.</p>
]]></description><pubDate>Wed, 04 Feb 2026 01:18:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=46880071</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46880071</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46880071</guid></item><item><title><![CDATA[New comment by epage in "Workspaces and Monorepos in Package Managers"]]></title><description><![CDATA[
<p>In Rust, we use workspaces for<p>- splitting up a package into smaller compilation units to speed up builds as llvm doesn't like large compilation units, e.g. I'm assuming this is why uv is split up<p>- splitting semver concerns (easiest if different parts of the api are versioned independently), e.g. one hope for splitting out `serde_core` is to allow breaking changes of `serde_derive`<p>- splitting out optional parts to improve build time (`features` can also be used but usability isn't as great), e.g. `clap` (cli parser) and `clap_complete` (completion support)<p>- local development tools, e.g. <a href="https://github.com/matklad/cargo-xtask" rel="nofollow">https://github.com/matklad/cargo-xtask</a><p>- less commonly run tests or benches that have expensive dependencies, e.g. `toml` splits out a benchmark package for comparing performance of `toml`, `toml_edit`, an old version of `toml`, and `serde_json`<p>- proc-macros generally have a regular library they generate code against<p>- lower development overhead to develop them together, e.g. anstyle has a lot of related packages and I wouldn't be wanting to maintain a repo per package<p>Packages also let you mix a library with bins and examples. We talked about multi-purpose packages vs libraries at <a href="https://blog.rust-lang.org/inside-rust/2024/02/13/this-development-cycle-in-cargo-1-77/#when-to-use-packages-or-workspaces" rel="nofollow">https://blog.rust-lang.org/inside-rust/2024/02/13/this-devel...</a> (this was before workspace publishing was supported).<p>Something this doesn't mention is that Cargo workspaces allow for sharing parts of the manifest through "workspace inheritance", including package metadata like the repo, dependency version requirements, lint configuration, or compilation profiles.</p>
]]></description><pubDate>Sat, 24 Jan 2026 03:11:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=46740699</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46740699</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46740699</guid></item><item><title><![CDATA[New comment by epage in "Nested code fences in Markdown"]]></title><description><![CDATA[
<p>> In fact, a code fence need not consist of exactly three backticks or tildes. Any number of backticks or tildes is allowed, as long as that number is at least three<p>Unfortunately, some markdown implementations don't handle this well. We were looking at using code-fence like syntax in Rust and we were worried about people knowing how to embed it in markdown code fences but bad implementations was the ultimate deal breaker. We switched to `---` instead, making basic cases look like yaml stream separators which are used for frontmatter.</p>
]]></description><pubDate>Wed, 21 Jan 2026 14:11:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=46705941</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46705941</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46705941</guid></item><item><title><![CDATA[New comment by epage in "Improving the performance of WAT parser"]]></title><description><![CDATA[
<p>> Use hand-written parser
>
> The old parser was written with winnow which is a parser combinator library.
While it’s easy to create a parser with parser combinators, it’s generally slower than a hand-written parser,
so the first step is to write the parser by hands. Hand-written parser is not only faster but also allows to do more optimizations in the future.<p>Maintainer of Winnow here.  I wish there were more details on this.  I switched `toml` / `toml_edit` to being hand written and got some performance boost but I feel like the other things listed would have dwarfed the gains that I got.  I wonder if there were sub optimal patterns they employeed that we could find ways to help better guide people.<p>For anyone going on about "hand written is always better", I disagree.  Parser combinators offer a great way to map things back to grammar definitions which makes them much easier to maintainer.  Only in extreme circumstances of features and/or performance does it seem worth going hand-written to me.</p>
]]></description><pubDate>Tue, 20 Jan 2026 21:32:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=46698022</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46698022</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46698022</guid></item><item><title><![CDATA[New comment by epage in "CLI's completion should know what options you've typed"]]></title><description><![CDATA[
<p>There are a couple differen things going on<p>- completions being aware of the subcommand<p>- dynamic look ups for specific values<p>- completions being aware of previous options, flags, and values<p>A lot of completions have the first. Some have the second. The last is rare. The completer needs knowledge of when flags, options, and value can be repeated and change which future options and values are suggested.</p>
]]></description><pubDate>Sat, 17 Jan 2026 01:33:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=46654445</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46654445</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46654445</guid></item><item><title><![CDATA[New comment by epage in "NPM to implement staged publishing after turbulent shift off classic tokens"]]></title><description><![CDATA[
<p>As I'm not familiar with the npm ecosystem so maybe I'm misunderstanding this but it sounds like they removed support for local publishes (via a token) in favor of CI publishing using Trusted Publishing.<p>If that is correct, I thought this was discussed when Trusted Publishing was proposed for Rust that it was not meant to replace local publishing, only harden CI publishing.</p>
]]></description><pubDate>Wed, 07 Jan 2026 19:28:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=46531261</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46531261</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46531261</guid></item><item><title><![CDATA[New comment by epage in "The C3 Programming Language"]]></title><description><![CDATA[
<p>It reads naturally but I can see people getting tripped up writing this. Worse for changing existing code. Refactor in a way that removes a body? Likely forget to add a breake</p>
]]></description><pubDate>Sat, 03 Jan 2026 23:13:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=46482768</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46482768</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46482768</guid></item><item><title><![CDATA[New comment by epage in "The C3 Programming Language"]]></title><description><![CDATA[
<p>I think the switch statement design is a foot gun: defaults to fall-through when empty and break when there is a body.<p><a href="https://c3-lang.org/language-overview/examples/#enum-and-switch" rel="nofollow">https://c3-lang.org/language-overview/examples/#enum-and-swi...</a></p>
]]></description><pubDate>Sat, 03 Jan 2026 17:58:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=46479540</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46479540</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46479540</guid></item><item><title><![CDATA[New comment by epage in "Rust errors without dependencies"]]></title><description><![CDATA[
<p>> > Struct variant fields are public, limiting how you evolve the fields and types<p>> But the whole point of thiserror style errors is to make the errors part of your public API. This is no different to having a normal struct (not error related) as part of your public API is it?<p>Likely you should use private fields with public accessors so you can evolve it.</p>
]]></description><pubDate>Wed, 31 Dec 2025 00:14:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=46439852</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46439852</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46439852</guid></item><item><title><![CDATA[New comment by epage in "Rust errors without dependencies"]]></title><description><![CDATA[
<p>Take the example at <a href="https://docs.rs/thiserror/latest/thiserror/" rel="nofollow">https://docs.rs/thiserror/latest/thiserror/</a><p>- Struct variant fields are public, limiting how you evolve the fields and types<p>- Struct variants need non_exhaustive<p>- It shows using `from` on an error. What happens if you want to include more context? Or change your impl which can change the source error type<p>None of this is syntactically unique to errors. This becomes people's first thought of what to do and libraries like thiserror make it easy and showcase it in their docs.</p>
]]></description><pubDate>Mon, 29 Dec 2025 01:03:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=46416210</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46416210</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46416210</guid></item><item><title><![CDATA[New comment by epage in "Rust errors without dependencies"]]></title><description><![CDATA[
<p>I think we should provide the building blocks (display, etc like derive_more) rather than a specialized version one for errors (thiserror).<p>I also feel thiserror encourages a public error enum which to me is an anti-pattern as they are usually tied to your implementation and hard to add context, especially if you have a variants for other error types.</p>
]]></description><pubDate>Sun, 28 Dec 2025 21:20:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=46414637</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46414637</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46414637</guid></item><item><title><![CDATA[New comment by epage in "Rust the Process"]]></title><description><![CDATA[
<p>> It may have been nice to expose some reasonable defaults for code coverage measurements too.<p>Would love built in coverage support but investigation is needed on the design (<a href="https://github.com/rust-lang/cargo/issues/13040" rel="nofollow">https://github.com/rust-lang/cargo/issues/13040</a>) and we likely need to redo how we handle doctests (<a href="https://blog.rust-lang.org/inside-rust/2025/10/01/this-development-cycle-in-cargo-1.90/#all-hands-doctests" rel="nofollow">https://blog.rust-lang.org/inside-rust/2025/10/01/this-devel...</a>).</p>
]]></description><pubDate>Sun, 28 Dec 2025 00:35:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=46407105</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46407105</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46407105</guid></item><item><title><![CDATA[New comment by epage in "How uv got so fast"]]></title><description><![CDATA[
<p>For Cargo,<p>- synchronization operations are implicit so we need to re-resolve to confirm the lockfile is still valid. We could take some short cut but it would require re-implementing some logic<p>- dependency resolution only uses `Cargo.toml` for local and git dependencies. Registry dependencies have a json summary of what content is relevant for dependency resolution. Cargo parses nearly every locked package's `Cargo.toml` to know how to build it.</p>
]]></description><pubDate>Sat, 27 Dec 2025 21:16:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=46405319</link><dc:creator>epage</dc:creator><comments>https://news.ycombinator.com/item?id=46405319</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46405319</guid></item></channel></rss>