Federated blogging application, thanks to ActivityPub (now on https://git.joinplu.me/ — this is just a mirror)

Last update: May 26, 2022

Plume's logo Plume

CircleCI Code coverage Docker Pulls Liberapay patrons

WebsiteDocumentationContributeInstances list

Plume is a federated blogging engine, based on ActivityPub. It is written in Rust, with the Rocket framework, and Diesel to interact with the database. The front-end uses Ructe templates, WASM and SCSS.

Features

A lot of features are still missing, but what is already here should be quite stable. Current and planned features include:

  • A blog-centric approach: you can create as much blogs as you want with your account, to keep your different publications separated.
  • Media management: you can upload pictures to illustrate your articles, but also audio files if you host a podcast, and manage them all from Plume.
  • Federation: Plume is part of a network of interconnected websites called the Fediverse. Each of these websites (often called instances) have their own rules and thematics, but they can all communicate with each other.
  • Collaborative writing: invite other people to your blogs, and write articles together.

Get involved

If you want to have regular news about the project, the best place is probably our blog, or our Matrix room: #plume-blog:matrix.org.

If you want to contribute more, a good first step is to read our contribution guides. We accept all kind of contribution:

But this list is not exhaustive and if you want to contribute differently you are welcome too!

As we want the various spaces related to the project (GitHub, Matrix, Loomio, etc) to be as safe as possible for everyone, we adopted a code of conduct. Please read it and make sure you accept it before contributing.

Starting your own instance

We provide various way to install Plume: from source, with pre-built binaries, with Docker or with YunoHost. For detailed explanations, please refer to the documentation.

GitHub

https://github.com/Plume-org/Plume
Comments
  • 1. plume docker postgres auth fails

    trying to install plume via docker following instructions database cannot connect

    [email protected]:~/plume# docker-compose run --rm plume plm migration run
    Creating plume_plume_run ... done
    Configuration read from /app/.env
    thread 'main' panicked at 'Couldn't connect to the database.: BadConnection("FATAL:  password authentication failed for user \"plume\"\n")', plume-cli/src/main.rs:35:40
    

    Refers to /app/.env but docker exec -it <container> bash reveals no file .env or directory /app

    Reviewed by timconsidine at 2021-10-05 13:15
  • 2. Duplicated articles in timelines

    When publishing an article, it gets duplicated in timelines after some time.

    It looks like duplication happens every time someone likes or boosts the post (from the same instance, or from another one), but I'm not 100% sure.

    • Plume version: 0.4.0
    • Operating system: Linux, but not relevant IMO
    • Web Browser: Firefox Nightly, but not relevant either
    Reviewed by elegaanz at 2019-12-23 17:09
  • 3. Update without script

    Hi I would like to upgrade without git as mentioned here https://github.com/Plume-org/Plume/blob/master/docs/UPDATE.md.

    So I would like to :

    1. Backup the important files and folders like .env, etc.
    2. Delete the the source folder
    3. Download and decompress the fresh sources to the folder.
    4. Restore the importation files and folders like .env to the new unpacked sources.

    So for this I would like to know what files and folders are needed to be backed up and needs to be restored to the newly unpacked sources, so that the Plume don't break.

    Reviewed by anmol26s at 2018-09-08 20:04
  • 4. Liking and boosting posts does not work

    When I like or boost a post (on the same instance), it just takes me to a domain.com/posturl/{like,boost} url, which is just a blank page. When I reload the blog's page, the like or boost count still remains at 0, and it seems I haven't affected anything.

    Reviewed by makeworld-the-better-one at 2018-12-21 03:20
  • 5. arm64v8 builds fail due to outdated dependency

    Plume version (and/or commit): 61b6ceed92ef838a085da6eb66f87ab1de65a520

    During compile on arm64v8 the following error surfaces during the final step (looks like linking). From what I can tell rust-crypto is no longer maintained and won't be receiving a fix (see https://github.com/DaGenix/rust-crypto/issues/383 for reference).

    I'm not familiar with the rust toolchain and this seems like Plume or one of it's dependencies has a dependency on the legacy rust-crypto library. Is there a way to track this down and/or update the code to avoid rust-crypto popping up in the dependency graph?

    I bring this up because a Raspberry Pi 3, Orange Pi, Scaleway arm VPSs and Amazon arm VPSs are all cheap, easy to obtain and can be used for self hosting yet are all arm64v8 devices/servers.

    warning: struct is never constructed: `Write`                                                                                                                                                                                          
      --> src/api/authorization.rs:19:1                                                                                                                                                                                                    
       |                                                                                                                                                                                                                                   
    19 | pub struct Write;                                                                                                                                                                                                                 
       | ^^^^^^^^^^^^^^^^^                                                                                                                                                                                                                 
       |                                                                                                                                                                                                                                   
       = note: #[warn(dead_code)] on by default                                                                                                                                                                                            
                                                                                                                                                                                                                                           
    error: linking with `cc` failed: exit code: 1                                                                                                                                                                                          
      |                                             
    [snip]
    
    
    
      = note: /app/target/debug/deps/libcrypto-0e2d8e020a3b8dff.rlib(crypto-0e2d8e020a3b8dff.crypto.277lu5c6-cgu.12.rcgu.o): In function `crypto::util::fixed_time_eq':
              /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rust-crypto-0.2.36/src/util.rs:52: undefined reference to `rust_crypto_util_fixed_time_eq_asm'
              collect2: error: ld returned 1 exit status
              
    
    error: aborting due to previous error
    
    error: failed to compile `plume v0.2.0 (/app)`, intermediate artifacts can be found at `/app/target`
    
    Reviewed by mcrosson at 2018-12-10 20:34
  • 6. Arch Linux Packaging Question

    I'm tying to package plume into Arch Linux with files show below

    ./etc/plume/config
    ./usr/share/licenses/plume/LICENSE
    ./usr/lib/systemd/system/plume.service
    ./usr/lib/sysusers.d/plume.conf
    ./usr/lib/plume/
    ./usr/bin/plume
    ./usr/bin/plm
    

    Here is the systemd file:

    [Unit]
    Description=plume
    
    [Service]
    Type=simple
    User=plume
    ExecStart=/usr/bin/plume
    EnvironmentFile=/etc/plume/config
    WorkingDirectory=/usr/lib/plume
    TimeoutSec=30
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    And here are some of my questions:

    1. Is it possible to build a plume with 2 database backend including pg and sqlite, I found with enable all features, plume-cli will refuse to compile
    2. What should be packaged into a working dir in /usr/lib/plume? After I run plume with systemd, I failed to run database migration with `Unable to find migrations directory in this directory or any parent directories.
    • Plume version: 0.3.0-alpha-2
    • Operating system: Arch Linux
    • Web Browser: Firefox Here is the pkgbuild
    Reviewed by sequencer at 2019-05-14 12:23
  • 7. Big refactoring of the Inbox

    We now have a type that routes an activity through the registered handlers until one of them matches.

    Each Actor/Activity/Object combination is represented by an implementation of AsObject

    These combinations are then registered on the Inbox type, which will try to deserialize the incoming activity in the requested types.

    Advantages:

    • nicer syntax: the final API is clearer and more idiomatic
    • more generic: only two traits (AsActor and AsObject) instead of one for each kind of activity
    • we always try to dereference unknown objects
    • it is easier to see which activities we handle and which one we don't

    (sorry for the big diff once again :confused:)

    Reviewed by elegaanz at 2019-02-11 16:23
  • 8. Can only start plume with contents of .env file in single argument call to "plume"

    What is happening

    In the docs provided, it says to create a .env file in the place where you built Plume. From following the instructions, I think that this location is /home/plume/Plume/.env but am unsure. With all my variables in this file, when I run any command, i.e. plm migration run it says that the database cannot be connected to. So, when I add the DATABASE_URL in front of these commands, it works just fine.

    What I need help with

    Where, exactly, given that I am running Plume with a dedicated user named "plume" and have compiled from source for Ubuntu 16.04, do I put my .env file so that Rust? Plume? app can read these variables without me having to put them all in an extremely long argument to launch and run Plume?

    My system

    Arguments used to install Plume

    # Install Rust first...
    curl https://sh.rustup.rs -sSf | sh
    
    # Git latest version
    git clone https://github.com/Plume-org/Plume.git
    cd Plume
    
    # Next Build the front-end
    cargo install cargo-web&&cargo web deploy -p plume-front
    
    # Build the back-end, replacing DATABASE either with postgres or sqlite
    cargo install --no-default-features --features postgres --force&&cargo install --no-default-features --features postgres --path plume-cli --force
    

    Other items

    1. Ubuntu 16.04
    2. PostgresSQL

    Good to knows

    My instance actually works, I just want to be able to use the "configuration" file the way it was meant to be used. I am using custom logo, that works, email server, that works, and would like to use custom port (not 7878). Thanks for all your help and for creating Plume!

    Reviewed by iamdoubz at 2019-07-01 14:03
  • 9. Spaces get removed from tags

    There are many cases in which (at least in Persian language) a tag may include space(s). Currently, Plume removes space from tags. Look at the following screenshots to see what is entered as tag and how it is damaged in output;

    image

    image

    • Plume version: 0.4.0
    Reviewed by ahangarha at 2020-11-09 12:40
  • 10. Theming

    • Custom CSS for blogs
    • Custom themes for instance
    • New dark theme
    • UI for admin to upload new theme (or delete them)
    • UI to choose your theme

    image

    Instance level themes are just CSS files, stored in static/css (see Instance::list_themes).

    TODO:

    • [x] Federate blog themes
    • [x] Escape url()/import
    • [x] Add a way to avoid conflicts between blog and instance themes
    • [x] UI to disable blog CSS (the option is already in the database, just need to add a checkbox in the settings)
    • [x] SQlite migrations
    • [x] Documentation

    Fixes #354, #403

    Reviewed by elegaanz at 2019-06-21 08:53
  • 11. Theme update

    So far:

    • Ligther colors
    • No more border radius
    • Buttons are now always colored
    • Fix weird margin with CWed images
    • Add a border to quotes
    • Start to redesign the post page (according to the Figma mockups)
      • Full-size cover image, with a gradient and the title/subtitle/authors/date over it
      • Like/boost are now between tags and author info
      • Author info has a difference background color to make a difference between the different sections
      • Tags and license are now side-by-side

    As I started it, this redesign is not perfectly following what was done on Figma (for instance lighter colors were not planned), but I'm open to discussion if you think Figma mockups should be better respected.

    It is available at https://pr-553.joinplu.me/ if you want to see how it looks like. You can login with admin/admin123 to see all the pages.

    Reviewed by elegaanz at 2019-04-27 20:47
  • 12. Bump regex-syntax from 0.6.25 to 0.6.26

    Bumps regex-syntax from 0.6.25 to 0.6.26.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-05-20 19:26
  • 13. Bump once_cell from 1.10.0 to 1.11.0

    Bumps once_cell from 1.10.0 to 1.11.0.

    Changelog

    Sourced from once_cell's changelog.

    Changelog

    Unreleased

    1.11

    • Add OnceCell::with_value to create initialized OnceCell in const context.
    • Improve Clone implementation for OnceCell.
    • Rewrite parking_lot version on top of parking_lot_core, for even smaller cells!

    1.10

    • upgrade parking_lot to 0.12.0 (note that this bumps MSRV with parking_lot feature enabled to 1.49.0).

    1.9

    • Added an atomic-polyfill optional dependency to compile race on platforms without atomics

    1.8.0

    • Add try_insert API -- a version of set that returns a reference.

    1.7.2

    • Improve code size when using parking_lot feature.

    1.7.1

    • Fix race::OnceBox<T> to also impl Default even if T doesn't impl Default.

    1.7.0

    • Hide the race module behind (default) race feature. Turns out that adding race by default was a breaking change on some platforms without atomics. In this release, we make the module opt-out. Technically, this is a breaking change for those who use race with no_default_features. Given that the race module itself only several days old, the breakage is deemed acceptable.

    1.6.0

    • Add Lazy::into_value
    • Stabilize once_cell::race module for "first one wins" no_std-compatible initialization flavor.
    • Migrate from deprecated compare_and_swap to compare_exchange.

    1.5.2

    • OnceBox API uses Box<T>. This a breaking change to unstable API.

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-05-19 19:36
  • 14. RTF editor will omit line break when editing

    Way to reproduce:

    1. start a new article, using RTF editor.
    2. Typing:
      # 123
      **abc**
      
    3. save and publish as draft.
    4. edit again
    5. The content in RTF editor will become:
      # 123 **abc**
      

    Meanwhile it won't affect the final result if I don't touch it. It's very confusing.

    • Plume version: v0.7.3-dev
    • Operating system: Windows 10
    • Web Browser: Firefox
    Reviewed by pullopen at 2022-05-18 09:09
  • 15. Federation with Lemmy

    Hi, lemmy dev here. i saw your release announcement yesterday, and decided to have a look how Plume federation works. Turns out its very easy to make it compatible with Lemmy, as you also use groups. After a few changes its already working from the Lemmy side, you can fetch and view Plume users, groups and articles.

    See here for an example: https://ds9.lemmy.ml/post/27751

    PR in Lemmy repo: https://github.com/LemmyNet/lemmy/pull/2258

    But there is a problem with activities, the ones sent from Lemmy are rejected:

    Job errored: Processing(Send https://voyager.lemmy.ml/activities/follow/d649b385-6ad9-415d-b010-ab547eb9fabd to https://fediverse.blog/~/PlumeDev/inbox failed with status 404 Not Found: <!DOCTYPE html>
    lemmy_1     | <html class="default-light">
    lemmy_1     |     <head>
    lemmy_1     |         <meta charset="utf-8" />
    lemmy_1     |         <title>Page not found ⋅ Plume</title>
    ...
    

    It looks like the activity is not routed correctly, maybe because of the content-type header? In our case its application/activity+json.

    Another problem, i noticed some groups like https://blogs.kitaitimakoto.net/~/ArticlesEssays/ have a nested object with type Image and no url. This might be happening because the user hasnt set any avatar. I think it is incorrect, and should instead be encoded by leaving the image field out, or setting it to null.

    "image": {
        "type": "Image"
    },
    

    Btw i tried to open this issue on your gitea, but still didnt get any confirmation mail.

    Reviewed by Nutomic at 2022-05-12 21:33
  • 16. Blogs tab on users page

    Please add a Blogs tab on the users page which will reveal what blogs the users is involved with. You can currently view the articles a users is involved with, their subscribers and what they are subscribed to.

    Reviewed by trymeouteh at 2021-11-20 02:44
Federated Mint Prototype

MiniMint is tested and developed using rust stable, you can get it through your package manager or from rustup.rs.

May 20, 2022
🐀 Building a federated link aggregator in rust

English | Español | Русский Lemmy A link aggregator / Reddit clone for the fediverse. Join Lemmy · Documentation · Report Bug · Request Feature · Rele

May 25, 2022
First Git on Rust is reimplementation with rust in order to learn about rust, c and git.

First Git on Rust First Git on Rust is reimplementation with rust in order to learn about rust, c and git. Reference project This project refer to the

Jan 28, 2022
Coreutils - upstream mirror

These are the GNU core utilities. This package is the union of the GNU fileutils, sh-utils, and textutils packages. Most of these programs have sign

May 18, 2022
Achieve it! How you ask? Well, it's pretty simple; just use greatness!
 Achieve it! How you ask? Well, it's pretty simple; just use greatness!

Greatness! Achieve it! How you ask? Well, it's pretty simple; just use greatness! Disclaimer I do not believe that greatness is the best. It fits a me

May 9, 2022
Just a bot for Neovim's Matrix room(s)

nvim-matrix-bot Currently just supports replying to messages with :h <some_doc> or similar in them with a link to the docs on Neovim's website. Plan i

Apr 1, 2022
Gnu-copypasta-maker - You'd just wanna interject for a moment!

GNU Copypasta Maker To compile, use make. To install, use sudo make install or if you are root make install To uninstall, use sudo make uninstall or i

Jan 30, 2022
Just toying with rust, nothing to see here :)

Just toying with rust, nothing to see here :)

Feb 24, 2022
🖊️ Just a place to paste
🖊️ Just a place to paste

Just a place to paste API GET /p/:id - Get a paste by ID POST /p/n - Post a new paste GET /s - Get stats about the zer0bin instance Public instances S

May 22, 2022
A simple library with just one struct which is used to wrap around pointers

A simple library with just one struct which is used to wrap around pointers. This can be used to create pointers and share them across threads without the hassle of synchronization if you really do not care about that.

Apr 11, 2022
Just a personal Rust Playground to play around and understand the language.
Just a personal Rust Playground to play around and understand the language.

Rust Proactive Introduction The code is a bit messy but it serves just as a personal Rust Playground to play around and understand the language. You c

Feb 22, 2022
🖊️ // Just a place to paste
🖊️ // Just a place to paste

Just a place to paste Features ✨ Code highlighting and line numbers (default) ?? Markdown rendering (click the button) ?? Single-view pastes (click th

May 22, 2022
QueingSimulator is an application that can be used to build intuitions about behavior of synchronous request/reply systems

Queueing Simulator QueingSimulator is an application that can be used to build intuitions about behavior of synchronous request/reply systems (such as

Feb 12, 2022
Simple tray application which shows battery level for HyperX Cloud Flight Wireless Headset.
Simple tray application which shows battery level for HyperX Cloud Flight Wireless Headset.

HyperX Cloud Flight Battery Monitoring Introduction Simple tray application which shows battery level for HyperX Cloud Flight Wireless Headset. Screen

May 16, 2022
An application for reading comics together.

Shared comic reader Creates a web server that serves image sets to one or more clients. When one of those clients turns a page, all other clients who

Dec 17, 2021
A clean and simple network looking glass application
A clean and simple network looking glass application

lg lg is my custom Looking Glass server software for use in ZZANet. The whole application is lightweight, self-contained, and easy to use even outside

Nov 25, 2021
01 Solana program application interface.

01 abi The abi is a repository for interfacing with the 01 program either through a rust client or through CPIs from another Solana program. Program A

May 11, 2022
Auto launch any application or executable at startup

Auto Launch Auto launch any application or executable at startup. Supports Windows, Mac (via AppleScript or Launch Agent), and Linux. How does it work

May 13, 2022
A example bevy application using bevy-kajiya for its renderer
A example bevy application using bevy-kajiya for its renderer

☀️ bevy-kajiya playground A example bevy application using bevy-kajiya for its renderer NOTE: only tested on Windows. For more context, check out the

May 14, 2022