Extension submission: Bitwarden v0.2.0#263
Conversation
|
Hey, I've also submitted a pr with bitwarden extension: #258 But I built it around rbw because bw is kinda stateless and requires deciphering of the vault every time, on my vault it's roughly 4 seconds every time. |
v0.1.1 ChangelogChanged
Added
Fixed
|
Hey! Apologies for the duplicate effort, been chipping away at this for a couple of weeks and didn't check the other PRs before submitting. I was just hitting the CLI every launch too, and yeah, it was slow! Two things got it fast. First, the item list is cached in LocalStorage with a 24h TTL so the list renders instantly after the first sync (updated in background so fresh). Sensitive fields are stripped before caching, no passwords on disk. When you open details I fetch the full item fresh via bw get item. Second, the session token is stored in the system keychain via libsecret, so once unlocked you skip the unlock form across Vicinae restarts as long as the session hasn't expired. Net result: the decryption delay only hits on the first unlock after a session expires. Day to day it's snappy. |
|
@edmogeor nice! But you don't cache passwords, right? It was my fear to accidentally cache TOTP key/pass/something else protected, so I had to anyways decrypt before reading an actual password |
I did work on this last night inspired by your message 😂 I'm stripping the sensitive data before saving the list but storing which fields they have, and then calling bw get item on copy / view details to avoid any sensitive data being saved to disk. |
|
I hope you'll have an "authenticator" too - to open the full list of items with top, where they will autoupdate the codes :) |
|
Bitwarden v0.1.2 Added
Fixed
Changed
|
v0.1.3 changelogAdded
Fixed
Changed
|
932f1cd to
fca41e9
Compare
|
Hey, following my paranoia, I decided to read the code of your app and I have several ideas:
const enc = spawn('bw', ['encode'], { stdio: ['pipe', 'pipe', 'ignore'] });
enc.stdin.end(json);
const encoded = await collectStdout(enc);
const create = spawn('bw', ['create', 'item'], {
stdio: ['pipe', 'ignore', 'pipe'],
env: sessionEnv(session),
});
create.stdin.end(encoded);
await waitExit(create);but I'm not a node expert, so it might be I don't understand something. The good thing here is no one can "just read" from an anonymous pipe
|
Thanks for the feedback, I'll make sure to review and fix these oversights next week. |
|
Also, may I ask about a couple of feature requests?
|
[0.2.0] - 2026-05-11Added
Fixed
Changed
|
Hey, thanks for reviewing the code, every one of these was spot-on. Here's how I've addressed them in v0.2.0:
R.E. the features you've requested, the extension now supports file attachments and a seperate command that allows searching through accounts that just have TOTP enabled (with the code and countdown visible from the list view itself for quick access). Not ruling out sends support, it feels slightly out of scope to me and perhaps less useful to have in vicinae. Let me investigate - i didn't want to include in this update as it would require more UX consideration. Did you support it in your extension? if so how did you manage the flow in the UI? Really appreciate the thorough review! |
|
Thank you for all the work you do! No, I didn't support them in my extension because rbw doesn't support them. But the original raycast extension supports them! |
Release v0.1.0
Initial release.
Added