Software

I am a researcher who also ships software. These are tools I designed, wrote and published myself, each built for a specific kind of user, most with the code open to read. Research results are on the research page.

Language model · bioelectricity

For
Researchers in cell and tissue bioelectricity
Model
10-layer GPT, 40.5M parameters, written from scratch
Corpus
3.2M PubMed abstracts, 0.99B training tokens
Referee
BETSE bioelectric tissue simulator
Status
Public, with a live demo

CellBio-GPT

A small language model for cell and tissue bioelectricity, with a physics simulator as the referee.

Pipeline diagram: PubMed abstracts feed a tokenizer, a 40M transformer, pretraining, SFT and DPO, then GRPO whose reward comes from the BETSE simulator, then evaluation, a library reader and a live demo.
The pipeline, every stage written from scratch. The loop at the bottom right is the point: the model’s prediction goes to the simulator, and the simulator’s answer is the reward.

Language models trained on papers learn how papers sound. In biology nothing usually tells the model when a number it wrote is wrong. Bioelectricity is an exception, because the membrane physics can be simulated: BETSE takes ion concentrations and channel permeabilities and returns the voltage of every cell in a tissue.

The simulator is used twice. It scores the model’s numeric predictions, so the model is trained against physics rather than against someone’s opinion of its answers, and it writes the exams, so it is possible to ask whether the model learned anything beyond its training points. Facts are not memorised: they live in a full-text library of 3.2 million PubMed abstracts that the model quotes with PMIDs.

Every stage of the pipeline is written for the project in plain PyTorch on one GPU: a BPE tokenizer, a 40.5M-parameter GPT, pretraining, SFT, preference optimisation, and reinforcement learning with the simulator as verifier. The final exams were sealed: the repository holds only their hashes, committed before any model saw them, and the analysis plan.

Two bar charts of held-out reward. Exam A, on a lattice holdout: the lattice-trained 40M model scores 0.945. Exam B, off-grid and sealed: the lattice-trained model drops to 0.539, a random-trained model reaches 0.777, and random-trained with five worked examples reaches 0.835.
Exam design decides what a score means. Trained on a lattice of simulator settings, the model does well on held-out lattice points and falls below a constant guess off the lattice; training on random points, with five worked examples in the prompt, recovers it.

iPhone and iPad app · Swift

For
Retail traders in US markets
Stack
Swift · SwiftUI Canvas · App Attest · iOS 17+
Market
US equities, crypto, futures
Source
Public, all rights reserved

BunnyQuant for iPhone and iPad

A native client for the BunnyQuant analytics service: a watchlist, candlestick charts, and a risk card.

  • The BunnyQuant watchlist: Nasdaq 100, S&P 500, Bitcoin, Ethereum, Apple, NVIDIA, Tesla and Microsoft, each with a price, the day’s change and a leaning-up, leaning-down or steady label. Watchlist: one line per symbol, with a plain-language lean.
  • A Nasdaq 100 daily candlestick chart with dashed entry, stop-loss and two take-profit lines, a price-levels table and a movement-and-risk card. Candlesticks drawn natively, with entry, stop and targets over the price.
  • The key price levels table with reward-to-risk, the movement-and-risk bars, and a quick read with confidence. The numbers as a table, then as bars: typical move, risk to stop, target.
  • A Bitcoin daily candlestick chart with the same levels and cards. The same screen on a different market: Bitcoin.
Candles are real public price data. The entry, stop and target levels in these screenshots are illustrative, calculated simply for the picture; they are not output from the live service, which a simulator cannot register with.

Written in plain Swift and SwiftUI, with no third-party libraries and no web views. The candlestick charts are drawn directly with SwiftUI Canvas. For each symbol it shows entry, stop-loss and take-profit levels alongside a movement-and-risk card.

It is free, and every install gets its own anonymous account, verified with Apple App Attest rather than a sign-up form. Results are kept on the device until the bar closes, so reopening the app does not spend an allowance.

The analysis itself runs on private servers and is not part of the repository; the source is published for reading only.

iPhone and iPad app · Swift

For
Retail traders in Vietnam, in Vietnamese
Stack
Swift · SwiftUI Canvas · App Attest
Market
Vietnam, VN30
Status
On the App Store since 6 November 2026
Source
Public, all rights reserved

BunnyQuantVN

The sister app for the Vietnamese market, in Vietnamese: the VN30 list, candlesticks, entry, stop-loss and take-profit.

  • The BunnyQuantVN watchlist in Vietnamese: Vietcombank, FPT, Hòa Phát, Vinamilk, Thế Giới Di Động, ACB, Vingroup and SSI, with prices in thousand dong and a lean label. Watchlist in Vietnamese, seeded with VN30 tickers.
  • An FPT daily candlestick chart with entry, stop-loss and take-profit lines and a table of price levels, in Vietnamese. Candlesticks with Vào (entry), Cắt lỗ (stop-loss) and Chốt lời (take-profit).
  • The movement-and-risk bars and a quick read in Vietnamese, including a note that T+2 settlement means a stop has to be planned ahead. A quick read that knows the local rule: T+2 settlement, so stops need planning ahead.
  • A Hòa Phát daily candlestick chart with the same levels and cards, in Vietnamese. The same screen for another ticker: Hòa Phát.
Nến là giá thật từ nguồn công khai. Các mức vào, cắt lỗ, chốt lời trong ảnh chỉ để minh hoạ, tính đơn giản cho bức hình, không phải kết quả từ máy chủ thật. (Candles are real public price data; the levels shown are illustrative.)

Same native Swift approach as the US app, pointed at a Vietnamese backend, with its own interface language, logo and colours. A watchlist is seeded with VN30 tickers on first launch, and each ticker opens to a candlestick chart with entry, stop-loss and take-profit levels and a movement-and-risk card.

Free, with an anonymous per-install account verified by Apple App Attest. As with the US app, the analysis is server-side and not in the repository.

iPhone app · Swift

For
Anyone whose iPhone is full but who does not want to lose photos
Stack
Swift · SwiftUI · PhotoKit · Vision · on-device language model
Status
On the App Store since 5 November 2026 · free · English and Vietnamese
Source
Private

PhotoNest

Frees space on a full iPhone by shrinking photos and videos on the phone itself, instead of deleting them or uploading them anywhere.

  • Two PhotoNest overview screens side by side: the library at 693.8 MB before compressing 110 photos and videos, and 107.5 MB after, with dates, locations and albums kept. Before and after compressing 110 items: 586 MB back, dates, places and albums kept.
  • The PhotoNest overview: library size split into videos, screenshots and photos, a Shrink, don’t delete topic, similar shots and copies, and storage by year. Overview: what fills the phone, by kind and by year.
  • The Compress sheet: 14 videos and 96 photos estimated to go from 685.8 MB to about 82.8 MB, with video resolution, quality, maximum photo size and a switch to delete the originals afterwards. Compress: choose video resolution and photo size, see the saving first.
  • The assistant answering “Largest videos this year” with 14 videos totalling 542.5 MB and their thumbnails. Ask in plain words; the assistant runs on Apple’s on-device model.

Most cleaners delete. PhotoNest re-encodes videos (480p to 1080p) and photos (chosen size and quality) on the phone, keeping the original date, location, favourite status and albums. Space comes back only when the originals are removed, and the user confirms that step; removed items stay in Recently Deleted for 30 days.

It also finds similar shots and bursts, copies of the same photo saved several times, old screenshots and heavy videos. A plain-language assistant (“screenshots before June”) uses Apple’s on-device model on iPhone 15 Pro and later. Everything runs on the phone: no servers, no account, no ads, no tracking.