Fix #77 Add language switcher (again) (#113)

Update README

Fix a typo

Prepend bundle exec to middleman command

Use link_to_lang helper

Use relative path for links

Append solidus to links to directory index

Update Bundler

Install Webrick

Add Webrick to dependencies

Remove Crowdin related code from template

Co-authored-by: Kitaiti Makoto <KitaitiMakoto@gmail.com>
Reviewed-on: plume/documentation#113
This commit is contained in:
KitaitiMakoto 2020-12-27 15:51:03 +00:00
parent 68934f526b
commit 9460231982
40 changed files with 187 additions and 84 deletions

View file

@ -7,3 +7,4 @@ gem 'wdm', '~> 0.1', platforms: [:mswin, :mingw]
gem 'redcarpet'
gem 'middleman-syntax'
gem 'rake'
gem 'webrick'

View file

@ -102,6 +102,7 @@ GEM
thread_safe (~> 0.1)
uglifier (3.2.0)
execjs (>= 0.3.0, < 3)
webrick (1.7.0)
PLATFORMS
ruby
@ -114,6 +115,7 @@ DEPENDENCIES
redcarpet
tzinfo-data
wdm (~> 0.1)
webrick
BUNDLED WITH
2.1.4
2.2.3

View file

@ -2,4 +2,97 @@
The documentation for Plume, available at [docs.joinplu.me](https://docs.joinplu.me).
Uses middleman.
Uses [middleman][].
## Prerequisites
* Ruby
* [Crowdin CLI][] v3 if you build translations
* Netlify CLI if you deploy
## Setting up
Install RubyGems including [middleman][]:
```shell
bundle config set --local path vendor/bundle
bundle install
```
## Editing documentation
Run
```shell
bundle exec middleman
```
, visit http://localhost:4567/, and then you can see documentation site.
Edit files under `source` directory and reload your browser, then you see updated content. But this site doesn't include translations. If you want to include translated pages, see next section.
After editing, create a pull request.
## Building site with translation integration
If you want to build site with translations, you need set up [Crowdin CLI][].
Run
```shell
bundle exec rake build_site
```
and then the site with translations is built under `build` directory. You can see the site using one-liner server such as
```shell
ruby -run -e httpd build
```
or web server such as Caddy.
## Updating translation strings
When you add and/or modify strings from current sources, you may want to translate them. To do so, updated contents need to be uploaded to Crowdin. Run
```shell
bundle exec rake crowdin:upload
```
then you can translate strings at Crowdin.
## Building translation site
When you build site for https://translate.docs.joinplu.me/, run
```shell
bundle exec rake build_trans
```
then the site is built under `translate` directory.
## Deploying site
You need [Netlify CLI][] if you deploy site.
Run
```shel
bundle exec rake deploy
```
then you can see updated site at https://docs.joinplu.me/.
## Deploying translation site
Run
```shell
bundle exec rake deploy_trans
```
and then you can see updated translation site at https://translate.docs.joinplu.me/.
[middleman]: https://middlemanapp.com/
[Crowdin CLI]: https://support.crowdin.com/cli-tool/
[Netlify CLI]: https://cli.netlify.com/

View file

@ -32,12 +32,12 @@ task :build_site => [:build_base, "crowdin:download"] do
end
task :build_base do
sh "middleman", "build"
sh "bundle", "exec", "middleman", "build"
end
desc "Build site for translate.docs.joinplu.me"
task :build_trans => "crowdin:download" do
sh "middleman", "build", "--build-dir", TRANS_DIR
sh "bundle", "exec", "middleman", "build", "--build-dir", TRANS_DIR
(LOCALE_DIR/PSEUDO_LANG/"trans").glob("**/*.html").each do |html|
doc = html.read
@ -49,7 +49,7 @@ task :build_trans => "crowdin:download" do
end
task :build_trans_src do
sh "middleman", "build", "--build-dir", LOCALE_DIR
sh "bundle", "exec", "middleman", "build", "--build-dir", LOCALE_DIR
end
desc "Deploy docs.joinplue.me"

View file

@ -1,6 +1,8 @@
# Activate and configure extensions
# https://middlemanapp.com/advanced/configuration/#configuring-extensions
set :relative_links, true
set :markdown_engine, :redcarpet
set :markdown, :fenced_code_blocks => true, :smartypants => true, :with_toc_data => true
@ -20,3 +22,19 @@ configure :build do
# activate :minify_css
# activate :minify_javascript
end
DEFAULT_LANGUAGE = "en"
helpers do
def link_to_lang(name, code, **opts)
base = code == DEFAULT_LANGUAGE ? "/" : "/#{code}/"
path = base + current_page.path
.sub(/index\.html\z/, "")
.sub(%r|\.html\z|, "/")
link_to(h(name), path, hreflang: h(code), rel: "alternate")
end
end
def URI.escape(*args)
encode_www_form_component(*args)
end

View file

@ -1,10 +1,10 @@
<nav>
<ul>
<li>
<a href="https://joinplu.me"><img src="/images/logo.svg" alt="Plume logo">Plume</a>
</li>
<li>
<a href="/contribute/">Contribute</a>
<% link_to "/index.html" do %><img src="/images/logo.svg" alt="Plume logo">Plume<% end %>
</li>
<li>
<%= link_to "Contribute", "/contribute/index.html" %>
</li>
<li>
<a href="https://git.joinplu.me/Plume/Plume">Source code</a>

View file

@ -11,10 +11,10 @@
.sort{ |a, b| -(a.data.priority || 0) <=> -(b.data.priority || 0) }
%>
<% if children.size == 0 %>
<a href="<%= i.url %>"><%= i.data.title %></a>
<%= link_to i.data.title, i %>
<% else %>
<details>
<summary><a href="<%= i.url %>"><%= i.data.title %></a><i data-feather="chevron-left"></i></summary>
<summary><%= link_to i.data.title, i %><i data-feather="chevron-left"></i></summary>
<%= partial :nav_item, :locals => {
:items => children,
:resources => resources

View file

@ -19,5 +19,5 @@ tab, click the green "New issue" button, and describe your problem.
## If you don't have a Gitea nor GitHub account
If you don't have a Gitea nor GitHub account, and don't want to create one, you can also report your issue on Matrix.
Join the Plume room as explained in [this guide](/contribute/discussion), and send a message explaining what is wrong.
Join the Plume room as explained in [this guide](../discussion/), and send a message explaining what is wrong.
We will take care of creating an issue on Gitea or GitHub for you.

View file

@ -23,7 +23,7 @@ a pull request, that we will then review, and eventually merge.
## Installing the development environment
Please refer to the [installation guide](/installation). Choose to compile Plume
Please refer to the [installation guide](../../installation/). Choose to compile Plume
from source when asked. Instead of using `cargo install`, use `cargo run` which
starts a freshly compiled debugging version of Plume.
@ -80,7 +80,7 @@ also owned by the "plume" user, but with a different name. Then, you'll need to
this instance too.
The easiest way to do it is probably to install `plm` and `plume` globally (as explained
[here](/installation/with/source-code)), but with the `--debug` flag to avoid long compilation
[here](../../installation/with/source-code/)), but with the `--debug` flag to avoid long compilation
times. Then create a copy of your `.env` file in another directory, and change the `DATABASE_URL`
and `ROCKET_PORT` variables. Then copy the migration files in this new directory and run them.
@ -88,7 +88,7 @@ and `ROCKET_PORT` variables. Then copy the migration files in this new directory
plm migration run
```
Setup the new instance with `plm` [as explained here](/installation/config).
Setup the new instance with `plm` [as explained here](../../installation/config/).
Now, all you need for your two instances to be able to communicate is a fake domain
name with HTTPS for each of them. The first step to have that on your local machine is

View file

@ -35,7 +35,7 @@ You can find a list of the icons you can use on [this page](https://feathericons
Our current documentation is probably not perfect, and proof-reading it helps a lot! However please note
this part only applies to the English documentation, if you want to improve the documentation in another language,
see how to [translate it](/contribute/translations).
see how to [translate it](../translations/).
To fix the mistakes you found, you will need to fork the documentation on Gitea (as explained in the first
paragraph of the previous part).

View file

@ -19,5 +19,5 @@ Give as much details as possible. Especially, explain which problem you are tryi
Then you can open on [Gitea](https://git.joinplu.me/Plume/Plume/issues/new) ([GitHub](https://github.com/Plume-org/Plume/issues/new?template=feature_request.md)),
if you have an account there. Just fill the information asked in the form, and click "Submit new issue".
If you don't have a Gitea nor GitHub account, you can also suggest your feature in [the Matrix room](/contribute/discussion), and we
If you don't have a Gitea nor GitHub account, you can also suggest your feature in [the Matrix room](../discussion/), and we
will create the issue for you.

View file

@ -5,7 +5,7 @@ icon: heart
priority: 2
---
<p><b>Before contributing, be sure to read and agree with our <a href="/organization/code-of-conduct">Code of conduct</a></b></p>
<p><b>Before contributing, be sure to read and agree with our <a href="../../organization/code-of-conduct/">Code of conduct</a></b></p>
<p>Here is a (non-exhaustive) list of how you can contribute to Plume. Some may suit you better, depending on your skills and the time you want to offer to the project</p>
@ -19,7 +19,7 @@ priority: 2
<article>
<i data-feather="<%= res.data.icon %>"></i>
<h2>
<a href="<%= res.url %>"><%= res.data.title %></a>
<%= link_to res.data.title, res %>
</h2>
<p><%= res.data.summary %></p>
<% if res.data.time %>
@ -34,11 +34,11 @@ priority: 2
<ul>
<li>Talk about the project (super easy, and super helpful)</li>
<li>Write articles on Plume</li>
<li><a href="/installation">Open your own instance</a></li>
<li><%= link_to "Open your own instance", "/installation/index.html" %></li>
<li>Make a security audit</li>
<li>Integrate Plume with other projects. For instance you could use the <a href="/API">API</a> to make it possible to publish on Plume from your favorite writing app</li>
<li>Integrate Plume with other projects. For instance you could use the <a href="../../API/">API</a> to make it possible to publish on Plume from your favorite writing app</li>
</ul>
<p>If you contributed to Plume, you can add yourself to the <a href="/organization/contributors">contributors page</a> if you want.</p>
<p>If you contributed to Plume, you can add yourself to the <%= link_to "contributors page", "/organization/contributors.html" %> if you want.</p>
<p>If you ever encounter some difficulties while trying to contribute, please <a href="/contribute/discussion">tell us</a>, we will be happy to help you.</p>
<p>If you ever encounter some difficulties while trying to contribute, please <%= link_to "tell us", "/contribute/discussion.html" %>, we will be happy to help you.</p>

View file

@ -29,7 +29,7 @@ One these pages, you will find a list of languages. Select the one you want to t
![The list of all currently available languages](/images/language-list.png)
If your language is not in the list, [tell us](/contribute/discussion), we will add it.
If your language is not in the list, [tell us](../discussion/), we will add it.
Once you selected a language, you will see a list of files to translate. Find one that is not
100% complete, and open it. Something like that should load:

View file

@ -15,7 +15,7 @@ priority: 4
<article>
<i data-feather="<%= res.data.icon %>"></i>
<h2>
<a href="<%= res.url %>"><%= res.data.title %></a>
<%= link_to res.data.title, res %>
</h2>
<p><%= res.data.summary %></p>
</article>

View file

@ -31,4 +31,4 @@ Language is the name of the language you are using.
The supported languages are those in [this repository](https://github.com/sublimehq/Packages/tree/fa6b8629c95041bf262d4c1dab95c456a0530122) since we use SublimeText's syntax file.
Usually the name is in lower-case: for instance `Python` can be highlighted with `python`.
To configure the theme to use, you will have to [choose a different theme for your bblog](/guide/manage-a-blog).
To configure the theme to use, you will have to [choose a different theme for your bblog](../manage-a-blog/).

View file

@ -15,7 +15,7 @@ show_links: yes
<article>
<i data-feather="<%= res.data.icon %>"></i>
<h2>
<a href="<%= res.url %>"><%= res.data.title %></a>
<%= link_to res.data.title, res %>
</h2>
<p><%= res.data.summary %></p>
</article>

View file

@ -48,7 +48,7 @@ MAIL_ADDRESS=from@example.org
```
For more information about what you can put in your `.env`,
see [the documentation about environment variables](/environment).
see [the documentation about environment variables](../../environment/).
Now we need to run migrations. Migrations are scripts used to update
the database. To run the migrations, you can do for **GNU/Linux** and **Mac OS X**:
@ -91,9 +91,9 @@ plm users new --admin -n "adminusername" -N "Human Readable Admin Name" -b "Biog
```
For more information about these commands, and the arguments you can give them,
check out [their documentation](/CLI).
check out [their documentation](../../CLI/).
Now that Plume is configured, if you are in a production environment you probably
want to configure your init system to make it easier to manage.
<a class="action" href="/installation/init">Configure init system</a>
<a class="action" href="../init/">Configure init system</a>

View file

@ -18,19 +18,19 @@ are not the same, so we need to know what is installed on your machine to guide
you:
<ul class="choices">
<li><a href="/installation/deps/deb">
<li><a href="deb/">
Debian, Ubuntu or another Linux ditribution based on DEB
</a></li>
<li><a href="/installation/deps/rpm">
<li><a href="rpm/">
Fedora, RHEL, CentOS or another Linux ditribution based on RPM
</a></li>
<li><a href="/installation/deps/gentoo">
<li><a href="gentoo/">
Gentoo
</a></li>
<li><a href="/installation/deps/macosx">
<li><a href="macosx/">
Mac OS X
</a></li>
<li><a href="/installation/deps/windows">
<li><a href="windows/">
Windows
</a></li>
</ul>

View file

@ -27,4 +27,4 @@ apt install libsqlite3-dev gettext git curl gcc make openssl libssl-dev pkg-conf
Now that these dependencies have been installed, we need to install Rust which has a special installer.
<a class="action" href="/installation/deps/rust">Let's do it!</a>
<a class="action" href="../rust/">Let's do it!</a>

View file

@ -14,4 +14,4 @@ emerge -avu dev-db/sqlite dev-vcs/git sys-devel/gettext sys-devel/clang
Now that these dependencies have been installed, we need to install Rust which has a special installer.
<a class="action" href="/installation/deps/rust">Let's do it!</a>
<a class="action" href="../rust/">Let's do it!</a>

View file

@ -16,4 +16,4 @@ brew install postgres
Now that these dependencies have been installed, we need to install Rust which has a special installer.
<a class="action" href="/installation/deps/rust">Let's do it!</a>
<a class="action" href="../rust/">Let's do it!</a>

View file

@ -12,4 +12,4 @@ dnf install libsq3-devel sqlite3 libsqlite3-dev git curl gcc make openssl openss
Now that these dependencies have been installed, we need to install Rust which has a special installer.
<a class="action" href="/installation/deps/rust">Let's do it!</a>
<a class="action" href="../rust/">Let's do it!</a>

View file

@ -46,4 +46,4 @@ You can check that everything is correctly installed with `rustc --version` and
We can now compile Plume's source code.
<a class="action" href="/installation/with/source-code">Compiling Plume</a>
<a class="action" href="../../with/source-code/">Compiling Plume</a>

View file

@ -29,4 +29,4 @@ Plume on Windows devices.
Now that these dependencies have been installed, we need to install Rust which has a special installer.
<a class="action" href="/installation/deps/rust">Let's do it!</a>
<a class="action" href="../rust/">Let's do it!</a>

View file

@ -9,9 +9,9 @@ There are various ways to install Plume. Please, choose the one that suits you t
in this list:
<ul class="choices">
<li><a href="with/docker">Docker</a></li>
<li><a href="with/snap">Snap</a></li>
<li><a href="with/yunohost">YunoHost</a></li>
<li><a href="with/prebuilt">Prebuilt binaries</a></li>
<li><a href="installation/deps">From source</a></li>
<li><a href="with/docker/">Docker</a></li>
<li><a href="with/snap/">Snap</a></li>
<li><a href="with/yunohost/">YunoHost</a></li>
<li><a href="with/prebuilt/">Prebuilt binaries</a></li>
<li><a href="installation/deps/">From source</a></li>
</ul>

View file

@ -7,10 +7,10 @@ to start other program automatically and to let you manage them more easily. The
recommended option for Windows is Task Scheduler.
<ul class="choices">
<li><a href="/installation/init/systemd">SystemD</a></li>
<li><a href="/installation/init/sysvinit">SysVInit</a></li>
<li><a href="/installation/init/openrc">OpenRC</a></li>
<li><a href="/installation/init/taskscheduler">Task Scheduler</a></li>
<li><a href="systemd/">SystemD</a></li>
<li><a href="sysvinit/">SysVInit</a></li>
<li><a href="openrc/">OpenRC</a></li>
<li><a href="taskscheduler/">Task Scheduler</a></li>
</ul>
## How to know which init system I have?

View file

@ -36,4 +36,4 @@ Now start the services:
If everything works fine, the last step before you can use your Plume instance
is to configure a reverse-proxy.
<a class="action" href="/installation/proxy">Reverse-proxy configuration</a>
<a class="action" href="../../proxy/">Reverse-proxy configuration</a>

View file

@ -42,4 +42,4 @@ systemctl status plume.service
If everything works fine, the last step before you can use your Plume instance
is to configure a reverse-proxy.
<a class="action" href="/installation/proxy">Reverse-proxy configuration</a>
<a class="action" href="../../proxy/">Reverse-proxy configuration</a>

View file

@ -124,4 +124,4 @@ service plume.service status
If everything works fine, the last step before you can use your Plume instance
is to configure a reverse-proxy.
<a class="action" href="/installation/proxy">Reverse-proxy configuration</a>
<a class="action" href="../../proxy/">Reverse-proxy configuration</a>

View file

@ -16,4 +16,4 @@ in order to do so. To configure, use the following options when creating a task:
If everything works fine, the last step before you can use your Plume instance
is to configure a reverse-proxy.
<a class="action" href="/installation/proxy">Reverse-proxy configuration</a>
<a class="action" href="../../proxy/">Reverse-proxy configuration</a>

View file

@ -8,10 +8,10 @@ on the same machine, so that people are redirected to the correct one. Please ch
your reverse proxy in this list:
<ul class="choices">
<li><a href="/installation/proxy/caddy">Caddy</a></li>
<li><a href="/installation/proxy/nginx">Nginx</a></li>
<li><a href="/installation/proxy/apache">Apache</a></li>
<li><a href="/installation/proxy/iis">IIS</a></li>
<li><a href="caddy/">Caddy</a></li>
<li><a href="nginx/">Nginx</a></li>
<li><a href="apache/">Apache</a></li>
<li><a href="iis/">IIS</a></li>
</ul>
If you don't have a reverse-proxy on your server yet but want one, we recommend

View file

@ -53,4 +53,4 @@ docker-compose up -d
And that's it! You can now setup a reverse-proxy to access Plume from other machines
than your server (which is probably what you want 😁).
<a class="action" href="/installation/proxy">Configure a reverse-proxy</a>
<a class="action" href="../../proxy/">Configure a reverse-proxy</a>

View file

@ -40,4 +40,4 @@ To check that everything went well, you can run `plm --help`. It should show an
If everything is working, you can configure your instance.
<a class="action" href="/installation/config">Configuration</a>
<a class="action" href="../../config/">Configuration</a>

View file

@ -28,4 +28,4 @@ sudo plume.plm users new -n 'admin' -N 'name' -b 'bio' -e 'admin@domain.name' -p
And that's it! You can now setup a reverse-proxy to access Plume from other machines
than your server (which is probably what you want 😁).
<a class="action" href="/installation/proxy">Configure a reverse-proxy</a>
<a class="action" href="../../proxy/">Configure a reverse-proxy</a>

View file

@ -35,7 +35,7 @@ cargo install --no-default-features --features DATABASE,search-lindera
cargo install --no-default-features --features DATABASE,search-lindera --path plume-cli
```
And then, you can configure Plume by `SEARCH_TAG_TOKENIZER`, `SEARCH_CONTENT_TOKENIZER` and/or `SEARCH_LANG` environment variables. See [Useful Environment Variables](/environment/) for details.
And then, you can configure Plume by `SEARCH_TAG_TOKENIZER`, `SEARCH_CONTENT_TOKENIZER` and/or `SEARCH_LANG` environment variables. See [Useful Environment Variables](../../../environment/) for details.
For **Windows**, if you are going to use SQLite, launch an additional cmd.exe as admin and do the following:
@ -77,4 +77,4 @@ These commands can take a long time to run and use quite a lot of resources.
Once it's done, you can configure your instance.
<a class="action" href="/installation/config">Configuration</a>
<a class="action" href="../../config/">Configuration</a>

View file

@ -7,17 +7,6 @@
<!-- Use the title from a page's frontmatter if it has one -->
<title><%= current_page.data.title || "…" %> ⋅ Plume documentation</title>
<% if ENV['CROWDIN'] == 'on' %>
<script type="text/javascript">
var _jipt = [];
_jipt.push(['project', 'plume-docs']);
_jipt.push(['escape', function() {
window.location.href = 'https://docs.joinplu.me';
}]);
</script>
<script type="text/javascript" src="//cdn.crowdin.com/jipt/jipt.js"></script>
<% end %>
<%= stylesheet_link_tag "site" %>
<script src="https://unpkg.com/feather-icons"></script>
<link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist@3.12.1/swagger-ui.css">
@ -32,7 +21,7 @@
<button aria-controls="languages" aria-haspopup="true" aria-expanded="false"><img src="/images/LanguageIcon.png" alt="switch language"></button>
<ul id="languages" class="languages" aria-hidden="true">
<% data.languages.each_pair do |code, name| %>
<li lang="<%=h code %>" translate="no" class="language"><%= link_to h(name), code == "en" ? "/" : "/#{code}/", hreflang: h(code), rel: "alternate" %></li>
<li lang="<%=h code %>" translate="no" class="language"><%= link_to_lang name, code %></li>
<% end %>
</ul>
</div>
@ -40,7 +29,7 @@
<aside>
<i id="menu" data-feather="menu"></i>
<nav>
<a href="/"><span>Plume documentation</span><img src="/images/logo.svg" alt="Plume logo"></a>
<% link_to "/index.html" do %><span>Plume documentation</span><img src="/images/logo.svg" alt="Plume logo"><% end %>
<% resources = sitemap.resources
.select{ |p| p.path =~ /\.html/ && p.path != "index.html" }
.sort { |a, b| a.path <=> b.path }

View file

@ -38,13 +38,13 @@ Project maintainers have the right and responsibility to remove, edit, or reject
### Scope
This Code of Conduct applies both within [project spaces](/organization/where) and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
This Code of Conduct applies both within [project spaces](../where/) and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
### Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at moderation@joinplu.me. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
The members of the project team are the people marked as *Member of the moderation team* [on the contributors page](/organization/contributors).
The members of the project team are the people marked as *Member of the moderation team* [on the contributors page](../contributors/).
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

View file

@ -19,7 +19,7 @@ show_links: yes
<article>
<i data-feather="<%= res.data.icon %>"></i>
<h2>
<a href="<%= res.url %>"><%= res.data.title %></a>
<%= link_to res.data.title, res %>
</h2>
<p><%= res.data.summary %></p>
</article>

View file

@ -20,7 +20,7 @@ major changes are made to the interface for example (even if the two are often l
We don't set deadlines for new releases. We just assign issues (either bug to be fixed or feature requests) on Gitea to a given
milestone as we feel it, and once it is complete, we make a new release.
**[→ Milestones list on Gitea](hhttps://git.joinplu.me/Plume/Plume/milestones)**
**[→ Milestones list on Gitea](https://git.joinplu.me/Plume/Plume/milestones)**
We should prefer making small releases often, than big ones once a year or so.

View file

@ -9,10 +9,10 @@ The instructions to update your instance depends on your installation method.
Please choose the one you are using:
<ul class="choices">
<li><a href="/update/docker">Docker</a></li>
<li><a href="/update/yunohost">YunoHost</a></li>
<li><a href="/update/prebuilt">Prebuilt binaries</a></li>
<li><a href="/update/source-code">From source</a></li>
<li><a href="../docker/">Docker</a></li>
<li><a href="../yunohost/">YunoHost</a></li>
<li><a href="../prebuilt/">Prebuilt binaries</a></li>
<li><a href="../source-code/">From source</a></li>
</ul>
Also please check [the release notes](https://git.joinplu.me/Plume/Plume/releases) to see if any additional operation is needed.