Top
Best
New

Posted by raskrebs 9 hours ago

Show HN: Sonar – A tiny CLI to see and kill whatever's running on localhost(github.com)
101 points | 57 comments
mrbonner 12 minutes ago|
Hey, thanks for sharing this. Your app inspires me to take a look at Go, again! I've been searching for another primary language to learn. My primary used to be Java at $day$ job and now Python for ML/AI. I love Python but still feel insecure given the lack of static typing. I look at TypeScript as well, especially in the context of Bun runtime. I decided it may not be for me, not the language, but the ecosystem around it.
raskrebs 1 minute ago|
I quite like go for how lean it is, really nice for local projects with lots of constant changes. Also easy to learn. The biggest most annoying thing is how bad error handling is done, not sure why they built it like that.

I primarily write typescript and python for work. But have dabbled in bunch of other languages at different jobs and for different tasks. Yet to pick up rust, but have been wanting to. But tend to pick what seems most right for the task, while also considering what i most want to be working with

mustafa0x 1 hour ago||
Nice util. It should be possible to kill inline.

I like clack/prompts. See its multiselect API.

https://github.com/bombshell-dev/clack/tree/main/packages/pr...

raskrebs 1 hour ago|
Will have a look. Mind creating an issue so i don't forget?

https://github.com/raskrebs/sonar/issues

klaushardt 7 hours ago||
Would be nice to have a flag to customize the URL displayed for Docker containers. I connect to my host via Tailscale, but I can’t open links with localhost. It would be helpful to have a parameter that allows us to choose a network device or specify an IP address to display.

    3000    wud (getwud/wud:latest)                            wud          getwud/wud:latest                       3000    http://localhost:3000
    3001    dockhand (fnsys/dockhand:latest)                   dockhand     fnsys/dockhand:latest                   3000    http://localhost:3001
raskrebs 6 hours ago|
Good point. Could you add an issue, then i'll have a chance to look into it :)

https://github.com/RasKrebs/sonar/issues

maciejj 5 hours ago||
Nice! I always forget the lsof flags and end up googling them every time. Would be cool if it could run in the system tray and show what's running on your ports at a glance. Also, the name had me thinking SonarQube at first, might be worth considering a rename to avoid the confusion.
raskrebs 3 hours ago||
Someone else added an issue about this, and i replied explaining how to run the feature branch, have a look and please add any ideas to the issue:

https://github.com/RasKrebs/sonar/issues/15

raskrebs 5 hours ago||
[dead]
fcoury 3 hours ago||
We live in crazy times. I wanted to add a PID to the list for my personal use and since I use Rust way more than Go, I decided to one-shot one app, and Codex indeed one shotted it, wow.

https://github.com/fcoury/sonars

zenoprax 1 hour ago||
I'm tempted to one-shot this into a series of FISH abbreviations.

And I would want someone to use that to one-shot a python implementation. And on and on like a game of telephone until the context degrades so far that it becomes an entirely different program.

raskrebs 3 hours ago||
You can add PID with the c-flag, e.g.

sonar list -c port,process,pid,type,url,container

or just show all columns:

sonar list --all-columns

But yeah, it's quite cool. I believe the future lies in software distillation, so cool to see it happen on my own project :D

fcoury 2 hours ago||
I did this more as an experiment but man it sucks, doesn't it?
raskrebs 1 hour ago||
What sucks? Software distillation? :)
raskrebs 9 hours ago||
I always have a bunch of local projects running, particularly during the weekend where I'm rarely working on one thing at a time. A big pain of mine was constantly running into port: Redis from one project blocking another, orphaned dev servers from old worktrees, Docker containers I forgot about. The usual fix is lsof -iTCP | grep ..., then figuring out what the PID actually is, then killing it. But I always forget the command, and it doesn’t really include all the information that I like.

So I built this lightweight CLI. Single binary, no dependencies. It shows everything listening on localhost with process names, Docker container info, clickable URLs etc.

Sure there are workarounds, but none that satisfied my need for a short, easily rememberable command. Also nothing really has the same satisfaction as running sonar kill 3000 — it just feels nice. I’ve already been approached by a few agent orchestration tools that have been struggling with the same thing. It's really useful when you have multiple agents running, but it's not built for just that use case, I have also find it handy when killing off all containers after a failed cleanup and so on. Also know that MCPs are dead and CLIs are the new thing in agentic coding, this might be a useful tool for Claude, particularly when a compose process exits before all containers are stopped.

Open for contributions, ideas and feedback.

embedding-shape 7 hours ago||
> I’ve already been approached by a few agent orchestration tools that have been struggling with the same thing

Wow, this says more about the agent orchestration tool ecosystem than what you might think, that they're unable to kill child processes they themselves spawn makes it seem like they have zero clue about what they're doing.

Probably why my impression always end up with "Wow, what a vibe-coded mess" when I look through the source of all these harnesses, they don't seem engineered at all.

pluc 7 hours ago||
Have a look at Evan Hahn's murder util: https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d...
0cf8612b2e1e 2 hours ago|||
Sold on the name alone. It also has the API I never realized I needed

  puts 'usage:'
  puts 'murder 123    # kill by pid'
  puts 'murder ruby   # kill by process name'
  puts 'murder :3000  # kill by port'
raskrebs 7 hours ago|||
Will check it out
clutchski 6 hours ago||
Mine is called “porthole”

https://github.com/clutchski/dotfiles/blob/main/home/bin/por...

Brainspackle 4 hours ago||
you picked a unique name. There is already a massively popular product called Sonar
raskrebs 5 hours ago||
Any features you are missing or ideas for the use case?
pdimitar 6 hours ago||
I am absolutely installing this and starting to use it daily!

For the even less patient there's also this (not mine): https://github.com/jkfran/killport

raskrebs 5 hours ago|
Glad to hear! Please join the party and post any issues you have.
RonanSoleste 4 hours ago||
I just have an alias in my .bashrc :)
raskrebs 3 hours ago|
Try and have a look at the readme, this adds a bit more functionality. Maybe some if it you'll find useful :)

Started with the same, but found my self wanting a bit more, so just built it

RonanSoleste 3 hours ago||
Can it do things that existing tools build into my distro cannot? It looks to me like a convenience tool. Which is fine, but i see no need for it myself
raskrebs 3 hours ago||
Probably not, that's what makes it so lean (it doesn't really pull in anything).

Although i have a feature branch with a tray app (for macos) that let's you monitor and track any process (will send notifications when one goes up or down). But it's just gimmicks i felt i needed to make life a bit easier when working with compose and across worktrees

Barbing 1 hour ago||
That monitor sounds interesting; I manually set something up in Keyboard Maestro to notify me that something quit and potentially re-launch it.
raskrebs 1 hour ago||
Have a look at this issue, and the picture i posted. Their is an explanation on how to test it out locally if you wish too

https://github.com/raskrebs/sonar/issues/15

chwzr 6 hours ago|
i have this in my .zshrc which provides same functionality:

  lk() {
    if [ $# -eq 0 ]; then
        local output=$(sudo lsof -iTCP -sTCP:LISTEN -n -P)
    elif [ $# -eq 1 ]; then
        local output=$(sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -i --color=always $1)
    else
        echo "find and kill processes listening on ports. Usage: lk [pattern]"
        return 1
    fi

    if [ -z "$output" ]; then
        echo "No listening processes found."
        return 0
    fi

    # Show header + results
    echo "$(sudo lsof -iTCP -sTCP:LISTEN -n -P | head -1)"
    echo "$output"
    echo ""

    # Extract unique PIDs (skip the header row if no grep was applied)
    local pids=($(echo "$output" | awk '{print $2}' | grep -E '^[0-9]+$' | sort -u))

    if [ ${#pids[@]} -eq 0 ]; then
        echo "No PIDs found."
        return 0
    fi

    echo "PIDs to kill: ${pids[*]}"
    echo -n "Kill these ${#pids[@]} process(es)? [y/N] "
    read -r confirm

    if [[ "$confirm" =~ ^[Yy]$ ]]; then
        for pid in "${pids[@]}"; do
            echo "Killing PID $pid..."
            sudo kill -9 $pid
        done
        echo "Done."
    else
        echo "Aborted."
    fi
  }
raskrebs 5 hours ago|
I have added quite a lot of functionality beyond listing and killing ports. Please check out the readme, it may convince you to try it out.
fionic 5 hours ago||
Its funny bc the title suggests a tool for listing and killing
tomcatfish 4 hours ago|||
HN is a place where people can be expected to go beyond the title (though I like the limited script and am glad it was posted). Misleading titles are not uncommonly flagged and changed, even.
raskrebs 5 hours ago|||
True, it was what it started as, but grew as i found my self missing features. Got a few users and now i don't want to update the name. Also easy and quick to write in the terminal
bartek_gdn 5 hours ago||
Why not grep the output to abother tool?
More comments...