No description
Find a file
2018-05-29 21:47:28 +02:00
config Initial import 2018-05-18 20:41:41 +02:00
data Add persistency to RabbitMQ via Docker 2018-05-21 13:00:17 +02:00
sass Initial import 2018-05-18 20:41:41 +02:00
static Fix the deploy build 2018-05-19 08:54:46 +02:00
templates Add theme color config item 2018-05-21 21:10:21 +02:00
tests Lot of cleanup 2018-05-29 21:36:05 +02:00
utils Lot of cleanup 2018-05-29 21:36:05 +02:00
.dockerignore Tests tests tests and bugfixes 2018-05-28 19:46:23 +02:00
.env Tweak docker-compose to allow starting multiple instances 2018-05-21 11:53:58 +02:00
.gitignore Initial import 2018-05-18 20:41:41 +02:00
.travis.yml Improve the tests, add a new debug endpoint 2018-05-27 11:50:09 +02:00
activitypub.py Fix type annotation and README 2018-05-29 21:47:28 +02:00
app.py Fix type annotation and README 2018-05-29 21:47:28 +02:00
config.py Improve the tests, add a new debug endpoint 2018-05-27 11:50:09 +02:00
dev-requirements.txt Fix dev requirements 2018-05-21 11:57:25 +02:00
docker-compose-dev.yml Fix flake8 warnings 2018-05-27 22:47:33 +02:00
docker-compose-tests.yml Tests tests tests and bugfixes 2018-05-28 19:46:23 +02:00
docker-compose.yml Fix docker-compose file 2018-05-28 19:48:30 +02:00
Dockerfile Improve logging 2018-05-23 00:41:37 +02:00
LICENSE Initial import 2018-05-18 20:41:41 +02:00
Makefile Improve logging 2018-05-23 00:41:37 +02:00
README.md Fix type annotation and README 2018-05-29 21:47:28 +02:00
requirements.txt More tests 2018-05-29 18:59:37 +02:00
setup.cfg Initial import 2018-05-18 20:41:41 +02:00
tasks.py Tests tests tests and bugfixes 2018-05-28 19:46:23 +02:00

microblog.pub

microblog.pub

Build Status License

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

Still in early development.

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
  • 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
  • No JavaScript, that's it, even the admin UI is pure HTML/CSS
  • Easy to customize (the theme is written Sass)
    • mobile-friendly theme
    • with dark and light version
  • Microformats aware (exports h-feed, h-entry, h-cards, ...)
  • Exports RSS/Atom feeds
  • Comes with a tiny HTTP API to help posting new content and performing basic actions
  • 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)
  • Focus on testing

ActivityPub

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

Compatible with Mastodon (which is not following the spec closely), but will drop OStatus messages.

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

Running your instance

Installation

$ git clone
$ make css
$ cp -r config/me.sample.yml config/me.yml

Configuration

$ make password

Deployment

$ docker-compose up -d

Development

The most convenient way to hack on microblog.pub is to run the server locally, and run

# One-time setup
$ pip install -r requirements.txt
# Start the Celery worker, RabbitMQ and MongoDB
$ docker-compose -f docker-compose-dev.yml up -d
# Run the server locally
$ MICROBLOGPUB_DEBUG=1 FLASK_APP=app.py flask run -p 5005 --with-threads

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.

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/<node_id>/activity

Response

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

Contributions

PRs are welcome, please open an issue to start a discussion before your start any work.