Really shitty dilemma

Edit: I know it's not actually a shitty dilemma, I am actually quite privileged to have any offers at all in this climate. But I need the clickbait.

TL;DR: Not looking for answers, but shared experiences: who has been in a position where you had to pick between a job you love with low pay and a job you can tolerate with very very very high pay.

I will try to keep this short. I have been offered two positions / career pathways with companies I've been working for recently.

Company A is where I currently intern at. A well known Engineering powerhouse across North America and Europe. I've been an intern there for about 6 months and just confirmed with my manager that the plan for me is to be converted.

The work is everything I love. Distributed systems, Embedded Linux, Cloud computing, DevOps, Rust, Go, Typescript. Truly full-stack and interesting problems to be solved every day.

Pay is $27/hr. Based on other interns, I expect to be paid anywhere between $85k/$95k when I convert. Not high by any means but not bad. The company is very stable (compared to big tech). It's hybrid and quite flexible.

Company B is one I've been with for almost a year as an independent contractor and was recently offered a full-time Associate FDE role, fully remote. $166k/yr to start.

The company is a newer AI startup, founded in 2019. They've had steady growth and consistently bring in funding from various sources. But the work is nowhere near what I'd like to do for the foreseeable future. More like DevOps/data pipeline development and model evaluation work.

I guess the idea is I pivot once I feel like either the company is trending down or I don't grow in the right direction and steer too far from my vision as a developer.

For the last couple of years, answers like this when deciding on opportunities were no brainers for me. But this is the highest amount of money I have ever been offered. After doing rough math, I'd be keeping an extra ~$76k in my pocket after taxes, for the year.

If this provides any helpful context: I am 25, getting married in the Fall/Winter, no kids and $55k of student debt. I just bought a house and I own my car, only live off of like $3k a month in a pretty median cost of living state.

reddit.com
u/cachebags — 10 days ago

Pay per task or truly hourly?

just received an instant offer as a generalist expert for an hourly rate.

I have gotten reached out to be these types of companies before but always have been a skeptic. Figured I’d just accept this one and see what’s up.

Is it actually hourly? Or is it only per accepted task? If the former, do I log my hours? or do they track it somehow.

There is always these ridiculous pay rates I’m seeing but I have a feeling these are to get you signing their offers and then they pull the rug out and tell you it’s only per accepted task.

Thanks.

reddit.com
u/cachebags — 19 days ago
▲ 60 r/rust

my software is running on Pop!_OS

Don't really have a lot of programmer friends to share this with. They would have no clue what I am talking about so I just wanted to toot my horn a little bit and share that my project is running on Pop!_OS' WIP applets for cosmic-panel: https://github.com/pop-os/cosmic-applets

I've been working on it for almost a year. They're basically just Rust bindings for NetworkManager over D-Bus. I have posted about it, perhaps too many times, in this sub-reddit.

That's it. Just wanted to put it out there.

u/cachebags — 23 days ago
▲ 1 r/rust

temporary value is freed at the end of this statement - sqlx

I need some help understanding this issue I ran into this morning.

I build out this query as such:

let pool = sqlx::postgres::PgPoolOptions::new()
            .after_connect(move |conn, _meta| {
                let role = project_role.clone();
                Box::pin(async move {
                    use sqlx::Executor;
                    conn.execute(format!("SET ROLE {role}").as_str()).await?;
                    Ok(())
                })
            })
            .connect_with(connect_opts)
            .await
            .map_err(|e| {
                // Don't surface the raw sqlx error: it can include
                // connection details. Log it internally.
                tracing::error!(error = %e, "postgres connect failed");
                DataSourceError::Backend("failed to connect to postgres".to_string())
            })?;

This of course, leads me to the following error:

...
error[E0716]: temporary value dropped while borrowed
   --> crates/datasource-db/src/lib.rs:109:34
    |
109 |                     conn.execute(format!("SET ROLE {role}").as_str()).await?;
    |                     -------------^^^^^^^^^^^^^^^^^^^^^^^^^^----------       - temporary value is freed at the end of this statement
    |                     |            |
    |                     |            creates a temporary value which is freed while still in use
    |                     argument requires that borrow lasts for `'static`
    |
...

Perusing stack overflow and other forums, I found that I'd simply need to move the String into an owned variable and then just borrow it. But then I got this error:

 = help: the trait `SqlSafeStr` is not implemented for `&std::string::String`
    = note: prefer literal SQL strings with bind parameters or `QueryBuilder` to add dynamic data to a query.

            To bypass this error, manually audit for potential injection vulnerabilities and wrap with `AssertSqlSafe()`.
            For details, see the docs for `SqlSafeStr`.

This sounds reasonable but I am having trouble understanding what the point is? There is no runtime difference between this and just borrowing the String.

I am fairly new to DB stuff so excuse me if it's a naive question but if sqlx isn't magically sanitizing the string for me what's the point of me having to pass the query into AssertSqlSafe? Is it merely to make it obvious at the call-site that this is a dynamic query?

reddit.com
u/cachebags — 26 days ago

cost benefit analysis of programming with AI

i've been programming now for a couple years and just started at a company writing actual software.

i unfortunately started learning to program before the release of LLMs generally, and im now finishing my degree in the midst of all of the shit going on now.

at work, i've accepted that using LLMs for everything is inevitable and necessary to produce our software for customers.

at home, i've tried to be disciplined in writing my software without the use of LLMs, and even if I do decide to use AI, i still force myself to write every line by hand.

the issues i am having is that it is hard to justify deciding to program the slow and arduous way of looking up language/framework docs, stack overflow, reddit, etc. and building the pieces together in my head when LLMs can write it in mere minutes.

i am well aware that at the root of all of this, deeply grokking something like programming requires that long and tedious process. what i am struggling with is being okay with that.

i guess i thought that once i landed a job things would work out but it's made things worse because now i am getting paid to NOT understand the code i am writing, which feels so backwards to me.

the slippery slope with using AI as a teacher is that it will never get the nuances correct with documentation. especially with fast moving software like bevy or zig. you need to be quite explicit in telling them to use their web search tools to get the latest info and even then it doesn't quite understand things properly. so now i'm like okay well i'll just move to an IDE, and include the docs as files for context of the agent. and while i'm here, let me have it write these modules for me as well. then before i know it, every importance piece of my program was written without me barely intervening at all.

i can't find anyone else with this same question. maybe it's not answerable. is anyone else feeling this way?

u/cachebags — 1 month ago
▲ 6 r/arch

switching to KDE from hyprland

the older i get the less i want to tinker with my config. i still love arch but i want to move off of hyprland into something that's more desktop-y.

i use ubuntu on my work laptop but hate GNOME. i heard KDE plasma was the way to go but i'm curious about a couple things

  • is my stuff in ~/.config at all decoupled with hyprland? basically- if i install something like KDE plasma alongside hyprland and boot into it, will i find a bunch of overlapping shit from my ~/dotfiles on hyprland?
  • does anyone suggest anything beside KDE plasma? for context- my workflow is really just rust/typescript development via zed, git and then a my firefox browser. i do everything else through my terminal.

any suggestions would be appreciated!

reddit.com
u/cachebags — 1 month ago

Is Software Engineering usually this lackadaisical?

I am in my first real[1] internship->new-grad situation working for a bigger automotive company providing an embedded SaaS for internal + global customers fleets.

The work is pretty involved and I'm kind of touching everything in the stack, which is awesome. It's been an amazing experience, my manager is actually really cool and perfect in every way I think as far as being a mentor-like figure for my early career.

But one thing I've noticed is the lack of discipline in our development cycles. It's not really THAT big of an issue because everyone is clearly competent and it's a smaller team so there is not really a need to nitpick everything. But code reviews are very...minimal. We have an LLM bot that does a "first pass" and reviews (or tries to at least) the obvious things but other than that, everyone just kind of rubber stamps everything and worries about the fallback later.

As someone who also comes from working in OSS for about a year now, it is very jarring to me. I've had reviews on PRs in OSS that point out the fact that I didn't add a period to the end of my doc comments.

That's obviously an extreme / unfair scenario to point out, and yes, it did actually happen. I am well aware these are all to the volition of the maintainers of whatever project is being built, but broadly speaking, the programming discipline, both in actual code and reviews, is far stricter in the work I've done and seen across OSS. A better example might be clap-rs.

Simply curious to see if this is the case in other companies, especially big tech. Is the played out, tech influencer trope of "LGTM"ing everything actually real?

[1]: By "real," I mean I'm not doing glorified data-analyst work where I'm writing Excel sheets and slide decks while being given the title "Software Developer Intern."

u/cachebags — 1 month ago
▲ 6 r/bevy

grey box maps for testing

where do you guys get grey box test / stub maps for experimenting with gameplay mechanics? i would make my own but im curious if anyone uses any specific sources for this.

reddit.com
u/cachebags — 1 month ago
▲ 15 r/bevy

Deps vs hand rolling

question for the fairly experienced bevy dev (I guess this could apply to game devs more broadly for those who program their games by hand):

how do you decide when to delegate certain functionalities or set of functionalities to dependencies and when to decide to hand roll/maintain your own?

I’ve begun developing my game and my professional experience from my regular day job keeps peering in and given bevy’s rapidly changing surface, I worry about steering even further from it by potentially depending on plugins or libraries that are either majorly unfinished or abandoned/soon to be abandoned.

but at the same time, I get why we should delegate things like physics to something like avian.

curious to hear thoughts from people who have been working on bevy for a bit.

reddit.com
u/cachebags — 1 month ago

Unlimited credits, 40 hours a week and AI still couldn't prevent OOM

Taking a poop at work and wanted to share my experience as a Software Engineer using AI at work. I’ll try to keep short

TL;DR: I spent one a half months developing our service using AI and it still couldn’t plan for OOM.

We were given access to Copilot unlimited (before the usage based changes). I spent pretty much all of April and most of May developing a gRPC server to distribute telemetry data to our main SaaS platform. In essence, we want customers to be able to access this data on demand instead of having to download the specific file format the data gets converted to.

I‘m an AI skeptic but I’m not stupid enough to see absolutely ZERO benefit in AI. And when we were given access to an unlimited plan with Copilot, I figured why not see how it can help us achieve this task of on demand telemetry serving.

So I buckled down and did my due diligence. I learned about skills and “prompt engineering“ (god I fucking hate that term). I learned about running parallel agents and planning before implementation and all the stupid shit you see on X of how people “100x their output”.

Despite this, it actually still required a whole bunch of manual intervention just because of the nature of this domain. But all in all, I pretty much mostly let the AI actually program and I was the one steering it towards our proposed architecture. I gave it all the info it needed- the resource constraints of our EC2, the exact schemas we used between our flatbuffers and protocol buffers, how our infra actually works to authenticate users that should be able to access this data. Everything I could possibly think of: I made sure the agents always had this info on hand.

Throughout this I’m of course ”reviewing“ it‘s code. And frankly it looked fine.

It’s now June. We’ve gotten the service deployed in our dev environment and all is good and well.

That is until our EC2 shits the bed and our server consumes 95 percent of the available resources.

Loading one set of data on our frontend bursted so many RPC calls that when another dev opened a fucking grafana dashboard, the EC2 decided to kill our service (since it was taking up all the memory) and still crashed.

Remember when I said I was reviewing the code? Yeah, that’s all bullshit. If anyone tries to tell you that your future as a Software Engineer is “architecting the solution and steering an agent to implement it”, do not for a second believe them.

What REALLY happened was I was too fucking naive. I wanted to try and compromise with the internet. I thought “hey maybe these YC shmucks are right, maybe I should focus on system design and let agents do the work.”

It’s all a load of bullshit. All it did was stunt my growth. I THOUGHT I knew how our system worked because I trusted the AI to properly implement the code based on my decisions and guidance. But I was fooling myself. I was a fucking idiot to think I, as the sole dev of the project, could review the work properly. It was not allocation conscious, it wrote the most naive and useless Rust traits in the history of mankind, it compressed code in the dumbest fucking ways (helpers everywhere, but it never actually simplified logic in the callsites themselves). It was just shitty code but I stupidly thought, “hey that looks right I guess, shouldn’t be too much of an issue down the line.”

I don’t care how smart you think you are. You are ALSO fooling yourself if you think people’s jobs are going to be replaced (in this context SWE jobs in particular).

The inevitable truth is that no matter how much you think you know about how to “guide” these agents to write your Software- no matter how much shitty harnesses and workflows you develop just to try and get around actually doing your job and learning about how your code works, you will always lose because there is no amount of context you can give an agent to understand how anything with even a tiny bit of nuance works.

They’re always going to give you the next LIKELY answer. Not the most correct. Not the cleanest. The most PROBABLE. Because that’s all they fucking are. Token predictors. And I think that in the next two years, people will begin to realize this and either:

  1. Quit programming. Because they never got a degree or learned about CS fundamentals so the peak of their output willl be shitty CRUD apps.
  2. Stop using AI so loosely and start doing their jobs again, in turn reducing velocity and in turn creating the need for MORE jobs due to stabilization of output (slower output, need for more devs + shitty Software from this dev AI bubble, thus more debt accumulated).

Thanks. My legs are falling asleep now.

reddit.com
u/cachebags — 2 months ago

The worst part of all this is not being able to see usage

I do not care for Copilot. But, we use it at work so in a way I am stuck with it. I don't understand why the FUCK I can't see a breakdown of my usage.

I'm just supposed to take your word that my prompt to extract a helper from a function costed 63 fucking credits? Get the fuck out of here.

If there is a way to do this, it must be painfully hard to find.

reddit.com
u/cachebags — 2 months ago

my take on the marriage of trad coding and AI

https://github.com/cachebag/jumpy.nvim

TL;DR: i think 99 is awesome and can be improved upon both philosophically and architecturally.

i sat on this for a bit because i didn't know if it made sense to pursue. but IMHO, especially at work, if you are finding yourself unable to avoid using AI for whatever reason and you really would prefer to keep your hard skills intact for the foreseeable future, i think that jumpy.nvim might be a good option for you. i think i've come to the conclusion that what i built is genuinely the cleanest experience for agentic-ish coding. yes that is incredibly biased but i do mean it and obv YMMV due to the intensely opinionated nature of these tools.

fully inspired by 99. i think prime was on to something, and still is. but i don't actually think he approached it correctly or perhaps more accurately, i misunderstood what his goal was. because i personally still feel a bunch of friction when using 99. i think there's a path he prefers with coding with AI and my project is simply a different path. so that's why i hesitate to say it's better or worse objectively, just different.

all hallucinations and shitty code are of my own. i have gotten a couple contributions so far and they've been pretty amazing. i have some pretty good ideas on where to take this but as a prototype it has worked shockingly well for me lately.

i personally love traditional hand coding. and i also fear of losing that skill. i think this as a solution, this will keep me competent for the long run as these AI tools continue to dominate. i really do not see another way this could be improved upon workflow wise. it's also far cheaper. i explain more in depth in the README but generally speaking, i think the philosophy around being in the driver seat still while using AI is more better suited as a solution where you are actually in full, granular control of the changesets being applies to your codebase.

what i mean is; we should likely lean further away from context based workflows, letting agents read your skills files, other modules, etc. i mean ideally, you should already know how your system works so if you need an agent to do something, there is zero reason you should have to tag 4 different files and 2 skills to have it do that thing.

the skills things is a bit different because that's more so pre-loading the agent with knowledge that's otherwise quite hard to repeat and explain.

having the option of course to tag files in your workspace should be there but i think the better option is to be forced as a user to reason about what you are about to ask an LLM to write for you. not "hey look at foo.c, bar.c and moo.c and implement xyz for me in baz.c". there is literally no way you'll be able to look at the diff it gives you and be like "yep looks good". like you didn't even full comprehend what you asked it to do, you just blanket statement gave it an order to implement something.

there's obviously so many caveats to this like refactors, extracting helpers and redundant code, etc. workflows where you just need things shifted around.

idk ive yapped enough; if you are going to try this out (thanks btw :p) i HIGHLY suggest trying the re-prompt a hunk feature (<leader>-r). if you don't like a hunk given to you by your agent, you can just re-prompt that specific changeset instead of feeding the entire files tokens into the prompt again.

thanks!!! happy to read feedback, accept PRs, issues, etc.

u/cachebags — 2 months ago

[OC] A proper, Wayland compatible, GUI for NetworkManager

Many of you may remember nmrs-gui- my wayland/hyprland friendly network manager built in Rust. The idea is that instead of shelling out to nmcli or something else, we interface with NetworkManager over D-Bus itself for a smooth, reliable and performant experience.

Well, we now support VPN! OpenVPN and WireGuard in specific.

nmrs-gui repo: https://github.com/networkmanager-rs/nmrs-gui

I have tested WireGuard thoroughly but have not been able to rigorously test OpenVPN. I would love for someone to stress test it and file any bugs or issues you find.

You can download nmrs-gui through yay or paru

yay -S nmrs  
paru -S nmrs
u/cachebags — 2 months ago
▲ 18 r/archlinux+1 crossposts

An actually good network manager for hyprland - VPN support!

https://preview.redd.it/vd94crfuoe2h1.png?width=1795&format=png&auto=webp&s=987b8577d279d2f7aae92222bf90e1d180c6de6e

Many of you may remember nmrs-gui- my wayland/hyprland friendly network manager built in Rust.The idea is that instead of shelling out to nmcli or something else, we interface with NetworkManager over D-Bus itself for a smooth, reliable and performant experience.

This led me to create nmrs, which has now been separated into its own crate and library and nmrs-gui was pulled out as well as its own repo. They now live in a networkmanager-rs org.

nmrs-gui repo: https://github.com/networkmanager-rs/nmrs-gui

Anyways- I've been making a lot of improvements to the underlying library, most notably, OpenVPN support! I supported WireGuard natively before but OpenVPN seemed to be far more popular, albeit a bit more complicated to implement.

I took my time, integrated it into the library itself about a month ago and I've just released the first version of the GUI with OpenVPN and WireGuard support built in!

I have tested WireGuard thoroughly but have not been able to rigorously test OpenVPN. I would love for someone to stress test it and file any bugs or issues you find.

You can download nmrs-gui through yay or paru

yay -S nmrs
paru -S nmrs

Please, feel free to leave critiques, feedback, or feature requests, It's quite minimal right now but I plan on improving it even further as adoption grows!

I am also more than open to contributions.

Thanks so much!

Mods: I've posted this tool a few times before.

Ref: https://www.reddit.com/r/hyprland/comments/1ql9h94/a_proper_gui_for_networkmanager/

Ref:
https://www.reddit.com/r/hyprland/comments/1omz4nb/for_the_hyprland_fanatics_looking_for_a_wayland/

reddit.com
u/cachebags — 2 months ago
▲ 1 r/archlinux+1 crossposts

nmrs-gui - we finally have OpenVPN support!

Many of you may remember nmrs-gui- my wayland/hyprland friendly network manager built in Rust.

https://preview.redd.it/vd94crfuoe2h1.png?width=1795&format=png&auto=webp&s=987b8577d279d2f7aae92222bf90e1d180c6de6e

The idea is that instead of shelling out to nmcli or something else, we interface with NetworkManager over D-Bus itself for a smooth, reliable and performant experience.

This led me to create nmrs, which has now been separated into its own crate and library and nmrs-gui was pulled out as well as its own repo. They now live in a networkmanager-rs org.

nmrs-gui repo: https://github.com/networkmanager-rs/nmrs-gui

Anyways- I've been making a lot of improvements to the underlying library, most notably, OpenVPN support! I supported WireGuard natively before but OpenVPN seemed to be far more popular, albeit a bit more complicated to implement.

I took my time, integrated it into the library itself about a month ago and I've just released the first version of the GUI with OpenVPN and WireGuard support built in!

I have tested WireGuard thoroughly but have not been able to rigorously test OpenVPN. I would love for someone to stress test it and file any bugs or issues you find.

You can download nmrs-gui through yay or paru

yay -S nmrs
paru -S nmrs

Please, feel free to leave critiques, feedback, or feature requests, It's quite minimal right now but I plan on improving it even further as adoption grows!

I am also more than open to contributions.

Thanks so much!

reddit.com
u/cachebags — 2 months ago

AI inline diffs? Not working.

I have searched everywhere for this but I cannot find anything. It's my understanding that Zed supports inline diffs from AI changes in similar fashion to how VSCode or Copilot do. Basically, when you have an LLM write changes to your file(s), the hunks show inline in the file and you can either accept/reject.

I don't seem to have that option? I've already enabled the diffs to show as "Unified" in my settings but I don't think that has anything to do with how changes are applied by my AI agents. I'm using Copilot but even with the Zed agent, my LLM will write the changes without giving me the option to cycle hunks

Anybody have any idea? Is it simply not supported yet?

reddit.com
u/cachebags — 2 months ago
▲ 26 r/rust

Why my Rust bindings for NetworkManager over DBus on Linux are superior

nmrs is an async-first Rust API for NetworkManager over D-Bus. The goal is to provide a safe and simple high-level API for managing Wi-Fi connections on Linux systems, built on zbus for reliable D-Bus communication.

The biggest confusion I see is that people seem to think it's shelling out to nmcli or some other interface/program. While I think taking a few seconds to read code is very crucial here, I understand why someone wouldn't jump to see what my library does. It's a bit niche.

It is essentially a set of bindings that allows you to easily interact with NetworkManager over DBus on Linux, and I think I've done a thorough job of covering most of the major operations in NM (see example below). The goal is to cover basically everything that NM does, which will take time but the project is at a point now where it's reliable and stable enough to use in your IoT devices, GUIs, network utilities, etc.

We are also covering major VPN surfaces. WireGuard has first class support, and I'm very close I have finished OpenVPN support, along with support for other plugin VPNs - docs.

The best way to demonstrate how it can be used is the following example below, where we will list our networks, connect to one and then print the SSID we've connected to:

use nmrs::{NetworkManager, WifiSecurity};

#[tokio::main]
async fn main() -> nmrs::Result<()> {
    let nm = NetworkManager::new().await?;
    
    // List networks
    let networks = nm.list_networks().await?;
    for net in &networks {
        println!("{} - Signal: {}%", net.ssid, net.strength.unwrap_or(0));
    }
    
    // Connect to WPA-PSK network
    nm.connect("MyNetwork", WifiSecurity::WpaPsk {
        psk: "password".into()
    }).await?;
    
    // Check current connection
    if let Some(ssid) = nm.current_ssid().await {
        println!("Connected to: {}", ssid);
    }
    
    Ok(())
}

To show how, or more importantly why this is better than alternatives, here's the exact same code but using raw DBus.

(gist because the example is 161 lines and I don't wanna dump)

Beyond the difference in pure LoC, you may have also noticed that in the DBus version:

  • We require painfully constructing nested HashMap<String, PropMap> with Variant(Box::new(...)) for every connection property
  • You have to know the exact DBus interface strings, method names, and property types (e.g. that SSID is Vec<u8>, device type 2 means WiFi)
  • Just finding the right WiFi device requires looping through all devices, querying each one's DeviceType property, and filtering accordingly
  • Error handling in the raw version is a maze of opaque DBus errors with no context
  • Most importantly, the existing options like networkmanager-rs and the dbus crate are inherently synchronous and blocking (not to mention abandoned). nmrs is async first, supporting tokio and every other framework out of the box.

These are only a few reasons on why I built nmrs, and what value it would bring to someone who would want/need to use Rust to write their Network utilities.

Repo: https://github.com/cachebag/nmrs

I've spent a lot of time working on the code and reasoning through a lot of the design patterns I chose. (No, none of it was vibecoded).

While a project like this can and will be opinionated by nature, I still think this is the best option for anyone looking to interact with NM in Rust.

I am more than open to critiques, feedback, suggestions, etc. Contributions are very welcome.

I also want to give a special shoutout to zbus for making the development of nmrs very seamless.

I started this project about 8 months ago and I've very recently gotten a fire lit inside to continue fleshing it out. I'm very proud of where it has gotten so far and I hope I've been able to properly show the value proposition in using it.

One thing I am dwindling on is time to work on it. I would really love a maintainer by my side or consistent contributors who enjoy linux, rust or network programming in general! PM me or shoot me a message to my email - akrmATcachebag.sh

Thanks!

reddit.com
u/cachebags — 2 months ago
▲ 0 r/linux

For my DBus/Networking/Rust nerds: Why my Rust bindings for NetworkManager over DBus on Linux are superior

nmrs is an async-first Rust API for NetworkManager over D-Bus. The goal is to provide a safe and simple high-level API for managing Wi-Fi connections on Linux systems, built on zbus for reliable D-Bus communication.

The biggest confusion I see is that people seem to think it's shelling out to nmcli or some other interface/program. While I think taking a few seconds to read code is very crucial here, I understand why someone wouldn't jump to see what my library does. It's a bit niche.

It is essentially a set of bindings that allows you to easily interact with NetworkManager over DBus on Linux, and I think I've done a thorough job of covering most of the major operations in NM (see example below). The goal is to cover basically everything that NM does, which will take time but the project is at a point now where it's reliable and stable enough to use in your IoT devices, GUIs, network utilities, etc.

We are also covering major VPN surfaces. WireGuard has first class support, and I'm very close I have finished OpenVPN support, along with support for other plugin VPNs - docs.

The best way to demonstrate how it can be used is the following example below, where we will list our networks, connect to one and then print the SSID we've connected to:

use nmrs::{NetworkManager, WifiSecurity};

#[tokio::main]
async fn main() -> nmrs::Result<()> {
    let nm = NetworkManager::new().await?;
    
    // List networks
    let networks = nm.list_networks().await?;
    for net in &networks {
        println!("{} - Signal: {}%", net.ssid, net.strength.unwrap_or(0));
    }
    
    // Connect to WPA-PSK network
    nm.connect("MyNetwork", WifiSecurity::WpaPsk {
        psk: "password".into()
    }).await?;
    
    // Check current connection
    if let Some(ssid) = nm.current_ssid().await {
        println!("Connected to: {}", ssid);
    }
    
    Ok(())
}

To show how, or more importantly why this is better than alternatives, here's the exact same code but using raw DBus.

(gist because the example is 161 lines and I don't wanna dump)

Beyond the difference in pure LoC, you may have also noticed that in the DBus version:

  • We require painfully constructing nested HashMap<String, PropMap> with Variant(Box::new(...)) for every connection property
  • You have to know the exact DBus interface strings, method names, and property types (e.g. that SSID is Vec<u8>, device type 2 means WiFi)
  • Just finding the right WiFi device requires looping through all devices, querying each one's DeviceType property, and filtering accordingly
  • Error handling in the raw version is a maze of opaque DBus errors with no context
  • Most importantly, the existing options like networkmanager-rs and the dbus crate are inherently synchronous and blocking (not to mention abandoned). nmrs is async first, supporting tokio and every other framework out of the box.

These are only a few reasons on why I built nmrs, and what value it would bring to someone who would want/need to use Rust to write their Network utilities.

Repo: https://github.com/cachebag/nmrs

I've spent a lot of time working on the code and reasoning through a lot of the design patterns I chose. (No, none of it was vibecoded).

While a project like this can and will be opinionated by nature, I still think this is the best option for anyone looking to interact with NM in Rust.

I am more than open to critiques, feedback, suggestions, etc. Contributions are very welcome.

I also want to give a special shoutout to zbus for making the development of nmrs very seamless.

I started this project about 8 months ago and I've very recently gotten a fire lit inside to continue fleshing it out. I'm very proud of where it has gotten so far and I hope I've been able to properly show the value proposition in using it.

One thing I am dwindling on is time to work on it. I would really love a maintainer by my side or consistent contributors who enjoy linux, rust or network programming in general! PM me or shoot me a message to my email - akrmATcachebag.sh

Thanks!

reddit.com
u/cachebags — 2 months ago