docs(init): create documentation website using vitepress

- rename podlibre to adaures
- rename castopod-host to castopod
- simplify README and redirect to docs site
- move INSTALL and UPDATE docs
- add new gitlabci pipeline to deploy docs
- upgrade node to v16 in Dockerfile
This commit is contained in:
Yassine Doghri 2022-02-19 16:06:11 +00:00
commit fa5b5f51a4
327 changed files with 5619 additions and 1445 deletions

View file

@ -0,0 +1,4 @@
{
"label": "Contributing",
"position": 3
}

View file

@ -0,0 +1,144 @@
---
title: Guidelines
---
# Contributing to Castopod
Love Castopod and want to help? Thanks so much, there's something to do for
everybody!
Please take a moment to review this document in order to make the contribution
process easy and effective for everyone involved.
Following these guidelines helps to communicate that you respect the time of the
developers managing and developing this open source project. In return, they
should reciprocate that respect in addressing your issue or assessing patches
and features.
⚠️ Note that **any** contribution made on a repository other than
[the original repository](https://code.castopod.org/ad-aures/castopod) will not
be accepted.
## Using the issue tracker
The [issue tracker](https://code.castopod.org/ad-aures/castopod/-/issues) is the
preferred channel for [bug reports](#bug-reports),
[features requests](#feature-requests) and
[submitting pull requests](#pull-requests).
## Bug reports
A bug is a _demonstrable problem_ that is caused by the code in the repository.
Good bug reports are extremely helpful - thank you!
Guidelines for bug reports:
1. **Use the issue search** — check if the issue has already been
reported.
2. **Check if the issue has been fixed** — try to reproduce it using the
latest `main` branch in the repository.
3. **Isolate the problem** — ideally create a
[reduced test case](https://css-tricks.com/reduced-test-cases/) and a live
example.
A good bug report shouldn't leave others needing to chase you up for more
information. Please try to be as detailed as possible in your report. What is
your environment? What steps will reproduce the issue? What browser(s) and OS
experience the problem? What would you expect to be the outcome? All these
details will help people to fix any potential bugs.
> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates)
> have been created for this project. You may use them to help you follow those
> guidelines.
## Feature requests
Feature requests are welcome. But take a moment to find out whether your idea
fits with the scope and aims of the project. It's up to _you_ to make a strong
case to convince the project's developers of the merits of this feature. Please
provide as much detail and context as possible.
## Pull requests
Good pull requests - patches, improvements, new features - are a fantastic help.
They should remain focused in scope and avoid containing unrelated commits.
**Please ask first** before embarking on any significant pull request (e.g.
implementing features, refactoring code, porting to a different language),
otherwise you risk spending a lot of time working on something that the
project's developers might not want to merge into the project.
Please adhere to the coding conventions used throughout a project (indentation,
accurate comments, etc.) and any other requirements (such as test coverage).
Adhering to the following process is the best way to get your work included in
the project:
1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the
project, clone your fork, and configure the remotes:
```bash
# Clone your fork of the repo into the current directory
git clone https://code.castopod.org/<your-username>/castopod.git
# Navigate to the newly cloned directory
cd castopod
# Assign the original repo to a remote called "upstream"
git remote add upstream https://code.castopod.org/ad-aures/castopod.git
```
2. If you cloned a while ago, get the latest changes from upstream:
```bash
git checkout main
git pull upstream main
```
3. Create a new topic branch (off the `main` branch) to contain your feature,
change, or fix:
```bash
git checkout -b <topic-branch-name>
```
4. Commit your changes in logical chunks. Please adhere to these
[git commit message guidelines](https://conventionalcommits.org/) or your
code is unlikely be merged into the main project. Use Git's
[interactive rebase](https://help.github.com/articles/about-git-rebase/)
feature to tidy up your commits before making them public.
5. Locally merge (or rebase) the upstream dev branch into your topic branch:
```bash
git pull [--rebase] upstream main
```
6. Push your topic branch up to your fork:
```bash
git push origin <topic-branch-name>
```
7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork)
with a clear title and description.
**IMPORTANT**: By submitting a patch, you agree to allow the project owners to
license your work under the terms of the
[GNU AGPLv3](https://code.castopod.org/ad-aures/castopod/-/blob/main/LICENSE).
## Collaborating guidelines
There are few basic rules to ensure high quality of the project:
- Before merging, a PR requires at least two approvals from the collaborators
unless it's an architectural change, a large feature, etc. If it is, then at
least 50% of the core team have to agree to merge it, with every team member
having a full veto right. (i.e. every single one can block any PR)
- A PR should remain open for at least two days before merging (does not apply
for trivial contributions like fixing a typo). This way everyone has enough
time to look into it.
You are always welcome to discuss and propose improvements to this guideline.

View file

@ -0,0 +1,423 @@
---
title: Development setup
sidebarDepth: 3
---
# Setup your development environment
## Introduction
Castopod is a web app based on the `php` framework
[CodeIgniter 4](https://codeigniter.com).
We use [Docker](https://www.docker.com/) quickly setup a dev environment. A
`docker-compose.yml` and `Dockerfile` are included in the project's root folder
to help you kickstart your contribution.
> You don't need any prior knowledge of Docker to follow the next steps.
> However, if you wish to use your own environment, feel free to do so!
## Setup instructions
### 1. Pre-requisites
0. Install [docker](https://docs.docker.com/get-docker).
1. Clone Castopod project by running:
```bash
git clone https://code.castopod.org/ad-aures/castopod.git
```
2. Create a `.env` file with the minimum required config to connect the app to
the database and use redis as a cache handler:
```ini
CI_ENVIRONMENT="development"
# If set to development, you must run `npm run dev` to start the static assets server
vite.environment="development"
# By default, this is set to true in the app config.
# For development, this must be set to false as it is
# on a local environment
app.forceGlobalSecureRequests=false
app.baseURL="http://localhost:8080/"
app.mediaBaseURL="http://localhost:8080/"
admin.gateway="cp-admin"
auth.gateway="cp-auth"
database.default.hostname="mariadb"
database.default.database="castopod"
database.default.username="castopod"
database.default.password="castopod"
cache.handler="redis"
cache.redis.host = "redis"
# You may not want to use redis as your cache handler
# Comment/remove the two lines above and uncomment
# the next line for file caching.
#cache.handler="file"
```
> _NB._ You can tweak your environment by setting more environment variables
> in your custom `.env` file. See the `env` for examples or the
> [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html)
> for more info.
3. (for docker desktop) Add the repository you've cloned to docker desktop's
`Settings` > `Resources` > `File Sharing`
### 2. (recommended) Develop inside the app Container with VSCode
If you're working in VSCode, you can take advantage of the `.devcontainer/`
folder. It defines a development environment (dev container) with preinstalled
requirements and VSCode extensions so you don't have to worry about them. All
required services will be loaded automagically! 🪄
1. Install the VSCode extension
[Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
2. `Ctrl/Cmd + Shift + P` > `Open in container`
> The VSCode window will reload inside the dev container. Expect several
> minutes during first load as it is building all necessary services.
**Note**: The dev container will start by running Castopod's php server.
During development, you will have to start [Vite](https://vitejs.dev)'s dev
server for compiling the typescript code and styles:
```bash
# run Vite dev server
npm run dev
```
If there is any issue with the php server not running, you can restart them
using the following commands:
```bash
# run Castopod server
php spark serve - 0.0.0.0
```
3. You're all set! 🎉
You're now **inside the dev container**, you may use the VSCode console
(`Terminal` > `New Terminal`) to run any command:
```bash
# PHP is installed
php -v
# Composer is installed
composer -V
# npm is installed
npm -v
# git is installed
git version
```
For more info, see
[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers)
### 3. Start hacking
You're all set! Start working your magic by updating the project's files! Help
yourself to the
[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for
more insights.
To see your changes, go to:
- `http://localhost:8080/` for the Castopod app
- `http://localhost:8888/` for the phpmyadmin interface:
- username: **castopod**
- password: **castopod**
### 2-alt. Develop outside the app container
You do not wish to use the VSCode devcontainer? No problem!
1. Start docker containers manually:
Go to project's root folder and run:
```bash
# starts all services declared in docker-compose.yml file
# -d option starts the containers in the background
docker-compose up -d
# See all running processes (you should see 3 processes running)
docker-compose ps
# Alternatively, you can check all docker processes
docker ps -a
```
> The `docker-compose up -d` command will boot 4 containers in the
> background:
>
> - `castopod_app`: a php based container with Castopod requirements
> installed
> - `castopod_redis`: a [redis](https://redis.io/) database to handle queries
> and pages caching
> - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for
> persistent data
> - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb
> database.
2. Run any command inside the containers by prefixing them with
`docker-compose run --rm app`:
```bash
# use PHP
docker-compose run --rm app php -v
# use Composer
docker-compose run --rm app composer -V
# use npm
docker-compose run --rm app npm -v
# use git
docker-compose run --rm app git version
```
---
## Going Further
### Install Castopod's dependencies
1. Install php dependencies with [Composer](https://getcomposer.org/)
```bash
composer install
```
::: info Note
The php dependencies aren't included in the repository. Composer will check
the `composer.json` and `composer.lock` files to download the packages with
the right versions. The dependencies will live under the `vendor/` folder.
For more info, check out the
[Composer documentation](https://getcomposer.org/doc/).
:::
2. Install javascript dependencies with [npm](https://www.npmjs.com/)
```bash
npm install
```
::: info Note
The javascript dependencies aren't included in the repository. Npm will check
the `package.json` and `package.lock` files to download the packages with the
right versions. The dependencies will live under the `node_module` folder.
For more info, check out the [NPM documentation](https://docs.npmjs.com/).
:::
3. Generate static assets:
```bash
# build all static assets at once
npm run build:static
# build specific assets
npm run build:icons
npm run build:svg
```
::: info Note
The static assets generated live under the `public/assets` folder, it
includes javascript, styles, images, fonts, icons and svg files.
:::
### Initialize and populate database
::: tip
You may skip this section if you go through the install wizard (go to
`/cp-install`).
:::
1. Build the database with the migrate command:
```bash
# loads the database schema during first migration
php spark migrate -all
```
You may need to undo the migration (rollback):
```bash
# rolls back database schema (deletes all tables and their content)
php spark migrate:rollback
```
2. Populate the database with the required data:
```bash
# Populates all required data
php spark db:seed AppSeeder
```
You may choose to add data separately:
```bash
# Populates all categories
php spark db:seed CategorySeeder
# Populates all Languages
php spark db:seed LanguageSeeder
# Populates all podcasts platforms
php spark db:seed PlatformSeeder
# Populates all Authentication data (roles definition…)
php spark db:seed AuthSeeder
```
3. (optionnal) Populate the database with test data:
- Populate test data (login: admin / password: AGUehL3P)
```bash
php spark db:seed TestSeeder
```
- Populate with fake podcast analytics:
```bash
php spark db:seed FakePodcastsAnalyticsSeeder
```
- Populate with fake website analytics:
```bash
php spark db:seed FakeWebsiteAnalyticsSeeder
```
TestSeeder will add an active superadmin user with the following credentials:
- username: **admin**
- password: **AGUehL3P**
### Useful docker / docker-compose commands
- Monitor the app container:
```bash
docker-compose logs --tail 50 --follow --timestamps app
```
- Interact with redis server using included redis-cli command:
```bash
docker exec -it castopod_redis redis-cli
```
- Monitor the redis container:
```bash
docker-compose logs --tail 50 --follow --timestamps redis
```
- Monitor the mariadb container:
```bash
docker-compose logs --tail 50 --follow --timestamps mariadb
```
- Monitor the phpmyadmin container:
```bash
docker-compose logs --tail 50 --follow --timestamps phpmyadmin
```
- Restart docker containers:
```bash
docker-compose restart
```
- Destroy all containers, opposite of `up` command:
```bash
docker-compose down
```
- Rebuild app container:
```bash
docker-compose build app
```
Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and
[docker-compose](https://docs.docker.com/compose/reference/) documentations for
more insights.
## Known issues
### Allocation failed - JavaScript heap out of memory
This happens when running `npm install`.
👉 By default, docker might not have access to enough RAM. Allocate more memory
and run `npm install` again.
### (Linux) Files created inside container are attributed to root locally
You may use Linux user namespaces to fix this on your machine:
::: info Note
Replace "username" with your local username
:::
1. Go to `/etc/docker/daemon.json` and add:
```json
{
"userns-remap": "username"
}
```
2. Configure the subordinate uid/guid:
```bash
# in /etc/subuid
username:1000:1
username:100000:65536
```
```bash
# in /etc/subgid
username:1000:1
username:100000:65536
```
3. Restart docker:
```bash
sudo systemctl restart docker
```
4. That's it! Now, the root user in the container will be mapped to the user on
your local machine, no more permission issues! 🎉
You can check
[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/)
to know more about how it works.

View file

@ -0,0 +1,4 @@
{
"label": "Getting Started",
"position": 2
}

View file

@ -0,0 +1,154 @@
---
title: Installation
sidebarDepth: 3
---
# How to install Castopod?
Castopod was thought-out to be easy to install. Whether using dedicated or
shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.0 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
- HTTPS support
### PHP v8.0 or higher
PHP version 8.0 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)
- [mbstring](https://php.net/manual/en/mbstring.installation.php)
- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**,
**PNG** and **WEBP** libraries.
Additionally, make sure that the following extensions are enabled in your PHP:
- json (enabled by default - don't turn it off)
- xml (enabled by default - don't turn it off)
- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
### MySQL compatible database
> We recommend using [MariaDB](https://mariadb.org).
::: warning
Castopod only works with supported MySQL 5.7 or higher compatible databases. It
will break with the previous MySQL v5.6 for example as its end of life was on
February 5, 2021.
:::
You will need the server hostname, database name, username and password to
complete the installation process. If you do not have these, please contact your
server administrator.
#### Privileges
User must have at least these privileges on the database for Castopod to work:
`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`.
### (Optional) FFmpeg v4.1.8 or higher for Video Clips
[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you
want to generate Video Clips. The following extensions must be installed:
- **FreeType 2** library for
[gd](https://www.php.net/manual/en/image.installation.php).
### (Optional) Other recommendations
- Redis for better cache performances.
- CDN for static files caching and better performances.
- e-mail gateway for lost passwords.
## Install instructions
### Pre-requisites
0. Get a Web Server with [requirements](#requirements) installed
1. Create a MySQL database for Castopod with a user having access and
modification privileges (for more info, see
[MySQL compatible database](#mysql-compatible-database)).
2. Activate HTTPS on your domain with an _SSL certificate_.
3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto
the web server if you havent already.
- ⚠️ Set the web server document root to the `public/` sub-folder within the
`castopod` folder.
4. Add **cron tasks** on your web server for various background processes
(replace the paths accordingly):
- For social features to work properly, this task is used to broadcast social
activities to your followers on the fediverse:
```bash
* * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities
```
- For Video Clips to be created (see
[FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)):
```bash
* * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips
```
> These tasks run **every minute**. You may set the frequency depending on
> your needs: every 5, 10 minutes or more.
### (recommended) Install Wizard
1. Run the Castopod install script by going to the install wizard page
(`https://your_domain_name.com/cp-install`) in your favorite web browser.
2. Follow the instructions on your screen.
3. Start podcasting!
::: info Note
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can
[create and update the `.env` file manually](#alternative-manual-configuration).
:::
## Community packages
If you don't want to bother with installing Castopod manually, you may use one
of the packages created and maintained by the open-source community.
### Install with YunoHost
[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux
made up of free and open-source software packages. It manages the hardships of
self-hosting for you.
<div class="flex flex-wrap items-center gap-4">
<a href="https://install-app.yunohost.org/?app=castopod" target="_blank" rel="noopener noreferrer">
<img src="https://install-app.yunohost.org/install-with-yunohost.svg" alt="Install Castopod with YunoHost" class="align-middle" />
</a>
<a href="https://github.com/YunoHost-Apps/castopod_ynh" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"><svg
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em"
class="text-xl"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 6.84 9.49c.5.09.69-.21.69-.48l-.02-1.86c-2.51.46-3.16-.61-3.36-1.18-.11-.28-.6-1.17-1.02-1.4-.35-.2-.85-.66-.02-.67.79-.01 1.35.72 1.54 1.02.9 1.52 2.34 1.1 2.91.83a2.1 2.1 0 0 1 .64-1.34c-2.22-.25-4.55-1.11-4.55-4.94A3.9 3.9 0 0 1 6.68 8.8a3.6 3.6 0 0 1 .1-2.65s.83-.27 2.75 1.02a9.28 9.28 0 0 1 2.5-.34c.85 0 1.7.12 2.5.34 1.9-1.3 2.75-1.02 2.75-1.02.54 1.37.2 2.4.1 2.65.63.7 1.02 1.58 1.02 2.68 0 3.84-2.34 4.7-4.56 4.94.36.31.67.91.67 1.85l-.01 2.75c0 .26.19.58.69.48A10.02 10.02 0 0 0 22 12 10 10 0 0 0 12 2z"/></svg>Github
Repo</a>
</div>
### Install with Docker
I you wish to use Docker to install Castopod, it is possible thanks to
[Romain de Laage](https://podcastindex.social/web/@rdelaage@mamot.fr)!
<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
with
Docker<svg viewBox="0 0 24 24" width="1em" height="1em" class="text-xl text-pine-200"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a>
::: info Note
Given high demand for docker, we are planning on maintaining an official Docker
image directly into the Castopod repository.
:::

View file

@ -0,0 +1,26 @@
---
title: Security
---
# Security concerns
Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP
framework that encourages
[good security practices](https://codeigniter.com/user_guide/concepts/security.html).
To maximize your instance's safety and prevent any malicious attack, we
recommend you update all your Castopod files permissions after installation or
updates (to avoid any prior permission error):
- `writable/` folder must be **readable** and **writable**.
- `public/media/` folder must be **readable** and **writable**.
- any other file must be set to **readonly**.
For instance, if you are using Apache or NGINX with Ubuntu you may do the
following:
```bash
sudo chown -R root:root /path/to/castopod
sudo chown -R www-data:www-data /path/to/castopod/writable
sudo chown -R www-data:www-data /path/to/castopod/public/media
```

View file

@ -0,0 +1,93 @@
---
title: Update
sidebarDepth: 3
---
# How to update Castopod?
After installing Castopod, you may want to update your instance to the latest
version in order to enjoy the latest features ✨, bug fixes 🐛 and performance
improvements ⚡.
## Automatic update instructions
> Coming soon... 👀
## Manual update instructions
1. Go to the
[releases page](https://code.castopod.org/ad-aures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version
- cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
3. On your server:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
4. Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/ad-aures/castopod/-/releases)).
They are usually database migration scripts in `.sql` format to update your
database schema.
- 👉 Make sure you run the scripts on your phpmyadmin panel or using command
line to update the database along with the package files!
- cf.
[I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
5. If you are using redis, clear your cache.
6. ✨ Enjoy your fresh instance, you're all done!
## Frequently asked questions (FAQ)
### Where can I find my Castopod version?
Go to your Castopod admin panel, the version is displayed on the bottom left
corner.
Alternatively, you can find the version in the `app > Config > Constants.php`
file.
### I haven't updated my instance in a long time… What should I do?
No problem! Just get the latest release as described above. Only, when going
through the release instructions (4), perform them sequentially, from the oldest
to the newest.
> You may want to backup your instance depending on how long you haven't updated
> Castopod.
For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
`v1.0.0-beta.1`:
0. (highly recommended) Make a backup of your files and database.
1. Download the latest release, overwrite your files whilst keeping `.env` and
`public/media`.
2. Go through each release update instructions sequentially (from oldest to
newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`,
`v1.0.0-alpha.45`, …, `v1.0.0-beta.1`.
3. ✨ Enjoy your fresh instance, you're all done!
### Should I make a backup before updating?
We advise you do, so you don't lose everything if anything goes wrong!
More generally, we advise you make regular backups of your Castopod files and
database to prevent you from losing it all…

207
docs/src/index.md Normal file
View file

@ -0,0 +1,207 @@
---
sidebarDepth: 2
---
# Welcome 👋
[![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![discord-badge]][discord]&nbsp;[![stars-badge]][stars]
Castopod is a free & open-source hosting platform made for podcasters who want
engage and interact with their audience.
Castopod is easy to install and was built on top of
[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very
small footprint.
::: info Note
Castopod is currently in **beta** but already quite stable and used by
podcasters around&nbsp;the&nbsp;world!
:::
<div class="flex items-center">
<a href="/getting-started/install" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-full shadow gap-x-1 bg-pine-500 hover:no-underline hover:bg-pine-600">Install<svg viewBox="0 0 24 24" width="1em" height="1em" class="text-xl text-pine-200"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a>
</div>
## Features
- 🌱 &nbsp;Free & open-source (AGPL v3 License)
- 🔐 &nbsp;Focused on data sovereignty: your content, audience, and analytics
belong to you, and&nbsp;you&nbsp;only
- 🪄 &nbsp;Podcasting 2.0 features: GUID, locked, transcripts, funding, chapters,
location, persons, soundbites, …
- 💬 &nbsp;Built-in social network:
- 🚀 &nbsp;Castopod is part of the Fediverse, a decentralized social network
- ❤️ &nbsp;Create posts, share, favourite, and comment on episodes
- 📈 &nbsp;Built-in analytics:
- ⚖️ &nbsp;GDPR / CCPA / LGPD compliant
- 🪙 &nbsp;Standard IABv2 audience measurement
- 🏡 &nbsp;On-premises analytics, no third party involved
- 📢 &nbsp;Built-in marketing tools:
- ✅ &nbsp;SEO ready (open-graph meta-tags, JSON-LD, …)
- 📱 &nbsp;PWA: install as a standalone app
- 🎨 &nbsp;Customizable theme colors
- 🎬 &nbsp;Generate ready-to-share Video clips from episodes
- 🎵 &nbsp;Generate Soundbites
- ▶️ &nbsp;Embeddable player, embed your episodes on any website
- 💸 &nbsp;Monetization
- 🔗 &nbsp;Funding links
- 📲 &nbsp;listen-to-click ads
- 🤝 &nbsp;value4value / WebMonetization
- 📡 &nbsp;Publish and broadcast everywhere with RSS: Podcast Index, Apple
Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- 📥 &nbsp;Podcast import: move your existing podcast into Castopod
- 📤 &nbsp;Move your podcast out of Castopod
- 🔀 &nbsp;Multi-tenant: host as many podcasts as you want
- 👥 &nbsp;Multi-user: add contributors and set roles
- 🌎 &nbsp;i18n support: translated in English & French, and more to come!
## Motivation
The podcasting ecosystem is decentralized by nature: you can create your podcast
as an RSS file, publish it on the web and have it shared everywhere online.
It is in fact one of the only media to have stayed this way for a long time.
As usages are evolving, more and more people are getting into podcasts: whether
it is creators finding new ways to share their ideas, or listeners in the search
for better content.
With podcasting becoming more widely used, some companies are trying to shift it
towards a more controlled and centralized medium.
Castopod was created in an effort to provide an open and sustainable alternative
to hosting your podcasts, promoting decentralization to ensure that podcasters
creativity can express itself.
This project is pushed by the open-source community, and specifically by the
[Fediverse](https://fediverse.party/en/fediverse/) and
[Podcasting 2.0](https://podcastindex.org/) movements.
## Comparison with other solutions
We believe that a solution is not necessarily right for everyone, it highly
depends on your needs. So, here are comparisons with other tools to help you to
gauge whether Castopod is the right fit for you.
### Castopod vs Wordpress
Castopod is often referred to as "the Wordpress for podcasts" because of the
similarities between the two. In some ways this is true. And actually, Castopod
was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption
from the community and the number of websites running it.
Just like Wordpress, Castopod is free & open source, built using PHP with a
MySQL database and is packaged in a way that you can easily install on most web
servers.
Wordpress is a great way to create your website and extend it with plugins to
get what you want. It is a full fledged CMS that helps you get any type of
website online.
On the other hand, Castopod is meant to address the podcasters needs
specifically, focusing on podcasting, and nothing else. You don't need any
plugin to get you started on your podcasting journey.
This allows optimizing the processes specific to podcasting: ranging from the
creation of your podcasts and the publication of new episodes all the way to
broadcasting, marketing and analytics.
Finally, depending on your needs, Wordpress and Castopod can even live side by
side as they share the same requirements!
### Castopod vs Funkwhale
Funkwhale is a self-hosted, modern free and open-source music server. Just as
Castopod, Funkwhale is on the fediverse, a decentralized social network allowing
interoperability between the two.
Funkwhale was initially built around music. And later on, as the project
evolved, the ability to host podcasts was introduced.
Unlike Funkwhale, Castopod has been designed and built around podcasting
exclusively. This allows easier implementation for features related to the
podcasting ecosystem, such as the podcasting 2.0 features (transcripts,
chapters, locations, persons, …).
So, you should probably use Funkwhale if you want to host your music, and use
Castopod if you want to host your podcasts.
### Castopod vs other podcast hosts
There are many solutions for you to host your podcasts, some of which are really
great and [a lot of them](https://podcastindex.org/apps) are jumping into the
Podcasting 2.0 wagon just like Castopod!
Each of these solutions differ from one another, you may compare with the
[list of features](#features).
That being said, there are two main differences with any other podcasting
solution:
- Castopod can be self-hosted and is the only solution that allows you to keep
full control over what you produce. Also, as it is open-source, you can even
customize it as you wish.
- Castopod is the only solution that currently integrates both a decentralized
social network with ActivityPub as well as many of the podcasting 2.0
features, hoping to bridge the gap between the two.
## Contributing
Love Castopod and would like to help? Take a look at the following documentation
to get you started.
### Code of conduct
Castopod has adopted a Code of Conduct that we expect project participants to
adhere to. Please read the
[CODE_OF_CONDUCT manual](https://code.castopod.org/ad-aures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be tolerated.
### Contributing guide
Read our [contributing guide](./contributing/guidelines.md) to learn about our
development process, how to propose bugfixes and improvements, and how to build
and test your changes to Castopod.
## Contact
You may reach us for help or ask any question you have on:
- [Discord](https://castopod.org/discord) (for direct interaction with
developers and the community)
- [Issue tracker](https://code.castopod.org/ad-aures/castopod/-/issues) (for
feature requests & bug reports)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Sponsors
<div class="flex flex-wrap gap-x-16 gap-y-8">
<a href="https://adaures.com/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/adaures.svg" alt="Ad Aures Logo" class="h-16" /></a>
<a href="https://nlnet.nl/project/Castopod/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/nlnet.svg" alt="NLnet Logo" class="h-16" /></a>
<a href="https://opencollective.com/castopod/contribute" class="inline-flex items-center font-semibold text-black underline gap-x-1 decoration-pine-500 decoration-4 hover:no-underline" target="_blank" rel="noopener noreferrer">Become a sponsor<svg viewBox="0 0 24 24" class="h-6"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a>
</div>
[release]: https://code.castopod.org/ad-aures/castopod/-/releases
[release-badge]:
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
[license]: https://code.castopod.org/ad-aures/castopod/-/blob/beta/LICENSE.md
[license-badge]:
https://img.shields.io/github/license/ad-aures/castopod?color=blue
[semantic-release]: https://github.com/semantic-release/semantic-release
[semantic-release-badge]:
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
[discord]: https://castopod.org/discord
[discord-badge]: https://img.shields.io/badge/chat-on%20discord-7389D8
[stars]: https://github.com/ad-aures/castopod/stargazers
[stars-badge]:
https://img.shields.io/github/stars/ad-aures/castopod?style=social

BIN
docs/src/public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View file

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 324 65">
<path fill="#009486" d="M26.6 40.2c-1.4 1.3-3 2.3-4.9 3.1-1.9.7-4 1.1-6.2 1.1-3 0-5.6-.6-8-1.9-2.3-1.3-4.2-3-5.5-5.2-1.3-2.2-2-4.7-2-7.5s.7-5.3 2-7.5 3.2-3.9 5.5-5.2c2.3-1.3 5-1.9 8-1.9 2.2 0 4.3.4 6.2 1.1 1.9.7 3.5 1.7 4.9 3.1l-5.7 5.4c-1.3-1.7-3.1-2.5-5.4-2.5-2.1 0-3.8.7-5.1 2.2-1.3 1.4-2 3.2-2 5.4s.7 4 2 5.4c1.3 1.4 3 2.2 5.1 2.2 2.2 0 4-.8 5.4-2.5l5.7 5.2ZM31.1 36.1c0-1.9.5-3.5 1.6-5s2.6-2.6 4.4-3.5c1.9-.9 4.1-1.3 6.5-1.3a23.36 23.36 0 0 1 5 .5c-.6-3.1-2.8-4.6-6.7-4.6-2.3 0-4.5.9-6.8 2.6L32.3 18c1.9-.9 3.9-1.6 5.8-2.1 1.9-.4 3.7-.7 5.4-.7 2.7 0 5.1.5 7.1 1.5s3.5 2.5 4.6 4.3c1.1 1.9 1.7 4 1.7 6.6v16.2h-6.8l-.5-3c-1 1.1-2.3 2-3.8 2.6-1.5.6-3.2 1-5 1-2.8 0-5.2-.8-7-2.3a7.42 7.42 0 0 1-2.7-6Zm8-1.8c0 .9.4 1.7 1.1 2.3.7.6 1.7.9 2.8.9 1.6 0 3-.5 4.1-1.5 1.1-1 1.6-2.2 1.6-3.6v-.6c-.7-.2-1.4-.4-2.2-.5-.8-.1-1.6-.2-2.3-.2-1.6 0-2.8.3-3.7.8-.9.5-1.4 1.3-1.4 2.4ZM61.9 40.3l3.8-6.1c1.6 1.1 3.1 1.9 4.4 2.5 1.4.6 2.6.9 3.6.9.8 0 1.5-.2 2-.6.5-.4.8-.9.8-1.4 0-.8-.5-1.5-1.4-2-.9-.5-2-1-3.3-1.5-1.3-.5-2.6-1.2-3.9-1.8-1.3-.7-2.4-1.6-3.3-2.7a6.4 6.4 0 0 1-1.3-4.2c0-2.4.9-4.3 2.8-5.9 1.9-1.5 4.5-2.3 8-2.3 1.7 0 3.5.2 5.3.6 1.9.4 3.6 1.1 5.1 2l-3.6 6.1c-.8-.5-1.9-1-3.2-1.4-1.3-.4-2.4-.6-3.4-.6-.5 0-1.1.1-1.7.3-.6.2-.9.6-.9 1.2 0 .7.4 1.3 1.3 1.7.9.4 1.9.9 3.1 1.4 1.3.5 2.6 1.1 4 1.8s2.5 1.6 3.5 2.7c.9 1.1 1.4 2.6 1.4 4.4 0 1.8-.5 3.4-1.5 4.7-1 1.3-2.4 2.3-4 3-1.7.7-3.5 1.1-5.6 1.1-1.9 0-3.9-.3-6-1-2.1-.5-4.1-1.5-6-2.9ZM88.6 15.8h4.6v-7h8.1v7h6.8v7h-6.8v10.3c0 1.3.4 2.4 1.3 3.1.9.8 1.9 1.1 3.2 1.1 1 0 2-.2 3-.6v6.6c-1.8.7-3.5 1-5.2 1-3.3 0-5.9-.9-7.7-2.7-1.8-1.8-2.7-4.3-2.7-7.7V22.5h-4.6v-6.7ZM113.1 29.8c0-2.8.6-5.3 2-7.5 1.3-2.2 3.1-3.9 5.3-5.2 2.3-1.3 4.8-1.9 7.7-1.9 2.9 0 5.4.6 7.7 1.9 2.2 1.3 4 3 5.3 5.2 1.3 2.2 2 4.7 2 7.5s-.7 5.3-2 7.5-3.1 3.9-5.3 5.2c-2.2 1.3-4.8 1.9-7.7 1.9-2.9 0-5.5-.6-7.7-1.9-2.3-1.3-4-3-5.3-5.2-1.4-2.2-2-4.7-2-7.5Zm7.8 0c0 2.2.7 4 2 5.4 1.3 1.4 3 2.2 5.1 2.2 2.1 0 3.8-.7 5.1-2.2 1.3-1.4 2-3.2 2-5.4s-.7-4-2-5.4a6.87 6.87 0 0 0-5.1-2.2c-2.1 0-3.8.7-5.1 2.2-1.3 1.4-2 3.2-2 5.4ZM148.4 15.8h7.6l.2 3c1.2-1.1 2.6-2 4.1-2.7 1.6-.6 3.3-.9 5.1-.9 2.6 0 5 .6 7 1.9 2.1 1.3 3.7 3 4.9 5.2 1.2 2.2 1.8 4.7 1.8 7.5s-.6 5.3-1.8 7.5c-1.2 2.2-2.8 3.9-4.9 5.2-2.1 1.3-4.4 1.9-7 1.9-1.8 0-3.4-.3-4.9-.9-1.5-.6-2.9-1.4-4-2.5v23.8h-8.1v-49Zm15.2 6.4c-2.1 0-3.8.7-5.1 2.2-1.3 1.4-2 3.2-2 5.4s.7 4 2 5.4c1.3 1.4 3 2.2 5.1 2.2 2.1 0 3.8-.7 5.1-2.2 1.3-1.4 2-3.2 2-5.4s-.7-4-2-5.4a6.67 6.67 0 0 0-5.1-2.2ZM182.4 29.8c0-2.8.6-5.3 2-7.5 1.3-2.2 3.1-3.9 5.3-5.2 2.3-1.3 4.8-1.9 7.7-1.9 2.9 0 5.4.6 7.7 1.9 2.2 1.3 4 3 5.3 5.2 1.3 2.2 2 4.7 2 7.5s-.7 5.3-2 7.5-3.1 3.9-5.3 5.2c-2.2 1.3-4.8 1.9-7.7 1.9-2.9 0-5.5-.6-7.7-1.9-2.3-1.3-4-3-5.3-5.2-1.3-2.2-2-4.7-2-7.5Zm7.9 0c0 2.2.7 4 2 5.4 1.3 1.4 3 2.2 5.1 2.2 2.1 0 3.8-.7 5.1-2.2 1.3-1.4 2-3.2 2-5.4s-.7-4-2-5.4a6.87 6.87 0 0 0-5.1-2.2c-2.1 0-3.8.7-5.1 2.2-1.3 1.4-2 3.2-2 5.4ZM215.8 29.8c0-2.8.6-5.3 1.8-7.5 1.2-2.2 2.8-3.9 4.9-5.2 2.1-1.3 4.4-1.9 7-1.9 1.8 0 3.4.3 4.9.9 1.5.6 2.9 1.4 4 2.5V0h8.1v43.9h-7.6l-.2-3c-1.2 1.1-2.6 2-4.1 2.7-1.6.6-3.3.9-5.1.9-2.6 0-5-.6-7-1.9-2.1-1.3-3.7-3-4.9-5.2-1.2-2.3-1.8-4.8-1.8-7.6Zm8.3 0c0 2.2.7 4 2 5.4 1.3 1.4 3 2.2 5.1 2.2 2.1 0 3.8-.7 5.1-2.2 1.3-1.4 2-3.2 2-5.4s-.7-4-2-5.4a6.87 6.87 0 0 0-5.1-2.2c-2.1 0-3.8.7-5.1 2.2-1.3 1.4-2 3.2-2 5.4ZM318.7 44h-10.82s-1.13-2.41-1.6-3.26c-.45-.86-1.55-.82-1.55-.82h-29.38s-1.07-.14-1.6.82c-.57.95-1.63 3.26-1.63 3.26h-10.65a4.47 4.47 0 0 1-4.47-4.44V4.47A4.47 4.47 0 0 1 261.44 0h57.23a4.47 4.47 0 0 1 4.47 4.44v35.09a4.45 4.45 0 0 1-4.43 4.47Z"></path>
<path fill="#E7F9E4" d="M274.95 9.51h30.2a9.34 9.34 0 0 1 9.4 9.44c0 5.18-4.22 9.4-9.4 9.4h-30.2a9.42 9.42 0 0 1 0-18.84Z"></path>
<path fill="#009486" d="M302.77 15.36a4.61 4.61 0 0 0-3.64 7.46s1.58-1.18 3.8-1.18c1.67 0 3.6 1.01 3.6 1.01a4.61 4.61 0 0 0-3.76-7.29ZM277.23 15.36a4.61 4.61 0 0 0-3.77 7.3s1.94-1.02 3.6-1.02c2.23 0 3.8 1.18 3.8 1.18a4.61 4.61 0 0 0-3.64-7.45Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,10 @@
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 104 20"
fill="#2A2D7C"
height="4rem"
>
<path
d="M38.56 6.39v9.18h-2.44l-.27-.65a4.35 4.35 0 01-2.77 1A4.68 4.68 0 0128.26 11a4.66 4.66 0 014.82-4.86 4.37 4.37 0 012.8 1l.33-.71zm-3 4.6a2.06 2.06 0 10-4.11 0 2.06 2.06 0 104.11 0zM50.25 3.09v12.49h-2.34l-.3-.68a4.22 4.22 0 01-2.77 1A4.68 4.68 0 0140 11a4.68 4.68 0 014.84-4.9 4.25 4.25 0 012.28.64V3.09zM47.32 11a2.06 2.06 0 10-4.11 0 2.06 2.06 0 104.11 0zM65.69 6.39v9.18h-2.44l-.25-.65a4.33 4.33 0 01-2.77 1A4.67 4.67 0 0155.4 11a4.65 4.65 0 014.81-4.86 4.35 4.35 0 012.8 1l.33-.71zm-3 4.6a2.06 2.06 0 10-4.11 0 2.06 2.06 0 104.11 0zM67.57 11.64V6.4h3.16v5.1c0 1 .52 1.54 1.37 1.54s1.35-.58 1.35-1.54V6.4h3.16v5.24c0 2.57-1.8 4.24-4.51 4.24s-4.53-1.67-4.53-4.24zM84.46 6.36v2.89h-1.23c-1.12 0-1.59.49-1.59 1.66v4.67h-3.16V6.4h2.12l.49 1a3.07 3.07 0 012.53-1.06zM95 10.91a5.9 5.9 0 01-.06.83h-6.86a1.79 1.79 0 001.92 1.6 1.85 1.85 0 001.66-.86h3.14A5 5 0 0185 11a5 5 0 0110-.08zM88.14 10h3.71A1.84 1.84 0 0090 8.58 1.77 1.77 0 0088.14 10zM99.94 15.88c-2.5 0-4-1.32-4-3.31h3a.94.94 0 001.07 1c.46 0 .9-.23.9-.71s-.69-.68-1.57-.82C97.9 11.79 96 11.36 96 9.13c0-1.84 1.57-3 3.92-3s3.86 1.25 3.89 3.11h-3c0-.59-.39-.86-1-.86s-.85.25-.85.67.7.65 1.57.8c1.45.26 3.38.56 3.38 2.89 0 1.92-1.62 3.17-4.06 3.17zM0 0v20h20V0zm13.34 12.66a3.84 3.84 0 01-2.51 3.6 3.9 3.9 0 01-1.33.24 3.84 3.84 0 01-1.33-7.44 1 1 0 011.32.61A1 1 0 018.88 11a1.78 1.78 0 001.24 3.34 1.76 1.76 0 001.16-1.67V7.19a1.64 1.64 0 00-3.28 0 1 1 0 11-2 0 3.69 3.69 0 017.38 0z"
></path>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,64 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 449 168" height="4rem">
<path
fill="#98bf00"
d="m446.6 73.88 2.5-13.65h-12.9l3.76-20.08-15.45 6.04-2.5 14.04h-9.4l-2.5 13.65h9.25l-3.15 17.3c-.14.94-.4 2.34-.64 4.14-.25 1.8-.4 3.4-.4 4.75.04 6.25 1.54 11.4 4.5 15.45 2.94 4.14 7.74 6.59 14.44 7.34l6.44-13.3c-3.44-.44-6.04-1.8-7.89-4.1-1.85-2.34-2.75-5.3-2.75-8.89 0-.7.1-1.7.25-3.05.15-1.35.3-2.45.45-3.3l3-16.34h13ZM310.7 72.33c2.4-.85 4.5-1.3 6.26-1.3 1.9 0 3.5.55 4.8 1.65 1.24 1.05 1.84 2.6 1.84 4.75 0 .6-.1 1.5-.3 2.75-.2 1.15-.35 2.2-.5 3.1l-3.6 16.89-.75 4.05c-.25 1.45-.34 2.7-.34 3.75 0 4.05 1.1 7.44 3.34 10.14 2.15 2.7 6 4.3 11.55 4.75l6.35-12.84c-2.16-.35-3.7-1.15-4.65-2.4-1-1.2-1.5-2.9-1.5-5.05 0-.5.05-1.1.15-1.75.05-.65.15-1.2.2-1.6l3.64-17.2c.3-1.44.56-2.9.75-4.34.2-1.4.3-2.8.3-4.15 0-4.95-1.44-8.94-4.34-11.9-2.95-2.94-7.05-4.44-12.3-4.44-3.05 0-5.94.5-8.8 1.5-2.8.95-6.2 2.54-10.14 4.9a17.35 17.35 0 0 0-2.8-6.75l-13.4 5.75a20.5 20.5 0 0 1 2.6 5.5 21.16 21.16 0 0 1 .56 8.4c-.1 1.14-.25 2.04-.4 2.69l-7.95 42.33h14.4l8.44-45.68a23.33 23.33 0 0 1 6.6-3.5Z"
></path>
<path
fill="#98bf00"
fill-rule="evenodd"
d="M350.74 80.08c-1.55 4.6-2.3 9.5-2.3 14.64 0 4.5.6 8.5 1.75 12s2.8 6.44 4.9 8.8a20.1 20.1 0 0 0 7.55 5.44 25.05 25.05 0 0 0 9.84 1.9c4.35 0 8.65-.8 12.95-2.4a30.3 30.3 0 0 0 11.4-7.44l-5.4-12.5c-2.5 2.8-5.25 4.9-8.3 6.35a21.07 21.07 0 0 1-9.1 2.15c-3.5 0-6.24-1.1-8.24-3.3a12.35 12.35 0 0 1-2.95-8.35v-.95c0-.4.05-.8.15-1.2a203.42 203.42 0 0 0 19.19-3.5c3.45-.84 6.8-1.8 10.1-2.8 3.24-1 6.14-2.05 8.6-3.1v-5.74c0-3.55-.56-6.75-1.66-9.6a23.32 23.32 0 0 0-4.6-7.2c-1.94-2-4.3-3.5-6.94-4.5a22.59 22.59 0 0 0-8.5-1.6c-4.45 0-8.6 1-12.34 2.96a28.48 28.48 0 0 0-9.7 8.1 38.55 38.55 0 0 0-6.4 11.84Zm21.64-10.1c1.55-.85 3.3-1.25 5.25-1.25 2.65 0 4.85.85 6.6 2.6 1.75 1.7 2.65 4.25 2.65 7.7-1.45.45-3.15 1-5.15 1.55-2.05.5-4.1 1-6.2 1.45-2.15.45-4.2.9-6.24 1.3l-5.3.9c.24-2.1.7-4.1 1.4-5.95.75-1.85 1.7-3.5 2.84-4.9 1.25-1.4 2.6-2.55 4.15-3.4Z"
></path>
<path
fill-rule="evenodd"
d="M404.17 140.45c0-1.25-.2-2.4-.6-3.4-.4-1-.95-1.84-1.6-2.6-.7-.7-1.5-1.24-2.45-1.6-.95-.34-2-.54-3.1-.54a9.95 9.95 0 0 0-7.34 3.2 11.49 11.49 0 0 0-3.1 7.9c0 1.24.2 2.34.6 3.4.35 1 .9 1.84 1.6 2.54.65.75 1.5 1.3 2.44 1.7.95.35 2 .55 3.15.55a9.87 9.87 0 0 0 7.3-3.2c.95-.95 1.7-2.15 2.25-3.5s.85-2.84.85-4.45Zm-13.9-.05c.3-.9.7-1.7 1.2-2.4.55-.7 1.2-1.25 1.96-1.7a4.66 4.66 0 0 1 2.5-.64c1.44 0 2.5.45 3.24 1.34.75.86 1.15 2.1 1.15 3.65 0 .95-.15 1.9-.45 2.85a6.75 6.75 0 0 1-3.15 4.1c-.75.4-1.6.6-2.5.6-1.45 0-2.5-.45-3.24-1.3a5.5 5.5 0 0 1-1.16-3.65c0-.94.16-1.9.46-2.85Z"
></path>
<path
d="M434.56 132.56H431l-1.9 11.04c-.05.15-.1.4-.1.75v.85h-.15l-6.4-12.64h-3.35l-3.34 18.74h3.6l2-11.3c.04-.14.04-.4.04-.64v-.86h.15l6.55 12.95 3.2-.3 3.25-18.6ZM374.38 132.56h-3.65l-3.34 18.74h3.7l3.3-18.74Z"
></path>
<path
fill-rule="evenodd"
d="M328.95 132.56h-4.25c-.8 1.35-1.65 2.9-2.6 4.55-.95 1.64-1.85 3.34-2.75 5.04-.9 1.7-1.7 3.35-2.44 4.95-.75 1.6-1.36 3-1.8 4.2h3.84c.16-.35.3-.8.5-1.25.2-.45.4-.95.66-1.4l.6-1.35c.2-.45.4-.85.54-1.2h6.5c.05.45.05.9.1 1.4l.15 1.45.15 1.35c.05.45.05.8.05 1.15l3.7-.3c0-.7-.05-1.5-.15-2.45-.05-.95-.2-1.95-.35-3-.15-1.05-.3-2.2-.5-3.35-.15-1.15-.35-2.3-.6-3.44-.2-1.16-.4-2.25-.65-3.35-.25-1.05-.45-2.05-.7-3Zm-2.35 5.55.3 1.8c.1.6.2 1.2.25 1.74.1.55.15.95.2 1.3h-4.65c.25-.45.5-.95.75-1.5.3-.55.6-1.14.9-1.75.35-.6.65-1.14.95-1.7.3-.55.55-1.04.8-1.4h.2c.1.4.2.9.3 1.5Z"
></path>
<path
d="m357.64 135.96.55-3.4h-12.8l-.55 3.4h4.55l-2.65 15.34h3.65l2.7-15.34h4.55Z"
></path>
<path
fill-rule="evenodd"
d="M297.46 132.3c-1.05 0-2.1.06-3.15.16-1.04.15-2.04.3-3 .55l-3.14 17.84c.95.25 2.04.4 3.24.55 1.16.15 2.25.2 3.3.2a11.19 11.19 0 0 0 7.85-2.95c1-.95 1.8-2.1 2.4-3.45.55-1.35.85-2.9.85-4.6 0-1.35-.2-2.5-.6-3.54a7.4 7.4 0 0 0-1.75-2.6 7.56 7.56 0 0 0-2.65-1.6 10.5 10.5 0 0 0-3.35-.55Zm-.8 3.4c.75 0 1.45.1 2.1.26.65.15 1.2.45 1.65.84.5.4.9.9 1.15 1.56.25.6.4 1.34.4 2.3 0 1.2-.15 2.24-.5 3.2a5.79 5.79 0 0 1-3.5 3.85 7.1 7.1 0 0 1-2.8.49c-.45 0-.9 0-1.45-.05-.55-.05-1.05-.1-1.4-.15l2.15-12.1 1.15-.15c.45-.04.8-.04 1.05-.04Z"
></path>
<path
d="M185.8 62.59a20.53 20.53 0 0 1 2.6 5.5 21.16 21.16 0 0 1 .56 8.4c-.1 1.14-.25 2.04-.4 2.69l-7.95 42.33H195l8.44-45.68a23.33 23.33 0 0 1 6.6-3.5c2.4-.85 4.5-1.3 6.25-1.3 1.9 0 3.5.55 4.8 1.65 1.24 1.05 1.84 2.6 1.84 4.75 0 .6-.1 1.5-.3 2.75-.2 1.15-.35 2.2-.5 3.1l-3.6 16.89-.75 4.05c-.24 1.45-.34 2.7-.34 3.75 0 4.05 1.1 7.44 3.34 10.14 2.15 2.7 6 4.3 11.55 4.75l6.35-12.84c-2.15-.35-3.7-1.15-4.65-2.4-1-1.2-1.5-2.9-1.5-5.05 0-.5.05-1.1.15-1.75.05-.65.15-1.2.2-1.6l3.65-17.2c.3-1.44.55-2.9.75-4.34.2-1.4.3-2.8.3-4.15 0-4.95-1.45-8.94-4.35-11.9-2.95-2.94-7.05-4.44-12.3-4.44-3.04 0-5.94.5-8.8 1.5-2.8.95-6.2 2.54-10.14 4.9a17.35 17.35 0 0 0-2.8-6.75l-13.4 5.75ZM276.82 31.55h-14.14l-10.8 58.47c-.45 1.95-.8 4-1.05 6.15-.25 2.1-.4 4.05-.4 5.85 0 5.8 1.1 10.55 3.35 14.24 2.25 3.7 6.05 5.9 11.4 6.6l6.5-13.3a18.96 18.96 0 0 1-2.8-1.64 7.2 7.2 0 0 1-2.1-2.15 8.1 8.1 0 0 1-1.3-3.05c-.25-1.2-.4-2.7-.4-4.45 0-.85.05-1.8.15-2.8l.45-3.2 11.14-60.72ZM246.43 132.56h-3.65l-2.4 13.69a5.7 5.7 0 0 1-4.3 1.95c-.9 0-1.6-.2-2.1-.6-.54-.45-.8-1.15-.8-2.2 0-.2.06-.5.1-.9.06-.35.06-.7.1-1l2-10.94h-3.7l-1.94 10.9-.15 1.34c-.05.45-.05.8-.05 1.15 0 1 .15 1.85.45 2.6a4.55 4.55 0 0 0 3 2.75 7.94 7.94 0 0 0 7.15-1.4c0 .25 0 .55.05.85 0 .25 0 .5.04.75l3.65-.25c-.04-.25-.04-.5-.04-.8-.06-.25-.06-.55-.06-.9 0-.6.06-1.25.1-1.9.05-.7.1-1.35.25-1.95l2.3-13.14ZM276.62 132.56h-3.55l-1.9 11.04c-.05.15-.1.4-.1.75v.85h-.15l-6.4-12.64h-3.34l-3.35 18.74h3.6l2-11.3c.05-.14.05-.4.05-.64v-.86h.14l6.56 12.95 3.2-.3 3.24-18.6Z"
></path>
<path
fill-rule="evenodd"
d="M214.8 134.46c-.7-.7-1.5-1.25-2.45-1.6-.95-.35-2-.55-3.1-.55a9.97 9.97 0 0 0-7.35 3.2 11.5 11.5 0 0 0-3.1 7.9c0 1.24.2 2.34.6 3.4.35 1 .9 1.84 1.6 2.54.65.75 1.5 1.3 2.45 1.7.95.35 2 .55 3.15.55a9.87 9.87 0 0 0 7.3-3.2 10.5 10.5 0 0 0 2.25-3.5c.54-1.35.85-2.84.85-4.45 0-1.25-.2-2.4-.6-3.4a9.1 9.1 0 0 0-1.6-2.6ZM204.3 138c.55-.7 1.2-1.25 1.95-1.7a4.68 4.68 0 0 1 2.5-.64c1.45 0 2.5.45 3.25 1.34.75.86 1.15 2.1 1.15 3.65 0 .95-.15 1.9-.46 2.85a6.75 6.75 0 0 1-3.14 4.1c-.75.4-1.6.6-2.5.6-1.45 0-2.5-.45-3.25-1.3a5.5 5.5 0 0 1-1.15-3.65 8.99 8.99 0 0 1 1.65-5.25Z"
></path>
<path
d="M188.26 132.56h-10.3l-3.35 18.74h3.7l1.25-7.15h6.75l.6-3.4h-6.75l.85-4.8h6.65l.6-3.4Z"
></path>
<path
fill="#98bf00"
d="M127.08 44.9c1.35-10.95-1.4-20.8-8.2-29.5C112.08 6.7 103.2 1.66 92.25.3c-10.95-1.34-20.8 1.41-29.5 8.2-8.04 6.25-12.94 14.3-14.69 24.15-.15.85-.3 1.65-.4 2.5-.1.85-.15 1.65-.2 2.44-.35 4.6.1 9 1.3 13.2a39.3 39.3 0 0 0 7.1 13.84 40.1 40.1 0 0 0 11.75 10.3c3.74 2.15 7.89 3.6 12.44 4.4.8.15 1.6.25 2.45.4l1.35.15A42.3 42.3 0 0 1 89 67.53c-1.55.05-3.15 0-4.75-.15-.1-.05-.15-.05-.2-.05-1.85-.25-3.65-.6-5.3-1.15a26.51 26.51 0 0 1-13.04-9.24 26.5 26.5 0 0 1-5.6-20.24v-.2c.95-7.45 4.4-13.5 10.34-18.15 6-4.65 12.75-6.55 20.3-5.6a26.2 26.2 0 0 1 18.29 10.35c4.65 6 6.55 12.74 5.65 20.3-.25 1.7-.55 3.3-1 4.84a41.3 41.3 0 0 1 13.2-2c.04-.45.14-.9.2-1.35Z"
></path>
<path
fill="#98bf00"
d="M132.33 51.49c-.85-.1-1.65-.2-2.5-.25-4.6-.3-9 .15-13.2 1.3a39.42 39.42 0 0 0-13.84 7.15 38.4 38.4 0 0 0-14.7 24.14c4.36.74 8.36 2 12.05 3.85a26.53 26.53 0 0 1 10.35-18.14 26.59 26.59 0 0 1 20.3-5.66h.14c7.44.96 13.5 4.45 18.14 10.4 4.7 5.95 6.6 12.7 5.65 20.24a26.77 26.77 0 0 1-10.34 18.34 26.42 26.42 0 0 1-20.15 5.6c.85 4.05 1.1 8.3.8 12.7 9.95.65 18.94-2.2 26.99-8.45 8.7-6.8 13.75-15.7 15.1-26.64 1.34-10.94-1.4-20.79-8.2-29.49-6.3-8.05-14.35-12.94-24.14-14.69-.85-.15-1.65-.3-2.45-.4Z"
></path>
<path
d="M128.93 78.73c-3.45-.4-6.5.45-9.25 2.6a11.9 11.9 0 0 0-4.7 8.3c-.45 3.44.4 6.5 2.55 9.24a11.9 11.9 0 0 0 8.35 4.7c3.4.45 6.45-.4 9.2-2.55 2.75-2.15 4.3-4.9 4.74-8.35.4-3.4-.44-6.44-2.6-9.2a12.15 12.15 0 0 0-8.29-4.74Z"
></path>
<path
fill="#98bf00"
d="M12.83 73.63c.95-7.55 4.4-13.7 10.4-18.34a26.12 26.12 0 0 1 20.09-5.6 44.33 44.33 0 0 1-.8-12.7c-9.95-.65-18.95 2.16-27 8.45C6.79 52.24 1.79 61.14.44 72.08c-1.35 10.95 1.35 20.74 8.2 29.49 6.24 8.05 14.3 12.95 24.14 14.7.8.14 1.6.24 2.45.4.85.1 1.65.2 2.5.24 4.6.3 9-.15 13.19-1.3 4.85-1.4 9.5-3.8 13.85-7.14 4.3-3.4 7.7-7.3 10.24-11.7a39.2 39.2 0 0 0 4.45-12.44 44.68 44.68 0 0 1-12.04-3.85c-.25 1.75-.6 3.45-1.1 5.1a26.53 26.53 0 0 1-9.25 13.04 26.59 26.59 0 0 1-20.3 5.65c-.04 0-.1 0-.14-.05a26.46 26.46 0 0 1-18.15-10.35 26.3 26.3 0 0 1-5.64-20.24Z"
></path>
<path
d="M32.47 67.13c-2.75 2.1-4.3 4.9-4.75 8.35a12 12 0 0 0 2.6 9.14 12 12 0 0 0 8.3 4.8 12.55 12.55 0 0 0 13.94-10.9c.45-3.44-.4-6.54-2.55-9.24a11.9 11.9 0 0 0-8.35-4.7c-3.45-.45-6.5.4-9.2 2.55ZM97.3 32.35a12 12 0 0 0-8.35-4.7c-3.45-.45-6.5.4-9.2 2.55A11.84 11.84 0 0 0 75 38.54c-.45 3.4.45 6.45 2.6 9.2a12.1 12.1 0 0 0 8.3 4.75c3.4.35 6.44-.5 9.2-2.6a12.26 12.26 0 0 0 4.74-8.3c.4-3.45-.45-6.54-2.55-9.24Z"
></path>
<path
fill="#98bf00"
d="m85.05 88.43-1.35-.16a42.3 42.3 0 0 1-5.15 12.35c1.55-.1 3.15-.05 4.8.15.05 0 .1 0 .15.05 1.85.2 3.6.55 5.3 1.1a26.63 26.63 0 0 1 13.04 9.3 26.23 26.23 0 0 1 5.6 20.24v.2a26.47 26.47 0 0 1-10.35 18.14 26.52 26.52 0 0 1-20.29 5.6 26.56 26.56 0 0 1-18.3-10.35c-4.7-6-6.59-12.74-5.64-20.29.2-1.7.55-3.3 1.05-4.85a43.3 43.3 0 0 1-13.25 2c-.04.45-.14.9-.2 1.35-1.34 10.95 1.36 20.74 8.2 29.49 6.8 8.7 15.7 13.74 26.64 15.1 10.95 1.34 20.74-1.4 29.49-8.2 8.05-6.3 12.94-14.35 14.7-24.2.14-.8.24-1.6.4-2.44.04-.85.14-1.65.2-2.45.3-4.65-.16-9.05-1.3-13.2a40.16 40.16 0 0 0-7.1-13.84 39.9 39.9 0 0 0-11.7-10.3 38.72 38.72 0 0 0-12.5-4.4c-.8-.14-1.6-.3-2.44-.4Z"
></path>
<path
d="M90 120.41a12.14 12.14 0 0 0-8.35-4.75c-3.45-.4-6.5.45-9.2 2.6a12.14 12.14 0 0 0-4.75 8.3c-.45 3.45.46 6.5 2.6 9.25 2.1 2.75 4.85 4.3 8.3 4.7 3.45.44 6.5-.4 9.25-2.56 2.7-2.14 4.24-4.9 4.7-8.34.4-3.4-.46-6.45-2.55-9.2Z"
></path>
</svg>

After

Width:  |  Height:  |  Size: 9.6 KiB