Espial bookmarking server

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 :slight_smile: )

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