Introducing Obskurnee: A Companion for your Book Club

Introducing Obskurnee: A Companion for your Book Club

Do you have a book club? Are you looking for an app that would let you vote for the next book you're going to read? Would you like some Goodreads integration? Then Obskurnee might be for you.

Obskurnee is a simple, user-friendly web app that will help you decide on your book club's next read. It will also let you add book recommendations when you've read something you Just Have To Tell Everyone About. You can review the books your book club has read and share the ones you're currently reading (via Goodreads). But not much else. We've kept the feature set small by design - we wanted to implement the workflow we use, not cover every possible use-case.

Our aim was to make the app user-friendly and intuitive to use.

ℹ Keep in mind: there is no 'central service' where you could register and just start using the app, at least not for now. You have to run the web app yourself. If you just want to check it out, have a look at the demo. Simply log in with any made-up email address and password.
ℹ Some features you might expect from an app are still missing. Since our free time is limited, we made a polished MVP we were able to start using straight away; we expect to be adding more in the future, but it might take a while.

Available in English and Slovak. If you want to chat, feel free to join Obskurnee's Matrix chat room at #obskurnee:zble.sk. Source code here.

Features and screenshots

The way Obskurnee works is simple: When your book club is ready for a new book, a moderator opens a new voting round. All members can add any number of suggestions. Once a moderator closes the round, a poll is automatically generated. When all members have voted, the poll is evaluated and the chosen book is featured on the home page.

Home page

Aside from the current book, the home page features a global notice board (empty and thus hidden on this screenshot), and ongoing activities, such as voting.

Home page

All books

A shelf for all the books you've read together. Users can rate and review any of these books.

All books

Voting rounds

Voting rounds offer two options: either a direct vote for books or the choice of a round with specific topics.

Voting rounds

The topic option entails a vote in two stages. First, the members suggest book topics (such as a particular genre, year of publication, nationality of author etc.), and once the winning theme is selected, a new round for books related to this theme is automatically opened.

The easiest way to add a book is to copy and paste a Goodreads URL and wait for it to be scraped, with the option to add further comments. All large text fields support Markdown. Everything you'd expect from MD should be there; plus, you can use ::this:: to mark a spoiler.

Adding a book

Adding a book

Recommendations work in the same way as the books suggested for voting, except they're not tied to a specific round. Use these as general recommendations for other members of the book club.

Only moderators can add new users (though this is disabled in the demo). Once logged in, new users are prompted to fill out their profiles - especially their Goodreads profile (which is also used to load their "Currently Reading" shelf), phone number (since we mainly communicate over Whatsapp), and a brief bio about themselves and/or their reading preferences. Each user's page also shows their reviews and recommendations.

Integrations

  • Goodreads. Since Amazon is trying to keep its stranglehold on bookish communities, they've removed the Goodreads API, forcing us to resort to scraping. It works, but it might break easily in the future if they decide to fiddle around with the layouts.
    Supported integrations: Loading the book data from a url when writing a suggestion or recommendation and displaying a member's "Currently reading" shelf if they have provided the GR link in their profile.
  • Mailgun is used to send e-mails. No other API is supported at the moment. Mailgun's free tier lets you send thousands of mails per month, so hopefully, it won't be a problem.
  • A Matrix chatroom for the book club can be specified.

Newsletters

There are two categories of newsletters:

  • One for the basic events, which notifies users when new voting rounds are opened or closed. Every user is subscribed to this by default.
  • Another one that notifies on every event - e.g., when someone adds a new recommendation or suggestion.

If a Matrix chatroom is specified in config, all of the events sent via mail are also sent to the chatroom. A few (noisier) kinds of notifications, like new users joining the book club or Goodreads feed activity are only sent to the Matrix, and not via mail.

Try the demo

Enter any email and password.

Setup and tech info

Quickstart

To try it out, run docker run -p 8080:8080 -e DefaultCulture=en zblesk/obskurnee.

Then navigate to http://localhost:8080/setup and create the first user.

Docker-compose

The above doesn't persist your data, so while good for giving Obskurnee a try, don't run it in prod like that.

A minimal setup with persistence and mailing via Mailgun looks like this:

version: "3"

services:
  obskurnee:
    image: zblesk/obskurnee:latest
    restart: unless-stopped
    ports:
      - 8080:8080
    volumes:
      - ./data:/obskurnee/data
    environment:
      - SiteName=Book club!
      - BaseUrl=https://obskurnee.mydomain.com
      - DefaultCulture=en
      - SymmetricSecurityKey=87965trfvbh86somebigrandomsecuritykeyhere
      - MailerType=mailgun
      - Mailgun__EndpointUri=https://api.mailgun.net/v3/
      - Mailgun__SenderEmail=Bookclub <bookclub@mydomain.com>
      - Mailgun__SenderDomainName=mydomain.com
      - Mailgun__ApiKey=key-super1337secret

Save it as docker-compose.yml and start with docker-compose up.

Then navigate to http://localhost:8080/setup and create the first user.

More complete setup and config in a later post.
Update: here is the post.

Development

You will need .NET 5.0 and Node (we run on 14.x).

  1. Clone repo
  2. cd .\Obskurnee\ClientApp\
  3. npm install
  4. cd ..
  5. dotnet run

That should let you access your local copy at http://localhost:5000.

Enjoy!