Hana Desktop banner

Hana Desktop

6 devlogs
42h 51m 19s

A feature-rich open-source SSH client for Windows, Mac, and Linux built with design in mind.

This project uses AI

Used Copilot for completion and agent acceleration of tedious tasks. Additionally, used Perplexity for research and brainstorming.

Demo Repository

Loading README...

mcjk

It’s been a while since my last update — school was brutal leading up to winter break, so Hana had to wait. Now I’m deep into week two of the break and made massive changes.

Hosts work. State management with Svelte is genuinely a joy, and the host flow is nearly polished. There are still some minor desyncs (create a KeyStore identity, and you need to restart before the frontend catches up), plus some off sizing on UI elements — easy fixes I’ve been pushing off in favor of bigger features.

The KeyStore is live on both frontend and backend. You can view vault keys and saved identities, generate fresh SSH keys, or import your own.

Theme system is cooked. It supports easy theme composition and deep link importing via hanassh://import-theme?url=<>. Hana fetches the JSON, validates it, drops into a preview mode with a bottom popup, and lets you use the theme without saving it. When you’re ready, save or discard. A theme marketplace is already technically possible.

The app is now functional for simple SSH workflows. SFTP, more customisation, and a pile of bug fixes are still ahead before a stable release.

Bundle size landed at ~37 MB, trimmed to 35 MB by swapping the bundled SQLite for the system instance. Goal is sub-25 MB closer to launch.

Background memory usage sits at 5–6 MB with all windows closed — just the Rust backend humming, ready for future sync and notification features.

One feature I’m genuinely proud of: Mac Home/End key bindings. Magic Keyboards skip those keys entirely, and the usual ⌘+arrow shortcuts break in terminals. Hana now has a toggle (on by default on macOS) that maps them to proper terminal keystrokes. Haven’t seen this anywhere else.

Demo below of me creating a vault, adding an identity and host, connecting to my Mac, and running fastfetch.

Attachment
Attachment
Attachment
1

Comments

maverickroneal
maverickroneal 21 days ago

this is cool

mcjk

I’ve recently been working on refactoring broken, suboptimal code, reinventing features in some areas and adding backbones for major features.

I decided to reinvent the way Hana handles vault unlocking. Instead of each vault having a master password that has to be known by all collaborators and have a key derived from it each time, I designed KeyStore which is a local file, encrypted with a key generated on first launch. KeyStore (as the name suggests :D) stores keys to vaults, by default no passwords are needed. If a user was to use Cloud Sync to sync their KeyStore across different devices, then they would have to use a password once per device (it’s saved afterwards) to enable sync, although sync is only planned for near future and KeyStore is not fully implemented either.

While implementing KeyStore I started expanding my vision for different prompts for the user. Instead of showing a pop-up, I wanted to create a Notifications menu in the app. I’ve placed the menu in the bottom-left corner, and it will show a blue badge whenever unread notifications are waiting. This is where I will show the alert for when any action is needed or an error has occured (like decryption error, missing keys, auth required, or even update information).

Migrating from the old vault password system to KeyStore was the hardest part as it required the most changes in various places across the codebase. Derivating the key from the vault master password used to be our biggest performance worry, as both PBKDF2 and Argon2id (to which we moved later) can be very slow. Now no derivation needs to happen, or in the most pessimistic case just one (when syncing with the cloud for the first time).

I gotta admit, the app is gradually looking better, but still lacks the most basic features you wouldn’t even realise exist in most apps. I am looking forward to further updates and I can’t wait to start implementing the core, important features.

1

Comments

chefpenguino
chefpenguino about 2 months ago

ui looks cool, i like the animation upon opening notifications

mcjk

The project folder on my PC turned out to have the old repo name as its own. That’s why it wasn’t logging hours from Windows (I also later worked on the same PC on Linux, but have since used Windows). Today I hopped on to Flavortown and realised the timer is still at 46 minutes.

Nevertheless, I’ve made massive progress. I finally implemented local and cloud vaults fully, you can open them (and so far, only that) but it works flawlessly, asks you for a password when you open a vault, and whether you’d like to save it in the system keyring. I need to optimise it, as reading and loading a vault (because of the encryption and the fact that it’s all in SQLite) takes around 3–5 seconds so I could do that in background instead of when the user selects a vault manually from the menu.

I also continued to implement more UI, some of which was for the AI agent we’re going to have in the client. It will support Hana Cloud and bring-your-own-key for OpenAI-compatible APIs. The coolest change in UI so far among improved animations and many bug fixes is rebranding the SidePanel to SideMenu, now it’s pinnable and resizable, you can pin it which then makes it look like a split-screen tab. The AI chat is also located in the SideMenu, I also removed the old, not-working pages of the SideMenu and I will remake that part later.

Attachment
0
mcjk

I’ve been improving UX and squashing bugs since the last Dev Log. The client is much more stable especially on Linux (where WebKitGTK caused performance problems with transform and filter transitions in CSS, so I had to cut some out for Linux users, I might fix that later though).

I fixed multiple bugs, started implementing the backend behind more vault features and fixed the authentication flow bug where previously not logging in would bring the user back to onboarding forcefully, now the onboarding appears only once and the user can optionally log in later in the account menu on the side panel.

I slowly started adding documentation and tried resolving the Snap issue, but didn’t manage to come up with a solution yet.

I also made the app work in the background, which I’ll include a little screenshot of, closing the window will de-render the UI, vastly reducing resource usage (as the Rust backend itself is very efficient and so far, doesn’t do much in the background too so…). I need to use a better icon for it but it works.

Naturally, I also cleaned up the codebase a lot so it’s easier to work on later.

Attachment
0
mcjk

For the past few days I’ve eliminated countless bugs, updated and unified code structure, and implemented features.

I’ve started implementing credential vaults, and you can currently see a list of vaults stored in the cloud and locally. I tried preparing for Snap Store distribution, but I’m stuck with a bug breaking WebKitGTK, it seems; the UI just doesn’t render. I’ll fix that later, though.

I made the app compile for Linux, which was rather easy; I just had to add a new icon format to the Tauri config and a bunch of lines in lib.rs, which would set the window up.

There’s also a bunch of QoL changes I’ve made, like fixed and unified casing (camelCase was present in some areas; now I’ve transitioned everything to snake_case on the Rust side and camelCase on the JS side). I also unified the way to look for configuration environment variables—created a macro that checks for a runtime variable and uses a build-time variable if not found.

The auth now works as it should; it’s optional and handles the session correctly.

And finally, I’ve implemented credential vaults in a very clean and expandable way; you can now see your cloud and local vaults in a list. I just have to implement opening the vaults (which also requires an encryption password, so a keyring integration, which would store the password securely so the user doesn’t have to input it every time).

So far I can barely share any concrete results of my work, as I’ve mostly worked on fixing the backend and I’m far from an MVP; however, I’ll soon have a usable early version of the app. I will also try to make more frequent devlogs now, as 7 hours is quite a lot of time.

If you’re curious about the exact changes I’ve made, you can see the big commit here: https://github.com/hana-ssh/hana-desktop/commit/8d7fa816c1ae92b49e5ab2ad6c28044df14e75cf

Attachment
Attachment
0
mcjk

My Hana SSH client is amazing!

Attachment
0