microblog.pub fork with new design and some customizations for running the new Nikisoft.one blog. https://blog.nikisoft.one

nipos aabd1b4608 Add cookie.css 2 weeks ago
config 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
poussetaches @ f19e0f4a36 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
static aabd1b4608 Add cookie.css 2 weeks ago
templates 312033b0b2 Add cookie banner,fix some file path,switch to relative paths 2 weeks ago
tests 2655aa8fa5 Reformat the files with black 2 months ago
utils be7648c9ed Question/poll support 2 months ago
.env eaf947fc3c Tweak docker-compose to allow starting multiple instances 1 year ago
.gitignore 43e113e420 Initial import 1 year ago
.gitmodules 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
.isort.cfg ea6be0ed8e Formatting 11 months ago
LICENSE 43e113e420 Initial import 1 year ago
Makefile 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
README.md 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
activitypub.py 669fec0c2b Fix replies handling 2 months ago
app.py 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
config.py 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
mkconfig.sh 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
mkservices.sh 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
poussetaches.py a25a8fb1e1 Fix formatting 2 months ago
requirements.txt 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago
setup.cfg 43e113e420 Initial import 1 year ago
start.sh 1810144255 Do all the initial changes for the Nikisoft blog 1 month ago

README.md

microblog.pub - Nikisoft edition

microblog.pub

A self-hosted, single-user, ActivityPub powered microblog.

Quite early state but already stable enough for hosting your blog

Features

  • Implements a basic ActivityPub server (with federation)
    • Compatible with Mastodon and others (Pleroma, Hubzilla...)
    • Also implements a remote follow compatible with Mastodon instances
  • Exposes your outbox as a basic microblog
  • Implements IndieAuth endpoints (authorization and token endpoint)
    • U2F support
    • You can use your ActivityPub identity to login to other websites/app
  • Comes with an admin UI with notifications and the stream of people you follow
  • Allows you to attach files to your notes
    • Privacy-aware image upload endpoint that strip EXIF meta data before storing the file
  • Microformats aware (exports h-feed, h-entry, h-cards, ...)
  • Exports RSS/Atom/JSON feeds
    • You stream/timeline is also available in an (authenticated) JSON feed
  • Comes with a tiny HTTP API to help posting new content and and read your inbox/notifications
  • Easy to "cache" (the external/public-facing microblog part)
    • With a good setup, cached content can be served most of the time
    • You can setup a "purge" hook to let you invalidate cache when the microblog was updated
  • Deployable with Docker (Docker compose for everything: dev, test and deployment)

ActivityPub

microblog.pub implements an ActivityPub server, it implements both the client to server API and the federated server to server API.

Activities are verified using HTTP Signatures or by fetching the content on the remote server directly.

Running your instance

Dependencies

Please make sure that you have the following software installed when starting the installation:

  • Python 3
  • Python 3 Virtualenv
  • Go
  • MongoDB

Installation

$ git clone https://notabug.org/nipos/nikisoftblog
$ cd nikisoftblog
$ make install
$ sudo make pt-install
$ make config
$ make password
$ sudo make services
$ sudo systemctl enable poussetaches
$ sudo systemctl start poussetaches
$ sudo systemctl enable microblog
$ sudo systemctl start microblog

Configuration

$ make password
Password: <enter a password; nothing will show on screen>
$2b$12$iW497g...

Edit config/me.yml to add the above-generated password, like so:

username: 'username'
name: 'Your Name'
icon_url: 'https://you-avatar-url'
domain: 'your-domain.tld'
summary: 'your summary'
https: true
pass: $2b$12$iW497g...

API

Your admin API key can be found at config/admin_api_key.key.

ActivityPub API

GET /

Returns the actor profile, with links to all the "standard" collections.

GET /tags/:tag

Special collection that reference notes with the given tag.

GET /stream

Special collection that returns the stream/inbox as displayed in the UI.

User API

The user API is used by the admin UI (and requires a CSRF token when used with a regular user session), but it can also be accessed with an API key.

All the examples are using HTTPie.

POST /api/note/delete{?id}

Deletes the given note id (the note must from the instance outbox).

Answers a 201 (Created) status code.

You can pass the id via JSON, form data or query argument.

Example

$ http POST https://microblog.pub/api/note/delete Authorization:'Bearer <token>' id=http://microblob.pub/outbox/<note_id>/activity

Response

{
    "activity": "https://microblog.pub/outbox/<delete_id>"
}

POST /api/note/pin{?id}

Adds the given note id (the note must from the instance outbox) to the featured collection (and pins it on the homepage).

Answers a 201 (Created) status code.

You can pass the id via JSON, form data or query argument.

Example

$ http POST https://microblog.pub/api/note/pin Authorization:'Bearer <token>' id=http://microblob.pub/outbox/<note_id>/activity

Response

{
    "pinned": true
}

POST /api/note/unpin{?id}

Removes the given note id (the note must from the instance outbox) from the featured collection (and un-pins it).

Answers a 201 (Created) status code.

You can pass the id via JSON, form data or query argument.

Example

$ http POST https://microblog.pub/api/note/unpin Authorization:'Bearer <token>' id=http://microblob.pub/outbox/<note_id>/activity

Response

{
    "pinned": false
}

POST /api/like{?id}

Likes the given activity.

Answers a 201 (Created) status code.

You can pass the id via JSON, form data or query argument.

Example

$ http POST https://microblog.pub/api/like Authorization:'Bearer <token>' id=http://activity-iri.tld

Response

{
    "activity": "https://microblog.pub/outbox/<like_id>"
}

POST /api/boost{?id}

Boosts/Announces the given activity.

Answers a 201 (Created) status code.

You can pass the id via JSON, form data or query argument.

Example

$ http POST https://microblog.pub/api/boost Authorization:'Bearer <token>' id=http://activity-iri.tld

Response

{
    "activity": "https://microblog.pub/outbox/<announce_id>"
}

POST /api/block{?actor}

Blocks the given actor, all activities from this actor will be dropped after that.

Answers a 201 (Created) status code.

You can pass the id via JSON, form data or query argument.

Example

$ http POST https://microblog.pub/api/block Authorization:'Bearer <token>' actor=http://actor-iri.tld/

Response

{
    "activity": "https://microblog.pub/outbox/<block_id>"
}

POST /api/follow{?actor}

Follows the given actor.

Answers a 201 (Created) status code.

You can pass the id via JSON, form data or query argument.

Example

$ http POST https://microblog.pub/api/follow Authorization:'Bearer <token>' actor=http://actor-iri.tld/

Response

{
    "activity": "https://microblog.pub/outbox/<follow_id>"
}

POST /api/new_note{?content,reply}

Creates a new note. reply is the IRI of the "replied" note if any.

Answers a 201 (Created) status code.

You can pass the content and reply via JSON, form data or query argument.

Example

$ http POST https://microblog.pub/api/new_note Authorization:'Bearer <token>' content=hello

Response

{
    "activity": "https://microblog.pub/outbox/<create_id>"
}

GET /api/stream

Example

$ http GET https://microblog.pub/api/stream Authorization:'Bearer <token>'

Response