I've written about a storage layer for sqlite before in my http://workdad.dev blog and had been using and improving it over time.
The result has been sqlflow, which at its core wraps sqlite transctions into Read() and Write() methods that takes care of the transaction life-cycle and avoids the most common issues with using sqlite concurrently (no SQLITE_BUSY errors for you anymore).
It pairs really nicely with https://sqlc.dev so if you use it, the query type it generates is compatible.
It also supports encryption and the multi-tenant pattern, where each user can get their own sqlite database file, both of which I use in http://trackm.net
For encryption I you can use the github.com/jgiannuzzi/go-sqlite3 fork to enable SQLCipher encrypted files.