Adwin Chee
I'm a full-stack engineer. I write Rust for a small Linux device on my desk, TypeScript and C# for the web, and Kotlin and Swift for mobile, and I'm happy anywhere between the database and the screen.
Final year software engineering in Malaysia, currently shipping .NET and mobile work at SeeSharp Solutions.

Selected work
03 projectsAll projectsExhibit 01 / 03
desk-companion
Plugins run in a sandbox and never hold key material.
- Discipline
- Systems and device
- Built with
- Rust, Slint, JavaScript
- Year
- 2026
- Status
- Active
Desk Companion--:--Slot 1No plugin loaded
Drop a manifest and two files into plugins/ to fill it
BeaconBeat 1284
every 2s
EchoStalebeat 1283
4 min ago
Host readout0 · 0
pointer, in a 0×0 viewport
Exhibit 02 / 03
Zero Trust Architecture
Keys are derived in the browser, so the server never receives one.
- Discipline
- Web
- Built with
- TypeScript, React, Vue
- Year
- 2025
1 · Type a passphrase
Anything at all. It is not stored or sent anywhere. Watch what the browser builds from it, and watch the other column stay empty.
In this browser
- Saltnot derived yet
- PBKDF2not derived yet
- Derived keynot derived yet
- RSA-OAEP keypairnot derived yet
- RSA-PSS keypairnot derived yet
Sent to the server
Nothing. Not the passphrase, not a hash of it, not the key.
Which is also why a forgotten passphrase is unrecoverable here. There is no one else to ask.
2 · Move the trust score
Trust is a number, not a yes or no. Every request is scored against a threshold of its own, so the same action flips as this number moves.
40/ 100
3 · Attempt something
Derive the keys first. Type a passphrase above.
- needs 20 · low riskallowed now
- needs 40 · medium riskallowed now
- needs 60 · high riskneeds step-up
- needs 85 · severe riskneeds step-up
- no threshold grants this · impossible risknever
No request attempted yet.
4 · What the server holds, right now
- Ciphertext blobs3
- Saltpublic
- Encryption public keynone yet
- Signing public keynone yet
- Encryption private keynever uploaded
- Signing private keynever uploaded
- Derived keynever transmitted
- Passphrasenever transmitted
- Plaintext bytes seen0
Requests it saw
Nothing yet.
Every row above is either ciphertext or a public key. Own this server completely and that is still all you get.
Exhibit 03 / 03
neobank
A payment request is a claim the recipient settles, not a transfer the sender pushes.
- Discipline
- Web and mobile
- Built with
- TypeScript, React, Express
- Year
- 2025
Requestrecipient's viewNadia asks you for
RM 48.00
Dinner, Thursday
Pending your decision
The request is a claim. Until you settle it, no money has moved and nothing needs reversing; declining costs the sender a decline, not a refund.
The lab
The interfaces from these projects, rebuilt so they run in your browser. Nothing is a recording and nothing talks to a server.
Open the lab- EXP-01The desk screenThe Raspberry Pi's 800 by 480 interface, with a ticking clock.desk-companion
- EXP-02The serial linkWatch the host and the Pi negotiate, talk, and recover from a pulled cable.desk-companion
- EXP-03Deriving the keyType a passphrase and watch what the server never receives.Zero Trust Architecture
- EXP-04Requesting moneySettle or decline a payment request from the recipient's side.neobank
In industry
Software Engineering Intern, SeeSharp Solutions
April 2026 – present
Three streams of production work in three different stacks: a desktop and .NET test-automation platform, a multi-tenant web product, and native Android and iOS clients. Client and product names are under NDA. The responsibilities are not.
Systems
Test-automation platform
- Desktop client over a .NET service, with browser and load-test runner lanes
- Containerised CI execution for test runs
- Credential storage in the OS keychain, and per-environment base-URL resolution
- API-key authentication and rate limiting on the service
- A large integration suite kept green
C# · .NET · Electron · Playwright · Docker
Web
Multi-tenant messaging platform
- Campaign delivery with per-recipient template variables and quota enforcement
- Signed webhooks and automation triggers
- Billing, plan management and tenant onboarding
- The public marketing site
C# · ABP / DDD · Next.js · TypeScript · Postgres
Mobile
Native client delivery
- Feature work across native Android and iOS clients
- The TypeScript and Java services behind them
Kotlin · Swift · TypeScript · Java
What I work in
Systems
- Rustdesk-companion, five crates
- C#test-automation and messaging platforms
- .NETboth production services
- C++systems coursework
- Dockercontainerised CI execution
Web
- TypeScriptfile storage, neobank, messaging front end
- Reactfile storage, neobank
- Vuefile storage
- Next.jsmarketing site, this page
- Expressfile storage and neobank servers
- FastAPIPython services
- Postgresproduction schemas
Mobile and device
- Kotlinnative Android client
- Swiftnative iOS client
- Javabackend services, coursework
- Slintthe Pi screen, cross-compiled
- WebCryptofile storage key derivation
- Playwrightbrowser runner lanes
Tell me what you're building.
A web app, a phone app, or something with a screen and a wire hanging out of it, I'd like to hear about it. I'm in Malaysia, so if you write over lunch, the reply may land with your morning coffee.
adwin.hansen@gmail.com