I’d like to share my self-hosted bookmarking server written in Haskell & Typescript, backed by SQLite (in the spirit of Pinboard).
Repo: https://github.com/jonschoning/espial
Demo: https://espdemo.ae8.org/u:demo
(username: demo, password: demo)
The Haskell ecosystem has held up well over the years for it; Yesod and Persistent have been stable foundations.
I hadn’t improved it much until recently, filling out some feature gaps (i18n, bulk editing, archive backends).
That said, bookmarking and personal information management is a fairly saturated space with a full array of existing options. People’s preferences are also highly individualized, and have different levels of trust with foreign code.
So that taken, I view this project more as, ‘here’s a thing I use that I’ll make available to others, most likely they’ll use their existing workflows customized to their own needs, and that’s OK too’.
13 Likes
Can I group bookmarks and add tags/notes?
I use qutebrowser and while it has bookmark functionality, there is no folders/grouping.
‘grouping’ is done by tagging, effectively, yes. Tags are the mechanism for correlation, so you can “group” like bookmarks by including a shared tag on each of them. Clicking on one of it’s tags filters the view by those that share it. Also, a bookmark has an extended ‘description’ field for extra notes (markdown).
It’s a flat tagging system with no intrinsic hierarchy; one could try to emulate hierarchy with some clever tag naming and ‘contains’ searches on tags, but not something I’ve tried much.
The other thing I’m missing is that I often want to bookmark all tabs of a current window. So the bookmark functionality should be able to somehow accept multiple URLs, which I then can conveniently assign the same tags to.
Alternatively… if the server accepts POST requests to add bookmarks, I could easily do that to iterate over my current tabs and send a request for each of them.
The UI only adds one bookmark at a time, but yes there’s an api/add JSON endpoint for adding bookmarks programmatically (I use it for the android app) that takes an ApiKey (generated on the settings page) e.g. Authorization: ApiKey $espialApiKey and body has all the BookmarkForm props url, title, description, toread etc
1 Like
This brings back memories, I contributed the API key auth functionality back in the day. Glad to see that the project is still active! Though I must admit the transition from PureScript to TypeScript made me a bit sad. What was the reason(s) for the transition?
Thanks again for the high-quality contributions! It’s certainly been a while (I’m at 95K bookmarks now
)
PureScript is a great language and was very reliable. I was also reluctant to let it go.
Many of it’s projects appear to be actively maintained, but it’s still a small ecosystem with varying support.
Working with typescript & react hooks recently, perhaps I could’ve split the difference and used react from purescript, but I also separately wanted a reason to keep my typescript skills up-to-date.
2 Likes
Very cool. Pinboard is one of the few online things I pay for. I’m up to almost 10,000 bookmarks. I’ll read them all when I retire. Thanks for this.
3 Likes