docs: change vitepress with astro's starlight

- change language keys to kebab-case
- add new languages to docs: ca, de, es, sr-latn, zh-hans
This commit is contained in:
Yassine Doghri 2024-05-21 16:07:56 +00:00
commit d88b041d2c
705 changed files with 65877 additions and 30149 deletions

View file

@ -3,10 +3,11 @@
"projectOwner": "adaures",
"repoType": "gitlab",
"repoHost": "https://code.castopod.org",
"files": ["README.md", "docs/src/index.md"],
"files": ["README.md", "docs/src/content/docs/en/index.mdx"],
"imageSize": 100,
"commit": false,
"contributorsPerLine": 7,
"wrapperTemplate": "\n<table class=\"all-contributors-table\">\n <tbody><%= bodyContent %> </tbody>\n<%= tableFooterContent %></table>\n\n",
"contributors": [
{
"login": "yassinedoghri",

View file

@ -33,6 +33,7 @@
}
},
"extensions": [
"astro-build.astro-vscode",
"bmewburn.vscode-intelephense-client",
"bradlc.vscode-tailwindcss",
"breezelin.phpstan",
@ -49,6 +50,7 @@
"runem.lit-plugin",
"streetsidesoftware.code-spell-checker",
"stylelint.vscode-stylelint",
"unifiedjs.vscode-mdx",
"wayou.vscode-todo-highlight",
"yzhang.markdown-all-in-one"
]

View file

@ -1,8 +1,3 @@
---
title: Development setup
sidebarDepth: 3
---
# Setup your development environment
## Introduction
@ -56,7 +51,7 @@ to help you kickstart your contribution.
analytics.salt="DEV_ANALYTICS_SALT"
cache.handler="redis"
cache.redis.host = "redis"
cache.redis.host="redis"
# You may not want to use redis as your cache handler
# Comment/remove the two lines above and uncomment
@ -78,15 +73,16 @@ to help you kickstart your contribution.
#media.s3.pathStyleEndpoint=true
```
> _NB._ You can tweak your environment by setting more environment variables
> in your custom `.env` file. See the `env` for examples or the
> [!NOTE]
> 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
### 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
@ -137,7 +133,7 @@ required services will be loaded automagically! 🪄
```
For more info, see
[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers)
[Developing inside a Container](https://code.visualstudio.com/docs/devcontainers/containers)
### 3. Start hacking
@ -180,7 +176,7 @@ You do not wish to use the VSCode devcontainer? No problem!
```
> The `docker-compose up -d` command will boot 4 containers in the
> The `docker-compose up -d` command will boot 5 containers in the
> background:
>
> - `castopod_app`: a php based container with Castopod requirements
@ -191,6 +187,7 @@ You do not wish to use the VSCode devcontainer? No problem!
> persistent data
> - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb
> database.
> - `castopod_s3`: a mock s3 server to work on the s3 fileManager
2. Run any command inside the containers by prefixing them with
`docker-compose run --rm app`:
@ -221,15 +218,12 @@ You do not wish to use the VSCode devcontainer? No problem!
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/).
:::
> [!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 [pnpm](https://pnpm.io/)
@ -237,14 +231,12 @@ You do not wish to use the VSCode devcontainer? No problem!
pnpm install
```
::: info Note
The javascript dependencies aren't included in the repository. Pnpm will
check the `package.json` and `pnpm-lock.yaml` files to download the packages
with the right versions. The dependencies will live under the `node_module`
folder. For more info, check out the [PNPM documentation](https://pnpm.io/).
:::
> [!NOTE]
> The javascript dependencies aren't included in the repository. Pnpm will
> check the `package.json` and `pnpm-lock.yaml` files to download the
> packages with the right versions. The dependencies will live under the
> `node_module` folder. For more info, check out the
> [PNPM documentation](https://pnpm.io/motivation).
3. Generate static assets:
@ -257,21 +249,15 @@ You do not wish to use the VSCode devcontainer? No problem!
pnpm 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.
:::
> [!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 Tip
You may skip this section if you go through the install wizard (go to
`/cp-install`).
:::
> [!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:
@ -377,15 +363,19 @@ more insights.
## Known issues
### Allocation failed - JavaScript heap out of memory
This happens when running `pnpm install`.
👉 By default, docker might not have access to enough RAM. Allocate more memory
and run `pnpm 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
:::
> [!NOTE]
> Replace "username" with your local username
1. Go to `/etc/docker/daemon.json` and add:

View file

@ -1,4 +1,167 @@
# Contributing guidelines
# Contributing to Castopod
You may find the contributing guidelines in the
[Castopod documentation website](https://docs.castopod.org/contributing/guidelines.html).
Love Castopod and want to help? Thanks so much, there's something to do for
everybody!
> [!NOTE]
> Castopod follows the [all contributors](https://allcontributors.org/)
> specification in an effort to **recognize any kind of contribution**, not just
> code!
> If you've made a contribution and do not appear in the
> [contributors](../index.md#contributors-✨) list, please
> [let us know](../index.md#contact) so we can correct our mistake! 🙂
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.
## Translating Castopod
We use [Crowdin](https://translate.castopod.org/) to manage translation files
for [Castopod](https://code.castopod.org/), the
[documentation](https://docs.castopod.org/) and the
[landing](https://castopod.org/) websites.
Whether you'd like to correct a translation error, validate new translations or
include your language to Castopod, head into the
[crowdin project](https://translate.castopod.org/) to get started.
> [!NOTE]
> To prevent degrading user experience, new languages are included to Castopod
> when they reach a certain threshold (~90%).
## Using the issue tracker
The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the
preferred channel for [bug reports](#bug-reports),
[features requests](#feature-requests) and
[submitting pull requests](#pull-requests).
## ⚠️ Security issues and vulnerabilities
If you encounter any security issue or vulnerability in the Castopod source,
please contact us directly by email at
[security@castopod.org](mailto:security@castopod.org)
## 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** &mdash; check if the issue has already been
reported.
2. **Check if the issue has been fixed** &mdash; try to reproduce it using the
latest `main` branch in the repository.
3. **Isolate the problem** &mdash; 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.
> [!NOTE]
> [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/adaures/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/adaures/castopod/-/blob/develop/LICENSE.md).
## 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

@ -31,12 +31,9 @@ please contact us directly by email at
Contributions are always welcome!
See the
[contribution guidelines](https://docs.castopod.org/contributing/guidelines) for
ways to get started.
See the [contribution guidelines](./CONTRIBUTING.md) for ways to get started.
> **Note**
>
> [!Important]
> **Any** contribution made on a repository other than
> [the original repository](https://code.castopod.org/adaures/castopod) will not
> be accepted.
@ -49,7 +46,8 @@ Thanks goes to these wonderful people
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<table class="all-contributors-table">
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑‍🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
@ -59,7 +57,7 @@ Thanks goes to these wonderful people
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
</tr><br />
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
@ -68,7 +66,7 @@ Thanks goes to these wonderful people
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
</tr>
</tr><br />
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
@ -77,7 +75,7 @@ Thanks goes to these wonderful people
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
</tr><br />
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
@ -86,7 +84,7 @@ Thanks goes to these wonderful people
<td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
</tr><br />
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
@ -95,7 +93,7 @@ Thanks goes to these wonderful people
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
</tr><br />
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
@ -104,7 +102,7 @@ Thanks goes to these wonderful people
<td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
</tr><br />
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
@ -113,7 +111,7 @@ Thanks goes to these wonderful people
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
</tr><br />
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KrzysztofDomanczyk"><img src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100" width="100px;" alt="KrzysztofDomanczyk"/><br /><sub><b>KrzysztofDomanczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/NeoluxConsulting"><img src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100" width="100px;" alt="Guy Martin"/><br /><sub><b>Guy Martin</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
@ -121,6 +119,8 @@ Thanks goes to these wonderful people
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

View file

@ -127,13 +127,13 @@ class App extends BaseConfig
'fr',
'pl',
'de',
'pt-BR',
'nn-NO',
'pt-br',
'nn-no',
'es',
'zh-Hans',
'zh-hans',
'ca',
'br',
'sr-Latn',
'sr-latn',
];
/**

View file

@ -2,11 +2,11 @@
+ fr/***
+ pl/***
+ de/***
+ pt-BR/***
+ nn-NO/***
+ pt-br/***
+ nn-no/***
+ es/***
+ zh-Hans/***
+ zh-hans/***
+ ca/***
+ br/***
+ sr-Latn/***
+ sr-latn/***
- **

View file

@ -1,34 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright 2020 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/
*/
return [
'title' => "{actorDisplayName}'s comment for {episodeTitle}",
'back_to_comments' => 'Back to comments',
'form' => [
'episode_message_placeholder' => 'Write a comment…',
'reply_to_placeholder' => 'Reply to @{actorUsername}',
'submit' => 'Send',
'submit_reply' => 'Reply',
],
'likes' => '{numberOfLikes, plural,
one {# like}
other {# likes}
}',
'replies' => '{numberOfReplies, plural,
one {# reply}
other {# replies}
}',
'like' => 'Like',
'reply' => 'Reply',
'view_replies' => 'View replies ({numberOfReplies})',
'block_actor' => 'Block user @{actorUsername}',
'block_domain' => 'Block domain @{actorDomain}',
'delete' => 'Delete comment',
];

View file

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright 2020 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/
*/
return [
'yes' => 'Yes',
'no' => 'No',
'cancel' => 'Cancel',
'optional' => 'Optional',
'close' => 'Close',
'home' => 'Home',
'explicit' => 'Explicit',
'powered_by' => 'Powered by {castopod}',
'go_back' => 'Go back',
'play_episode_button' => [
'play' => 'Play',
'playing' => 'Playing',
],
'read_more' => 'Read more',
'read_less' => 'Read less',
'see_more' => 'See more',
'see_less' => 'See less',
'legal_notice' => 'Legal notice',
];

View file

@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright 2020 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/
*/
return [
'season' => 'Season {seasonNumber}',
'season_abbr' => 'S{seasonNumber}',
'number' => 'Episode {episodeNumber}',
'number_abbr' => 'Ep. {episodeNumber}',
'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
'persons' => '{personsCount, plural,
one {# person}
other {# persons}
}',
'persons_list' => 'Persons',
'back_to_episodes' => 'Back to episodes of {podcast}',
'comments' => 'Comments',
'activity' => 'Activity',
'description' => 'Episode description',
'number_of_comments' => '{numberOfComments, plural,
one {# comment}
other {# comments}
}',
'all_podcast_episodes' => 'All podcast episodes',
'back_to_podcast' => 'Go back to podcast',
];

View file

@ -1,37 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright 2021 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/
*/
return [
'your_handle' => 'Your handle',
'your_handle_hint' => 'Enter the @username@domain you want to act from.',
'follow' => [
'label' => 'Follow',
'title' => 'Follow {actorDisplayName}',
'subtitle' => 'You are going to follow:',
'accountNotFound' => 'The account could not be found.',
'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
'submit' => 'Proceed to follow',
],
'favourite' => [
'title' => "Favourite {actorDisplayName}'s post",
'subtitle' => 'You are going to favourite:',
'submit' => 'Proceed to favourite',
],
'reblog' => [
'title' => "Share {actorDisplayName}'s post",
'subtitle' => 'You are going to share:',
'submit' => 'Proceed to share',
],
'reply' => [
'title' => "Reply to {actorDisplayName}'s post",
'subtitle' => 'You are going to reply to:',
'submit' => 'Proceed to reply',
],
];

View file

@ -1,20 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright 2020 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/
*/
return [
'all_podcasts' => 'All podcasts',
'sort_by' => 'Sort by',
'sort_options' => [
'activity' => 'Recent activity',
'created_desc' => 'Newest first',
'created_asc' => 'Oldest first',
],
'no_podcast' => 'No podcast found',
];

View file

@ -1,17 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright 2020 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/
*/
return [
'back_to_home' => 'Back to home',
'map' => [
'title' => 'Map',
'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.',
],
];

View file

@ -1,53 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright 2020 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/
*/
return [
'feed' => 'RSS Podcast feed',
'season' => 'Season {seasonNumber}',
'list_of_episodes_year' => '{year} episodes ({episodeCount})',
'list_of_episodes_season' =>
'Season {seasonNumber} episodes ({episodeCount})',
'no_episode' => 'No episode found!',
'follow' => 'Follow',
'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
'followers' => '{numberOfFollowers, plural,
one {# follower}
other {# followers}
}',
'posts' => '{numberOfPosts, plural,
one {# post}
other {# posts}
}',
'activity' => 'Activity',
'episodes' => 'Episodes',
'episodes_title' => 'Episodes of {podcastTitle}',
'about' => 'About',
'stats' => [
'title' => 'Stats',
'number_of_seasons' => '{0, plural,
one {# season}
other {# seasons}
}',
'number_of_episodes' => '{0, plural,
one {# episode}
other {# episodes}
}',
'first_published_at' => 'First episode published on {0, date, medium}',
],
'sponsor' => 'Sponsor',
'funding_links' => 'Funding links for {podcastTitle}',
'find_on' => 'Find {podcastTitle} on',
'listen_on' => 'Listen on',
'persons' => '{personsCount, plural,
one {# person}
other {# persons}
}',
'persons_list' => 'Persons',
];

View file

@ -1,40 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright 2020 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/
*/
return [
'title' => "{actorDisplayName}'s post",
'back_to_actor_posts' => 'Back to {actor} posts',
'actor_shared' => '{actor} shared',
'reply_to' => 'Reply to @{actorUsername}',
'form' => [
'message_placeholder' => 'Write a message…',
'episode_message_placeholder' => 'Write a message for the episode…',
'episode_url_placeholder' => 'Episode URL',
'reply_to_placeholder' => 'Reply to @{actorUsername}',
'submit' => 'Send',
'submit_reply' => 'Reply',
],
'favourites' => '{numberOfFavourites, plural,
one {# favourite}
other {# favourites}
}',
'reblogs' => '{numberOfReblogs, plural,
one {# share}
other {# shares}
}',
'replies' => '{numberOfReplies, plural,
one {# reply}
other {# replies}
}',
'expand' => 'Expand post',
'block_actor' => 'Block user @{actorUsername}',
'block_domain' => 'Block domain @{actorDomain}',
'delete' => 'Delete post',
];

View file

@ -1 +1 @@
<svg viewBox="0 0 24 24" fill="currentColor" width="1em" height="1em"><path d="M16.455 10.658c0 1.09-.705 2.244-2.098 3.443a13.447 13.447 0 0 1-2.381 1.62 14.102 14.102 0 0 1-2.381-1.629c-1.4-1.2-2.106-2.353-2.106-3.443 0-1.346.887-2.298 2.106-2.298.558 0 .888.054 1.263.238.22.1.412.237.577.403l.541.55.532-.55a2.07 2.07 0 0 1 .586-.421c.366-.166.678-.22 1.254-.22 1.209.018 2.107.988 2.107 2.307Z" clip-rule="evenodd"/><path d="M22 3.915v16.17A1.911 1.911 0 0 1 20.085 22H3.915A1.911 1.911 0 0 1 2 20.085V3.915C2 2.855 2.854 2 3.915 2h8.066c.267 0 .503.107.68.282a.986.986 0 0 1 .281.68v2.807a.962.962 0 0 1-1.922 0V3.923H4.83a.919.919 0 0 0-.916.916v14.346c0 .51.413.915.916.915h14.346a.914.914 0 0 0 .916-.915V4.839a.942.942 0 0 0-.275-.649s-.214-.206-.48-.252c-.032-.008-.07-.008-.07-.008-.03 0-.061-.007-.09-.007h-2.504a.967.967 0 0 1-.96-.962c0-.526.434-.961.96-.961h3.41A1.907 1.907 0 0 1 22 3.915Z"/></svg>
<svg fill="currentColor" viewBox="0 0 24 24" width="1em" height="1em"><path d="M16.455 10.658c0 1.09-.705 2.244-2.098 3.443a13.447 13.447 0 0 1-2.381 1.62 14.102 14.102 0 0 1-2.381-1.629c-1.4-1.2-2.106-2.353-2.106-3.443 0-1.346.887-2.298 2.106-2.298.558 0 .888.054 1.263.238.22.1.412.237.577.403l.541.55.532-.55a2.07 2.07 0 0 1 .586-.421c.366-.166.678-.22 1.254-.22 1.209.018 2.107.988 2.107 2.307Z" clip-rule="evenodd"/><path d="M22 3.915v16.17A1.911 1.911 0 0 1 20.085 22H3.915A1.911 1.911 0 0 1 2 20.085V3.915C2 2.855 2.854 2 3.915 2h8.066c.267 0 .503.107.68.282a.986.986 0 0 1 .281.68v2.807a.962.962 0 0 1-1.922 0V3.923H4.83a.919.919 0 0 0-.916.916v14.346c0 .51.413.915.916.915h14.346a.914.914 0 0 0 .916-.915V4.839a.942.942 0 0 0-.275-.649s-.214-.206-.48-.252c-.032-.008-.07-.008-.07-.008-.03 0-.061-.007-.09-.007h-2.504a.967.967 0 0 1-.96-.962c0-.526.434-.961.96-.961h3.41A1.907 1.907 0 0 1 22 3.915Z"/></svg>

Before

Width:  |  Height:  |  Size: 915 B

After

Width:  |  Height:  |  Size: 915 B

Before After
Before After

View file

@ -1 +1 @@
<svg viewBox="0 0 24 24" fill="currentColor" width="1em" height="1em"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m4.64 6.8c-.15 1.58-.8 5.42-1.13 7.19c-.14.75-.42 1-.68 1.03c-.58.05-1.02-.38-1.58-.75c-.88-.58-1.38-.94-2.23-1.5c-.99-.65-.35-1.01.22-1.59c.15-.15 2.71-2.48 2.76-2.69a.2.2 0 0 0-.05-.18c-.06-.05-.14-.03-.21-.02c-.09.02-1.49.95-4.22 2.79c-.4.27-.76.41-1.08.4c-.36-.01-1.04-.2-1.55-.37c-.63-.2-1.12-.31-1.08-.66c.02-.18.27-.36.74-.55c2.92-1.27 4.86-2.11 5.83-2.51c2.78-1.16 3.35-1.36 3.73-1.36c.08 0 .27.02.39.12c.1.08.13.19.14.27c-.01.06.01.24 0 .38"/></svg>
<svg fill="currentColor" viewBox="0 0 24 24" width="1em" height="1em"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m4.64 6.8c-.15 1.58-.8 5.42-1.13 7.19c-.14.75-.42 1-.68 1.03c-.58.05-1.02-.38-1.58-.75c-.88-.58-1.38-.94-2.23-1.5c-.99-.65-.35-1.01.22-1.59c.15-.15 2.71-2.48 2.76-2.69a.2.2 0 0 0-.05-.18c-.06-.05-.14-.03-.21-.02c-.09.02-1.49.95-4.22 2.79c-.4.27-.76.41-1.08.4c-.36-.01-1.04-.2-1.55-.37c-.63-.2-1.12-.31-1.08-.66c.02-.18.27-.36.74-.55c2.92-1.27 4.86-2.11 5.83-2.51c2.78-1.16 3.35-1.36 3.73-1.36c.08 0 .27.02.39.12c.1.08.13.19.14.27c-.01.06.01.24 0 .38"/></svg>

Before

Width:  |  Height:  |  Size: 622 B

After

Width:  |  Height:  |  Size: 622 B

Before After
Before After

View file

@ -83,8 +83,7 @@
height: 0;
width: 0;
border-style: solid;
border-color: hsl(var(--color-text-muted)) transparent transparent
transparent;
border-color: hsl(var(--color-text-muted)) transparent transparent;
border-width: 5px;
position: absolute;
right: 11.5px;
@ -94,8 +93,7 @@
}
.choices[data-type*="select-one"].is-open::after {
border-color: transparent transparent hsl(var(--color-text-muted))
transparent;
border-color: transparent transparent hsl(var(--color-text-muted));
margin-top: -7.5px;
}

21
docs/.gitignore vendored Normal file
View file

@ -0,0 +1,21 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store

View file

@ -1,4 +1,4 @@
image: node:16
image: node:20
stages:
- build
@ -6,25 +6,29 @@ stages:
.documentation-setup:
before_script:
- corepack enable
- corepack prepare pnpm@latest-9 --activate
- pnpm config set store-dir .pnpm-store
- cd docs
- chmod +x ./scripts/i18n-filter.sh
- ./scripts/i18n-filter.sh src
- npm install
- pnpm install
cache:
key:
files:
- docs/package-lock.json
- docs/pnpm-lock.yaml
paths:
- docs/node_modules
- .pnpm-store
# This job only serves for validating that the docs builds correctly on all non deployment branches
build:
extends: .documentation-setup
stage: build
script:
- npm run build
- pnpm run build
except:
- develop
- main
- beta
- alpha
@ -36,12 +40,13 @@ build-production:
name: production
url: https://docs.castopod.org/
script:
- npm run build
- pnpm run build --outDir=docs/.dist/$CI_COMMIT_REF_SLUG --base=$CI_COMMIT_REF_SLUG
artifacts:
paths:
- docs/.vitepress/dist
- docs/dist/$CI_COMMIT_REF_SLUG
expire_in: 30 mins
only:
- develop
- main
- beta
- alpha
@ -54,10 +59,10 @@ deploy:
variables:
HOST: $DOCS_HOST
USER: $DOCS_USER
TEMP_DIRECTORY: $DOCS_TEMP_DIRECTORY
DIRECTORY: $DOCS_DIRECTORY
TEMP_DIRECTORY: $DOCS_TEMP_DIRECTORY/$CI_COMMIT_REF_SLUG/
DIRECTORY: $DOCS_DIRECTORY/$CI_COMMIT_REF_SLUG/
SSH_PORT: 3242
SOURCE_FOLDER: "docs/.vitepress/dist/"
SOURCE_FOLDER: "docs/dist/$CI_COMMIT_REF_SLUG/"
before_script:
# install rsync for file transfers
- apt-get update && apt-get install rsync -y
@ -71,6 +76,7 @@ deploy:
- rsync -avzuh -e "ssh -p $SSH_PORT" $SOURCE_FOLDER $USER@$HOST:$TEMP_DIRECTORY --progress
- ssh $USER@$HOST -p $SSH_PORT "rsync -rtv $TEMP_DIRECTORY $DIRECTORY"
only:
- develop
- main
- beta
- alpha

View file

@ -1,280 +0,0 @@
import { defineConfig } from "vitepress";
export default defineConfig({
srcDir: "src",
head: [
["link", { rel: "icon", type: "image/x-icon", href: "/favicon.ico" }],
["link", { rel: "canonical", href: "https://docs.castopod.org/" }],
["meta", { name: "robots", content: "index, follow" }],
["meta", { property: "og:type", content: "website" }],
[
"meta",
{
property: "og:image",
content: "https://docs.castopod.org/images/open-graph.jpg",
},
],
["meta", { property: "og:image:type", content: "image/jpeg" }],
["meta", { property: "og:image:width", content: "1200" }],
["meta", { property: "og:image:height", content: "630" }],
[
"meta",
{
property: "og:image:alt",
content:
"Castopod mascot waving hello and holding a browser showcasing the Castopod documentation.",
},
],
["meta", { property: "og:url", content: "https://docs.castopod.org/" }],
["meta", { name: "twitter:site", content: "@castopod" }],
["meta", { name: "twitter:card", content: "summary_large_image" }],
["meta", { name: "twitter:creator", content: "@ad_aures" }],
[
"script",
{
defer: "defer",
"data-domain": "docs.castopod.org",
src: "https://analytics.castopod.org/js/plausible.js",
},
],
],
locales: {
"/": {
lang: "en",
title: "Castopod documentation",
description:
"Check out the Castopod documentation! Install your own free & open-source podcast host, help make it better by contributing, or simply learn more about Castopod!",
},
"/fr/": {
lang: "fr",
title: "Documentation Castopod",
description:
"Castopod est une plateforme dhébergement gratuite & open-source conçue pour les podcasteurs qui veulent échanger et interagir avec leur public.",
},
"/pt-BR/": {
lang: "pt-BR",
title: "Documentação Castopod",
description:
"Castopod é uma plataforma de hospedagem de código livre & aberto feita para podcasters que querem se envolver e interagir com seu público.",
},
"/nn-NO/": {
lang: "nn-NO",
title: "Castopod dokumentasjon",
description:
"Castopod er ei open og gratis løysing for dei som vil køyra si eiga podkasting-plattform, og for podkastarar som vil engasjera og samhandla med publikum.",
},
},
themeConfig: {
logo: "/images/castopod-icon.svg",
lastUpdated: "Last Updated",
repo: "https://code.castopod.org/adaures/castopod",
docsDir: "docs/src",
docsBranch: "develop",
editLinks: true,
locales: {
"/": {
label: "English",
selectText: "Languages",
repoLabel: "Source code",
nav: [
{
text: "Home",
link: "https://castopod.org/",
},
{
text: "Blog",
link: "https://blog.castopod.org/",
},
{
text: "Github",
link: "https://github.com/ad-aures/castopod",
},
],
sidebar: {
"/": getGuideSidebarEn(),
},
},
"/fr/": {
label: "Français",
selectText: "Langues",
repoLabel: "Code source",
nav: [
{
text: "Accueil",
link: "https://castopod.org/",
},
{
text: "Blog",
link: "https://blog.castopod.org/",
},
{
text: "Github",
link: "https://github.com/ad-aures/castopod",
},
],
sidebar: {
"/": getGuideSidebarFr(),
},
},
"/pt-BR/": {
label: "Português do Brasil",
selectText: "Línguas",
repoLabel: "Código fonte",
nav: [
{
text: "Início",
link: "https://castopod.org/",
},
{
text: "Blogue",
link: "https://blog.castopod.org/",
},
{
text: "Github",
link: "https://github.com/ad-aures/castopod",
},
],
sidebar: { "/pt-BR/": getGuideSidebarPtBR() },
},
"/nn-NO/": {
label: "Norsk nynorsk",
selectText: "Språk",
repoLabel: "Kildekode",
nav: [
{
text: "Heim",
link: "https://castopod.org/",
},
{
text: "Blogg",
link: "https://blog.castopod.org/",
},
{
text: "Github",
link: "https://github.com/ad-aures/castopod",
},
],
sidebar: { "/nn-NO/": getGuideSidebarNnNO() },
},
},
},
});
function getGuideSidebarEn() {
return [
{
text: "Introduction",
link: "/",
},
{
text: "Getting started",
children: [
{ text: "Install", link: "/getting-started/install" },
{
text: "Docker",
link: "/getting-started/docker",
},
{ text: "Security", link: "/getting-started/security" },
{ text: "Update", link: "/getting-started/update" },
{ text: "Auth", link: "/getting-started/auth" },
],
},
{
text: "Contributing",
children: [
{ text: "Guide", link: "/contributing/guidelines" },
{ text: "Dev Setup", link: "/contributing/setup-development" },
],
},
];
}
function getGuideSidebarFr() {
return [
{
text: "Introduction",
link: "/fr/",
},
{
text: "Commencer",
children: [
{ text: "Installer", link: "/fr/getting-started/install" },
{
text: "Docker",
link: "/fr/getting-started/docker",
},
{ text: "Sécurité", link: "/fr/getting-started/security" },
{ text: "Mise à jour", link: "/fr/getting-started/update" },
{ text: "Authentification", link: "/fr/getting-started/auth" },
],
},
{
text: "Contributing",
children: [
{ text: "Guide", link: "/fr/contributing/guidelines" },
{ text: "Dev Setup", link: "/fr/contributing/setup-development" },
],
},
];
}
function getGuideSidebarPtBR() {
return [
{
text: "Introdução",
link: "/pt-BR/",
},
{
text: "Começando",
children: [
{ text: "Instalar", link: "/pt-BR/getting-started/install" },
{
text: "Docker",
link: "/pt-BR/getting-started/docker",
},
{ text: "Segurança", link: "/pt-BR/getting-started/security" },
{ text: "Atualizar", link: "/pt-BR/getting-started/update" },
{ text: "Autenticação", link: "/pt-BR/getting-started/auth" },
],
},
{
text: "Contributing",
children: [
{ text: "Guide", link: "/pt-BR/contributing/guidelines" },
{ text: "Dev Setup", link: "/pt-BR/contributing/setup-development" },
],
},
];
}
function getGuideSidebarNnNO() {
return [
{
text: "Introduksjon",
link: "/nn-NO/",
},
{
text: "Starter",
children: [
{ text: "Installer", link: "/nn-NO/getting-started/install" },
{
text: "Docker",
link: "/nn-NO/getting-started/docker",
},
{ text: "Sikkerhet", link: "/nn-NO/getting-started/security" },
{ text: "Oppdaterer", link: "/nn-NO/getting-started/update" },
{ text: "Autentisering", link: "/pt-BR/getting-started/auth" },
],
},
{
text: "Contributing",
children: [
{ text: "Guide", link: "/nn-NO/contributing/guidelines" },
{ text: "Dev Setup", link: "/nn-NO/contributing/setup-development" },
],
},
];
}

View file

@ -1,6 +0,0 @@
import Theme from "vitepress/theme";
import "./tailwind.css";
export default {
...Theme,
};

View file

@ -1,2 +0,0 @@
@tailwind components;
@tailwind utilities;

58
docs/README.md Normal file
View file

@ -0,0 +1,58 @@
# Castopod Docs
[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build)
```sh
pnpm create astro@latest -- --template starlight
```
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics)
[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics)
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
## 🚀 Project Structure
Inside of your Astro + Starlight project, you'll see the following folders and
files:
```
.
├── public/
├── src/
│ ├── assets/
│ ├── content/
│ │ ├── docs/
│ │ └── config.ts
│ └── env.d.ts
├── astro.config.mjs
├── package.json
└── tsconfig.json
```
Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory.
Each file is exposed as a route based on its file name.
Images can be added to `src/assets/` and embedded in Markdown with a relative
link.
Static assets, like favicons, can be placed in the `public/` directory.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Check out [Starlights docs](https://starlight.astro.build/), read
[the Astro documentation](https://docs.astro.build), or jump into the
[Astro Discord server](https://astro.build/chat).

191
docs/astro.config.mjs Normal file
View file

@ -0,0 +1,191 @@
import { defineConfig } from "astro/config";
import starlight from "@astrojs/starlight";
import tailwind from "@astrojs/tailwind";
const site = "https://docs.castopod.org/";
// https://astro.build/config
export default defineConfig({
site,
base: "/docs",
integrations: [
starlight({
title: "Castopod Docs",
description:
"Check out the Castopod documentation! Install your own free & open-source podcast host, help make it better by contributing, or simply learn more about Castopod!",
logo: {
src: "./src/assets/castopod-logo-inline.svg",
replacesTitle: true,
},
favicon: "/favicon.ico",
customCss: [
"@fontsource/inter/400.css",
"@fontsource/inter/600.css",
"@fontsource/rubik/700.css",
"./src/styles/tailwind.css",
],
head: [
{
tag: "meta",
attrs: {
property: "og:type",
content: "website",
},
},
{
tag: "meta",
attrs: {
property: "og:image",
content: site + "open-graph.jpg?v=1",
},
},
{
tag: "meta",
attrs: { property: "og:image:type", content: "image/jpeg" },
},
{ tag: "meta", attrs: { property: "og:image:width", content: "1200" } },
{ tag: "meta", attrs: { property: "og:image:height", content: "630" } },
{
tag: "meta",
attrs: {
property: "og:image:alt",
content:
"Castopod mascot waving hello and holding a browser showcasing the Castopod documentation.",
},
},
{
tag: "meta",
attrs: { property: "og:url", content: "https://docs.castopod.org/" },
},
{ tag: "meta", attrs: { name: "twitter:site", content: "@castopod" } },
{
tag: "meta",
attrs: { name: "twitter:card", content: "summary_large_image" },
},
{
tag: "meta",
attrs: { name: "twitter:creator", content: "@ad_aures" },
},
{
tag: "script",
attrs: {
src: "https://analytics.castopod.org/js/plausible.js",
"data-domain": "docs.castopod.org",
defer: true,
},
},
],
defaultLocale: "en",
locales: {
en: {
label: "English",
},
ca: {
label: "Català",
},
de: {
label: "Deutsch",
},
es: {
label: "Español",
},
fr: {
label: "Français",
},
"nn-no": {
label: "Norsk nynorsk",
lang: "nn-NO",
},
"pt-br": {
label: "Português do Brasil",
lang: "pt-BR",
},
"sr-latn": {
label: "Srpski",
lang: "sr-Latn",
},
"zh-hans": {
label: "中文",
lang: "zh-Hans",
},
},
social: {
discord: "https://castopod.org/chat",
"x.com": "https://twitter.com/castopod",
mastodon: "https://podlibre.social/@Castopod",
gitlab: "https://code.castopod.org/adaures/castopod",
github: "https://github.com/ad-aures/castopod",
},
sidebar: [
{
label: "Instroduction",
link: "/",
translations: {
fr: "Installer",
"pt-br": "Instalar",
"nn-no": "Installer",
},
},
{
label: "Getting started",
translations: {
fr: "Commencer",
"pt-br": "Começando",
"nn-no": "Starter",
},
items: [
// Each item here is one entry in the navigation menu.
{
label: "Install",
link: "/getting-started/install/",
translations: {
fr: "Installer",
"pt-br": "Instalar",
"nn-no": "Installer",
},
},
{
label: "Docker",
link: "/getting-started/docker/",
},
{
label: "Security",
link: "/getting-started/security/",
translations: {
fr: "Sécurité",
"pt-br": "Segurança",
"nn-no": "Sikkerhet",
},
},
{
label: "Update",
link: "/getting-started/update/",
translations: {
fr: "Mise à jour",
"pt-br": "Atualizar",
"nn-no": "Oppdaterer",
},
},
{
label: "Auth",
link: "/getting-started/auth/",
translations: {
fr: "Authentification",
"pt-br": "Autenticação",
"nn-no": "Autentisering",
},
},
],
},
],
editLink: {
baseUrl:
"https://code.castopod.org/adaures/castopod/-/edit/develop/docs/",
},
}),
tailwind({
applyBaseStyles: false,
}),
],
});

2804
docs/package-lock.json generated
View file

@ -1,2804 +0,0 @@
{
"name": "castopod-docs",
"version": "0.0.0-development",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "castopod-docs",
"version": "0.0.0-development",
"license": "AGPL-3.0-or-later",
"devDependencies": {
"tailwindcss": "^3.2.7",
"vitepress": "^0.22.4"
}
},
"node_modules/@algolia/autocomplete-core": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz",
"integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==",
"dev": true,
"dependencies": {
"@algolia/autocomplete-shared": "1.7.4"
}
},
"node_modules/@algolia/autocomplete-preset-algolia": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz",
"integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==",
"dev": true,
"dependencies": {
"@algolia/autocomplete-shared": "1.7.4"
},
"peerDependencies": {
"@algolia/client-search": ">= 4.9.1 < 6",
"algoliasearch": ">= 4.9.1 < 6"
}
},
"node_modules/@algolia/autocomplete-shared": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz",
"integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==",
"dev": true
},
"node_modules/@algolia/cache-browser-local-storage": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.15.0.tgz",
"integrity": "sha512-uxxFhTWh4JJDb2+FFSmNMfEQ8p9o2vjSpU7iW007QX3OvqljPPN68lk3bpZVaG8pwr5MU1DqpkZ71FcQdVTjgQ==",
"dev": true,
"dependencies": {
"@algolia/cache-common": "4.15.0"
}
},
"node_modules/@algolia/cache-common": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.15.0.tgz",
"integrity": "sha512-Me3PbI4QurAM+3D+htIE0l1xt6+bl/18SG6Wc7bPQEZAtN7DTGz22HqhKNyLF2lR/cOfpaH7umXZlZEhIHf7gQ==",
"dev": true
},
"node_modules/@algolia/cache-in-memory": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.15.0.tgz",
"integrity": "sha512-B9mg1wd7CKMfpkbiTQ8KlcKkH6ut/goVaI6XmDCUczOOqeuZlV34tuEi7o3Xo1j66KWr/d9pMjjGYcoVPCVeOA==",
"dev": true,
"dependencies": {
"@algolia/cache-common": "4.15.0"
}
},
"node_modules/@algolia/client-account": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.15.0.tgz",
"integrity": "sha512-8wqI33HRZy5ydfFt6F5vMhtkOiAUhVfSCYXx4U3Go5RALqWLgVUp6wzOo0mr1z08POCkHDpbQMQvyayb1CZ/kw==",
"dev": true,
"dependencies": {
"@algolia/client-common": "4.15.0",
"@algolia/client-search": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"node_modules/@algolia/client-analytics": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.15.0.tgz",
"integrity": "sha512-jrPjEeNEIIQKeA1XCZXx3f3aybtwF7wjYlnfHbLARuZ9AuHzimOKjX0ZwqvMmvTsHivpcZ2rqY+j1E8HoH1ELA==",
"dev": true,
"dependencies": {
"@algolia/client-common": "4.15.0",
"@algolia/client-search": "4.15.0",
"@algolia/requester-common": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"node_modules/@algolia/client-common": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.15.0.tgz",
"integrity": "sha512-PlsJMObZuYw4JlG5EhYv1PHDOv7n5mD5PzqFyoNfSOYaEPRZepa3W579ya29yOu3FZ0VGMNJmB7Q5v/+/fwvIw==",
"dev": true,
"dependencies": {
"@algolia/requester-common": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"node_modules/@algolia/client-personalization": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.15.0.tgz",
"integrity": "sha512-Bf0bhRAiNL9LWurzyHRH8UBi4fDt3VbCNkInxVngKQT1uCZWXecwoPWGhcSSpdanBqFJA/1WBt+BWx7a50Bhlg==",
"dev": true,
"dependencies": {
"@algolia/client-common": "4.15.0",
"@algolia/requester-common": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"node_modules/@algolia/client-search": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.15.0.tgz",
"integrity": "sha512-dTwZD4u53WdmexnMcoO2Qd/+YCP3ESXKOtD2MryQ1a9dHwB2Y3Qob0kyS1PG82idwM3enbznvscI9Sf4o9PUWQ==",
"dev": true,
"dependencies": {
"@algolia/client-common": "4.15.0",
"@algolia/requester-common": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"node_modules/@algolia/logger-common": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.15.0.tgz",
"integrity": "sha512-D8OFwn/HpvQz66goIcjxOKsYBMuxiruxJ3cA/bnc0EiDvSA2P2z6bNQWgS5gbstuTZIJmbhr+53NyOxFkmMNAA==",
"dev": true
},
"node_modules/@algolia/logger-console": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.15.0.tgz",
"integrity": "sha512-pQOvVaRSEJQJRXKTnxEA6nN1hipSQadJJ4einw0nIlfMOGZh/kps1ybh8vRUlUGyfEuN/3dyFs0W3Ac7hIItlg==",
"dev": true,
"dependencies": {
"@algolia/logger-common": "4.15.0"
}
},
"node_modules/@algolia/requester-browser-xhr": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.15.0.tgz",
"integrity": "sha512-va186EfALF+6msYZXaoBSxcnFCg3SoWJ+uv1yMyhQRJRe7cZSHWSVT3s40vmar90gxlBu80KMVwVlsvJhJv6ew==",
"dev": true,
"dependencies": {
"@algolia/requester-common": "4.15.0"
}
},
"node_modules/@algolia/requester-common": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.15.0.tgz",
"integrity": "sha512-w0UUzxElbo4hrKg4QP/jiXDNbIJuAthxdlkos9nS8KAPK2XI3R9BlUjLz/ZVs4F9TDGI0mhjrNHhZ12KXcoyhg==",
"dev": true
},
"node_modules/@algolia/requester-node-http": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.15.0.tgz",
"integrity": "sha512-eeEOhFtgwKcgAlKAZpgBRZJ0ILSEBCXxZ9uwfVWPD24W1b6z08gVoTJ6J7lCeCnJmudg+tMElDnGzHkjup9CJA==",
"dev": true,
"dependencies": {
"@algolia/requester-common": "4.15.0"
}
},
"node_modules/@algolia/transporter": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.15.0.tgz",
"integrity": "sha512-JoWR+ixG3EmA0UPntQFN/FV5TasYcYu93d5+oKzHFeZ6Z7rtW5Im9iy/Oh/ggk1AAN5fTdqKewtbBpdaYDbKsQ==",
"dev": true,
"dependencies": {
"@algolia/cache-common": "4.15.0",
"@algolia/logger-common": "4.15.0",
"@algolia/requester-common": "4.15.0"
}
},
"node_modules/@babel/parser": {
"version": "7.21.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz",
"integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@docsearch/css": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz",
"integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==",
"dev": true
},
"node_modules/@docsearch/js": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.3.tgz",
"integrity": "sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==",
"dev": true,
"dependencies": {
"@docsearch/react": "3.3.3",
"preact": "^10.0.0"
}
},
"node_modules/@docsearch/react": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz",
"integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==",
"dev": true,
"dependencies": {
"@algolia/autocomplete-core": "1.7.4",
"@algolia/autocomplete-preset-algolia": "1.7.4",
"@docsearch/css": "3.3.3",
"algoliasearch": "^4.0.0"
},
"peerDependencies": {
"@types/react": ">= 16.8.0 < 19.0.0",
"react": ">= 16.8.0 < 19.0.0",
"react-dom": ">= 16.8.0 < 19.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"react": {
"optional": true
},
"react-dom": {
"optional": true
}
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
"integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
"cpu": [
"loong64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@vitejs/plugin-vue": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz",
"integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==",
"dev": true,
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"vite": "^2.5.10",
"vue": "^3.2.25"
}
},
"node_modules/@vue/compiler-core": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
"integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
"dev": true,
"dependencies": {
"@babel/parser": "^7.16.4",
"@vue/shared": "3.2.47",
"estree-walker": "^2.0.2",
"source-map": "^0.6.1"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
"integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
"dev": true,
"dependencies": {
"@vue/compiler-core": "3.2.47",
"@vue/shared": "3.2.47"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
"integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
"dev": true,
"dependencies": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.47",
"@vue/compiler-dom": "3.2.47",
"@vue/compiler-ssr": "3.2.47",
"@vue/reactivity-transform": "3.2.47",
"@vue/shared": "3.2.47",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7",
"postcss": "^8.1.10",
"source-map": "^0.6.1"
}
},
"node_modules/@vue/compiler-ssr": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
"integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
"dev": true,
"dependencies": {
"@vue/compiler-dom": "3.2.47",
"@vue/shared": "3.2.47"
}
},
"node_modules/@vue/reactivity": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz",
"integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==",
"dev": true,
"dependencies": {
"@vue/shared": "3.2.47"
}
},
"node_modules/@vue/reactivity-transform": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
"integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
"dev": true,
"dependencies": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.47",
"@vue/shared": "3.2.47",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7"
}
},
"node_modules/@vue/runtime-core": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz",
"integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==",
"dev": true,
"dependencies": {
"@vue/reactivity": "3.2.47",
"@vue/shared": "3.2.47"
}
},
"node_modules/@vue/runtime-dom": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz",
"integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==",
"dev": true,
"dependencies": {
"@vue/runtime-core": "3.2.47",
"@vue/shared": "3.2.47",
"csstype": "^2.6.8"
}
},
"node_modules/@vue/server-renderer": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz",
"integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==",
"dev": true,
"dependencies": {
"@vue/compiler-ssr": "3.2.47",
"@vue/shared": "3.2.47"
},
"peerDependencies": {
"vue": "3.2.47"
}
},
"node_modules/@vue/shared": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
"integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==",
"dev": true
},
"node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"dev": true,
"dependencies": {
"acorn": "^7.0.0",
"acorn-walk": "^7.0.0",
"xtend": "^4.0.2"
}
},
"node_modules/acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
"dev": true,
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/algoliasearch": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.15.0.tgz",
"integrity": "sha512-+vgKQF5944dYsz9zhKk07JbOYeNdKisoD5GeG0woBL3nLzbn2a+nGwki60DXg7CXvaFXBcTXyJG4C+VaBVd44g==",
"dev": true,
"dependencies": {
"@algolia/cache-browser-local-storage": "4.15.0",
"@algolia/cache-common": "4.15.0",
"@algolia/cache-in-memory": "4.15.0",
"@algolia/client-account": "4.15.0",
"@algolia/client-analytics": "4.15.0",
"@algolia/client-common": "4.15.0",
"@algolia/client-personalization": "4.15.0",
"@algolia/client-search": "4.15.0",
"@algolia/logger-common": "4.15.0",
"@algolia/logger-console": "4.15.0",
"@algolia/requester-browser-xhr": "4.15.0",
"@algolia/requester-common": "4.15.0",
"@algolia/requester-node-http": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/arg": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"dev": true
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"dependencies": {
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/camelcase-css": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
"dev": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/chokidar/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
"dev": true,
"bin": {
"cssesc": "bin/cssesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/csstype": {
"version": "2.6.21",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
"integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==",
"dev": true
},
"node_modules/defined": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
"integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/detective": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
"integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
"dev": true,
"dependencies": {
"acorn-node": "^1.8.2",
"defined": "^1.0.0",
"minimist": "^1.2.6"
},
"bin": {
"detective": "bin/detective.js"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
"dev": true
},
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true
},
"node_modules/esbuild": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
"integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
"dev": true,
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=12"
},
"optionalDependencies": {
"@esbuild/linux-loong64": "0.14.54",
"esbuild-android-64": "0.14.54",
"esbuild-android-arm64": "0.14.54",
"esbuild-darwin-64": "0.14.54",
"esbuild-darwin-arm64": "0.14.54",
"esbuild-freebsd-64": "0.14.54",
"esbuild-freebsd-arm64": "0.14.54",
"esbuild-linux-32": "0.14.54",
"esbuild-linux-64": "0.14.54",
"esbuild-linux-arm": "0.14.54",
"esbuild-linux-arm64": "0.14.54",
"esbuild-linux-mips64le": "0.14.54",
"esbuild-linux-ppc64le": "0.14.54",
"esbuild-linux-riscv64": "0.14.54",
"esbuild-linux-s390x": "0.14.54",
"esbuild-netbsd-64": "0.14.54",
"esbuild-openbsd-64": "0.14.54",
"esbuild-sunos-64": "0.14.54",
"esbuild-windows-32": "0.14.54",
"esbuild-windows-64": "0.14.54",
"esbuild-windows-arm64": "0.14.54"
}
},
"node_modules/esbuild-android-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
"integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-android-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
"integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-darwin-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
"integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-darwin-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
"integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-freebsd-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
"integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-freebsd-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
"integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-linux-32": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
"integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-linux-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
"integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-linux-arm": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
"integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-linux-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
"integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-linux-mips64le": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
"integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
"cpu": [
"mips64el"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-linux-ppc64le": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
"integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
"cpu": [
"ppc64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-linux-riscv64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
"integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
"cpu": [
"riscv64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-linux-s390x": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
"integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
"cpu": [
"s390x"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-netbsd-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
"integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-openbsd-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
"integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-sunos-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
"integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-windows-32": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
"integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-windows-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
"integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild-windows-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
"integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"dev": true
},
"node_modules/fast-glob": {
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
"integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
},
"engines": {
"node": ">=8.6.0"
}
},
"node_modules/fast-glob/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fastq": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
"integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
"dev": true,
"dependencies": {
"reusify": "^1.0.4"
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-core-module": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
"integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
"dev": true,
"dependencies": {
"has": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/lilconfig": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
"integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/magic-string": {
"version": "0.25.9",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
"dev": true,
"dependencies": {
"sourcemap-codec": "^1.4.8"
}
},
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dev": true,
"dependencies": {
"braces": "^3.0.2",
"picomatch": "^2.3.1"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-hash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
"dev": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/postcss": {
"version": "8.4.21",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
"integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
}
],
"dependencies": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/postcss-import": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
"integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
},
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"postcss": "^8.0.0"
}
},
"node_modules/postcss-js": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
"dev": true,
"dependencies": {
"camelcase-css": "^2.0.1"
},
"engines": {
"node": "^12 || ^14 || >= 16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.4.21"
}
},
"node_modules/postcss-load-config": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
"integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
"dev": true,
"dependencies": {
"lilconfig": "^2.0.5",
"yaml": "^1.10.2"
},
"engines": {
"node": ">= 10"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": ">=8.0.9",
"ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
"postcss": {
"optional": true
},
"ts-node": {
"optional": true
}
}
},
"node_modules/postcss-nested": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
"integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
"dev": true,
"dependencies": {
"postcss-selector-parser": "^6.0.10"
},
"engines": {
"node": ">=12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.2.14"
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.11",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
"integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
"node_modules/preact": {
"version": "10.13.1",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.13.1.tgz",
"integrity": "sha512-KyoXVDU5OqTpG9LXlB3+y639JAGzl8JSBXLn1J9HTSB3gbKcuInga7bZnXLlxmK94ntTs1EFeZp0lrja2AuBYQ==",
"dev": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/preact"
}
},
"node_modules/prismjs": {
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"dev": true,
"dependencies": {
"pify": "^2.3.0"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dev": true,
"dependencies": {
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true,
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
}
},
"node_modules/rollup": {
"version": "2.77.3",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz",
"integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
"dev": true,
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=10.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
"deprecated": "Please use @jridgewell/sourcemap-codec instead",
"dev": true
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/tailwindcss": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz",
"integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==",
"dev": true,
"dependencies": {
"arg": "^5.0.2",
"chokidar": "^3.5.3",
"color-name": "^1.1.4",
"detective": "^5.2.1",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.2.12",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"lilconfig": "^2.0.6",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
"picocolors": "^1.0.0",
"postcss": "^8.0.9",
"postcss-import": "^14.1.0",
"postcss-js": "^4.0.0",
"postcss-load-config": "^3.1.4",
"postcss-nested": "6.0.0",
"postcss-selector-parser": "^6.0.11",
"postcss-value-parser": "^4.2.0",
"quick-lru": "^5.1.1",
"resolve": "^1.22.1"
},
"bin": {
"tailwind": "lib/cli.js",
"tailwindcss": "lib/cli.js"
},
"engines": {
"node": ">=12.13.0"
},
"peerDependencies": {
"postcss": "^8.0.9"
}
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
"node_modules/vite": {
"version": "2.9.15",
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz",
"integrity": "sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==",
"dev": true,
"dependencies": {
"esbuild": "^0.14.27",
"postcss": "^8.4.13",
"resolve": "^1.22.0",
"rollup": ">=2.59.0 <2.78.0"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
"node": ">=12.2.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
},
"peerDependencies": {
"less": "*",
"sass": "*",
"stylus": "*"
},
"peerDependenciesMeta": {
"less": {
"optional": true
},
"sass": {
"optional": true
},
"stylus": {
"optional": true
}
}
},
"node_modules/vitepress": {
"version": "0.22.4",
"resolved": "https://registry.npmjs.org/vitepress/-/vitepress-0.22.4.tgz",
"integrity": "sha512-oZUnLO/SpYdThaBKefDeOiVlr0Rie4Ppx3FzMnMyLtJnI5GlBMNjqYqMy/4+umm/iC+ZDJfI+IlDKxv5fZnYzA==",
"dev": true,
"dependencies": {
"@docsearch/css": "^3.0.0",
"@docsearch/js": "^3.0.0",
"@vitejs/plugin-vue": "^2.3.2",
"prismjs": "^1.25.0",
"vite": "^2.9.7",
"vue": "^3.2.33"
},
"bin": {
"vitepress": "bin/vitepress.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/vue": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz",
"integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==",
"dev": true,
"dependencies": {
"@vue/compiler-dom": "3.2.47",
"@vue/compiler-sfc": "3.2.47",
"@vue/runtime-dom": "3.2.47",
"@vue/server-renderer": "3.2.47",
"@vue/shared": "3.2.47"
}
},
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true,
"engines": {
"node": ">=0.4"
}
},
"node_modules/yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"dev": true,
"engines": {
"node": ">= 6"
}
}
},
"dependencies": {
"@algolia/autocomplete-core": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz",
"integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==",
"dev": true,
"requires": {
"@algolia/autocomplete-shared": "1.7.4"
}
},
"@algolia/autocomplete-preset-algolia": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz",
"integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==",
"dev": true,
"requires": {
"@algolia/autocomplete-shared": "1.7.4"
}
},
"@algolia/autocomplete-shared": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz",
"integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==",
"dev": true
},
"@algolia/cache-browser-local-storage": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.15.0.tgz",
"integrity": "sha512-uxxFhTWh4JJDb2+FFSmNMfEQ8p9o2vjSpU7iW007QX3OvqljPPN68lk3bpZVaG8pwr5MU1DqpkZ71FcQdVTjgQ==",
"dev": true,
"requires": {
"@algolia/cache-common": "4.15.0"
}
},
"@algolia/cache-common": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.15.0.tgz",
"integrity": "sha512-Me3PbI4QurAM+3D+htIE0l1xt6+bl/18SG6Wc7bPQEZAtN7DTGz22HqhKNyLF2lR/cOfpaH7umXZlZEhIHf7gQ==",
"dev": true
},
"@algolia/cache-in-memory": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.15.0.tgz",
"integrity": "sha512-B9mg1wd7CKMfpkbiTQ8KlcKkH6ut/goVaI6XmDCUczOOqeuZlV34tuEi7o3Xo1j66KWr/d9pMjjGYcoVPCVeOA==",
"dev": true,
"requires": {
"@algolia/cache-common": "4.15.0"
}
},
"@algolia/client-account": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.15.0.tgz",
"integrity": "sha512-8wqI33HRZy5ydfFt6F5vMhtkOiAUhVfSCYXx4U3Go5RALqWLgVUp6wzOo0mr1z08POCkHDpbQMQvyayb1CZ/kw==",
"dev": true,
"requires": {
"@algolia/client-common": "4.15.0",
"@algolia/client-search": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"@algolia/client-analytics": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.15.0.tgz",
"integrity": "sha512-jrPjEeNEIIQKeA1XCZXx3f3aybtwF7wjYlnfHbLARuZ9AuHzimOKjX0ZwqvMmvTsHivpcZ2rqY+j1E8HoH1ELA==",
"dev": true,
"requires": {
"@algolia/client-common": "4.15.0",
"@algolia/client-search": "4.15.0",
"@algolia/requester-common": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"@algolia/client-common": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.15.0.tgz",
"integrity": "sha512-PlsJMObZuYw4JlG5EhYv1PHDOv7n5mD5PzqFyoNfSOYaEPRZepa3W579ya29yOu3FZ0VGMNJmB7Q5v/+/fwvIw==",
"dev": true,
"requires": {
"@algolia/requester-common": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"@algolia/client-personalization": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.15.0.tgz",
"integrity": "sha512-Bf0bhRAiNL9LWurzyHRH8UBi4fDt3VbCNkInxVngKQT1uCZWXecwoPWGhcSSpdanBqFJA/1WBt+BWx7a50Bhlg==",
"dev": true,
"requires": {
"@algolia/client-common": "4.15.0",
"@algolia/requester-common": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"@algolia/client-search": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.15.0.tgz",
"integrity": "sha512-dTwZD4u53WdmexnMcoO2Qd/+YCP3ESXKOtD2MryQ1a9dHwB2Y3Qob0kyS1PG82idwM3enbznvscI9Sf4o9PUWQ==",
"dev": true,
"requires": {
"@algolia/client-common": "4.15.0",
"@algolia/requester-common": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"@algolia/logger-common": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.15.0.tgz",
"integrity": "sha512-D8OFwn/HpvQz66goIcjxOKsYBMuxiruxJ3cA/bnc0EiDvSA2P2z6bNQWgS5gbstuTZIJmbhr+53NyOxFkmMNAA==",
"dev": true
},
"@algolia/logger-console": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.15.0.tgz",
"integrity": "sha512-pQOvVaRSEJQJRXKTnxEA6nN1hipSQadJJ4einw0nIlfMOGZh/kps1ybh8vRUlUGyfEuN/3dyFs0W3Ac7hIItlg==",
"dev": true,
"requires": {
"@algolia/logger-common": "4.15.0"
}
},
"@algolia/requester-browser-xhr": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.15.0.tgz",
"integrity": "sha512-va186EfALF+6msYZXaoBSxcnFCg3SoWJ+uv1yMyhQRJRe7cZSHWSVT3s40vmar90gxlBu80KMVwVlsvJhJv6ew==",
"dev": true,
"requires": {
"@algolia/requester-common": "4.15.0"
}
},
"@algolia/requester-common": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.15.0.tgz",
"integrity": "sha512-w0UUzxElbo4hrKg4QP/jiXDNbIJuAthxdlkos9nS8KAPK2XI3R9BlUjLz/ZVs4F9TDGI0mhjrNHhZ12KXcoyhg==",
"dev": true
},
"@algolia/requester-node-http": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.15.0.tgz",
"integrity": "sha512-eeEOhFtgwKcgAlKAZpgBRZJ0ILSEBCXxZ9uwfVWPD24W1b6z08gVoTJ6J7lCeCnJmudg+tMElDnGzHkjup9CJA==",
"dev": true,
"requires": {
"@algolia/requester-common": "4.15.0"
}
},
"@algolia/transporter": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.15.0.tgz",
"integrity": "sha512-JoWR+ixG3EmA0UPntQFN/FV5TasYcYu93d5+oKzHFeZ6Z7rtW5Im9iy/Oh/ggk1AAN5fTdqKewtbBpdaYDbKsQ==",
"dev": true,
"requires": {
"@algolia/cache-common": "4.15.0",
"@algolia/logger-common": "4.15.0",
"@algolia/requester-common": "4.15.0"
}
},
"@babel/parser": {
"version": "7.21.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz",
"integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==",
"dev": true
},
"@docsearch/css": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz",
"integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==",
"dev": true
},
"@docsearch/js": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.3.tgz",
"integrity": "sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==",
"dev": true,
"requires": {
"@docsearch/react": "3.3.3",
"preact": "^10.0.0"
}
},
"@docsearch/react": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz",
"integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==",
"dev": true,
"requires": {
"@algolia/autocomplete-core": "1.7.4",
"@algolia/autocomplete-preset-algolia": "1.7.4",
"@docsearch/css": "3.3.3",
"algoliasearch": "^4.0.0"
}
},
"@esbuild/linux-loong64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
"integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
"dev": true,
"optional": true
},
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
}
},
"@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true
},
"@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"requires": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
}
},
"@vitejs/plugin-vue": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz",
"integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==",
"dev": true,
"requires": {}
},
"@vue/compiler-core": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
"integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
"dev": true,
"requires": {
"@babel/parser": "^7.16.4",
"@vue/shared": "3.2.47",
"estree-walker": "^2.0.2",
"source-map": "^0.6.1"
}
},
"@vue/compiler-dom": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
"integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
"dev": true,
"requires": {
"@vue/compiler-core": "3.2.47",
"@vue/shared": "3.2.47"
}
},
"@vue/compiler-sfc": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
"integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
"dev": true,
"requires": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.47",
"@vue/compiler-dom": "3.2.47",
"@vue/compiler-ssr": "3.2.47",
"@vue/reactivity-transform": "3.2.47",
"@vue/shared": "3.2.47",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7",
"postcss": "^8.1.10",
"source-map": "^0.6.1"
}
},
"@vue/compiler-ssr": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
"integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
"dev": true,
"requires": {
"@vue/compiler-dom": "3.2.47",
"@vue/shared": "3.2.47"
}
},
"@vue/reactivity": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz",
"integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==",
"dev": true,
"requires": {
"@vue/shared": "3.2.47"
}
},
"@vue/reactivity-transform": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
"integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
"dev": true,
"requires": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.47",
"@vue/shared": "3.2.47",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7"
}
},
"@vue/runtime-core": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz",
"integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==",
"dev": true,
"requires": {
"@vue/reactivity": "3.2.47",
"@vue/shared": "3.2.47"
}
},
"@vue/runtime-dom": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz",
"integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==",
"dev": true,
"requires": {
"@vue/runtime-core": "3.2.47",
"@vue/shared": "3.2.47",
"csstype": "^2.6.8"
}
},
"@vue/server-renderer": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz",
"integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==",
"dev": true,
"requires": {
"@vue/compiler-ssr": "3.2.47",
"@vue/shared": "3.2.47"
}
},
"@vue/shared": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
"integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==",
"dev": true
},
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"dev": true,
"requires": {
"acorn": "^7.0.0",
"acorn-walk": "^7.0.0",
"xtend": "^4.0.2"
}
},
"acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
"dev": true
},
"algoliasearch": {
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.15.0.tgz",
"integrity": "sha512-+vgKQF5944dYsz9zhKk07JbOYeNdKisoD5GeG0woBL3nLzbn2a+nGwki60DXg7CXvaFXBcTXyJG4C+VaBVd44g==",
"dev": true,
"requires": {
"@algolia/cache-browser-local-storage": "4.15.0",
"@algolia/cache-common": "4.15.0",
"@algolia/cache-in-memory": "4.15.0",
"@algolia/client-account": "4.15.0",
"@algolia/client-analytics": "4.15.0",
"@algolia/client-common": "4.15.0",
"@algolia/client-personalization": "4.15.0",
"@algolia/client-search": "4.15.0",
"@algolia/logger-common": "4.15.0",
"@algolia/logger-console": "4.15.0",
"@algolia/requester-browser-xhr": "4.15.0",
"@algolia/requester-common": "4.15.0",
"@algolia/requester-node-http": "4.15.0",
"@algolia/transporter": "4.15.0"
}
},
"anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"arg": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"dev": true
},
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true
},
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
"fill-range": "^7.0.1"
}
},
"camelcase-css": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
"dev": true
},
"chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"requires": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"fsevents": "~2.3.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"dependencies": {
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
}
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
"dev": true
},
"csstype": {
"version": "2.6.21",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
"integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==",
"dev": true
},
"defined": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
"integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
"dev": true
},
"detective": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
"integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
"dev": true,
"requires": {
"acorn-node": "^1.8.2",
"defined": "^1.0.0",
"minimist": "^1.2.6"
}
},
"didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
"dev": true
},
"dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true
},
"esbuild": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
"integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
"dev": true,
"requires": {
"@esbuild/linux-loong64": "0.14.54",
"esbuild-android-64": "0.14.54",
"esbuild-android-arm64": "0.14.54",
"esbuild-darwin-64": "0.14.54",
"esbuild-darwin-arm64": "0.14.54",
"esbuild-freebsd-64": "0.14.54",
"esbuild-freebsd-arm64": "0.14.54",
"esbuild-linux-32": "0.14.54",
"esbuild-linux-64": "0.14.54",
"esbuild-linux-arm": "0.14.54",
"esbuild-linux-arm64": "0.14.54",
"esbuild-linux-mips64le": "0.14.54",
"esbuild-linux-ppc64le": "0.14.54",
"esbuild-linux-riscv64": "0.14.54",
"esbuild-linux-s390x": "0.14.54",
"esbuild-netbsd-64": "0.14.54",
"esbuild-openbsd-64": "0.14.54",
"esbuild-sunos-64": "0.14.54",
"esbuild-windows-32": "0.14.54",
"esbuild-windows-64": "0.14.54",
"esbuild-windows-arm64": "0.14.54"
}
},
"esbuild-android-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
"integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
"dev": true,
"optional": true
},
"esbuild-android-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
"integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
"dev": true,
"optional": true
},
"esbuild-darwin-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
"integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
"dev": true,
"optional": true
},
"esbuild-darwin-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
"integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
"dev": true,
"optional": true
},
"esbuild-freebsd-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
"integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
"dev": true,
"optional": true
},
"esbuild-freebsd-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
"integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
"dev": true,
"optional": true
},
"esbuild-linux-32": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
"integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
"dev": true,
"optional": true
},
"esbuild-linux-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
"integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
"dev": true,
"optional": true
},
"esbuild-linux-arm": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
"integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
"dev": true,
"optional": true
},
"esbuild-linux-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
"integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
"dev": true,
"optional": true
},
"esbuild-linux-mips64le": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
"integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
"dev": true,
"optional": true
},
"esbuild-linux-ppc64le": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
"integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
"dev": true,
"optional": true
},
"esbuild-linux-riscv64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
"integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
"dev": true,
"optional": true
},
"esbuild-linux-s390x": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
"integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
"dev": true,
"optional": true
},
"esbuild-netbsd-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
"integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
"dev": true,
"optional": true
},
"esbuild-openbsd-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
"integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
"dev": true,
"optional": true
},
"esbuild-sunos-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
"integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
"dev": true,
"optional": true
},
"esbuild-windows-32": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
"integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
"dev": true,
"optional": true
},
"esbuild-windows-64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
"integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
"dev": true,
"optional": true
},
"esbuild-windows-arm64": {
"version": "0.14.54",
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
"integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
"dev": true,
"optional": true
},
"estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"dev": true
},
"fast-glob": {
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
"integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
},
"dependencies": {
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
}
}
},
"fastq": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
"integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
}
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
"to-regex-range": "^5.0.1"
}
},
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"optional": true
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"requires": {
"is-glob": "^4.0.3"
}
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-core-module": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
"integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true
},
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
"lilconfig": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
"integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
"dev": true
},
"magic-string": {
"version": "0.25.9",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
"dev": true,
"requires": {
"sourcemap-codec": "^1.4.8"
}
},
"merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true
},
"micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dev": true,
"requires": {
"braces": "^3.0.2",
"picomatch": "^2.3.1"
}
},
"minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true
},
"nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"dev": true
},
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
"object-hash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
"dev": true
},
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
"dev": true
},
"postcss": {
"version": "8.4.21",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
"integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
"dev": true,
"requires": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
}
},
"postcss-import": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
"integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
"dev": true,
"requires": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
}
},
"postcss-js": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
"dev": true,
"requires": {
"camelcase-css": "^2.0.1"
}
},
"postcss-load-config": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
"integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
"dev": true,
"requires": {
"lilconfig": "^2.0.5",
"yaml": "^1.10.2"
}
},
"postcss-nested": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
"integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
"dev": true,
"requires": {
"postcss-selector-parser": "^6.0.10"
}
},
"postcss-selector-parser": {
"version": "6.0.11",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
"integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
}
},
"postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
"preact": {
"version": "10.13.1",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.13.1.tgz",
"integrity": "sha512-KyoXVDU5OqTpG9LXlB3+y639JAGzl8JSBXLn1J9HTSB3gbKcuInga7bZnXLlxmK94ntTs1EFeZp0lrja2AuBYQ==",
"dev": true
},
"prismjs": {
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
"dev": true
},
"queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true
},
"quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true
},
"read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"dev": true,
"requires": {
"pify": "^2.3.0"
}
},
"readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
}
},
"resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dev": true,
"requires": {
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
}
},
"reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true
},
"rollup": {
"version": "2.77.3",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz",
"integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
"dev": true,
"requires": {
"fsevents": "~2.3.2"
}
},
"run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"requires": {
"queue-microtask": "^1.2.2"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true
},
"sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
"dev": true
},
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"tailwindcss": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz",
"integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==",
"dev": true,
"requires": {
"arg": "^5.0.2",
"chokidar": "^3.5.3",
"color-name": "^1.1.4",
"detective": "^5.2.1",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.2.12",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"lilconfig": "^2.0.6",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
"picocolors": "^1.0.0",
"postcss": "^8.0.9",
"postcss-import": "^14.1.0",
"postcss-js": "^4.0.0",
"postcss-load-config": "^3.1.4",
"postcss-nested": "6.0.0",
"postcss-selector-parser": "^6.0.11",
"postcss-value-parser": "^4.2.0",
"quick-lru": "^5.1.1",
"resolve": "^1.22.1"
}
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
"is-number": "^7.0.0"
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
"vite": {
"version": "2.9.15",
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz",
"integrity": "sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==",
"dev": true,
"requires": {
"esbuild": "^0.14.27",
"fsevents": "~2.3.2",
"postcss": "^8.4.13",
"resolve": "^1.22.0",
"rollup": ">=2.59.0 <2.78.0"
}
},
"vitepress": {
"version": "0.22.4",
"resolved": "https://registry.npmjs.org/vitepress/-/vitepress-0.22.4.tgz",
"integrity": "sha512-oZUnLO/SpYdThaBKefDeOiVlr0Rie4Ppx3FzMnMyLtJnI5GlBMNjqYqMy/4+umm/iC+ZDJfI+IlDKxv5fZnYzA==",
"dev": true,
"requires": {
"@docsearch/css": "^3.0.0",
"@docsearch/js": "^3.0.0",
"@vitejs/plugin-vue": "^2.3.2",
"prismjs": "^1.25.0",
"vite": "^2.9.7",
"vue": "^3.2.33"
}
},
"vue": {
"version": "3.2.47",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz",
"integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==",
"dev": true,
"requires": {
"@vue/compiler-dom": "3.2.47",
"@vue/compiler-sfc": "3.2.47",
"@vue/runtime-dom": "3.2.47",
"@vue/server-renderer": "3.2.47",
"@vue/shared": "3.2.47"
}
},
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
"yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"dev": true
}
}
}

View file

@ -1,21 +1,28 @@
{
"name": "castopod-docs",
"version": "0.0.0-development",
"description": "Castopod documentation using vitepress",
"main": "index.js",
"name": "civil-chasm",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "vitepress --port=3050",
"build": "vitepress build",
"serve": "vitepress serve"
"dev": "astro dev",
"start": "astro dev",
"build": "astro check && astro build",
"preview": "astro preview",
"astro": "astro",
"prepare": "astro telemetry disable"
},
"author": {
"name": "Yassine Doghri",
"email": "yassine@doghri.fr",
"url": "https://code.castopod.org/yassine"
},
"license": "AGPL-3.0-or-later",
"devDependencies": {
"tailwindcss": "^3.2.7",
"vitepress": "^0.22.4"
"dependencies": {
"@astrojs/check": "^0.7.0",
"@astrojs/starlight": "^0.22.4",
"@astrojs/starlight-tailwind": "^2.0.2",
"@astrojs/tailwind": "^5.1.0",
"@fontsource/inter": "^5.0.18",
"@fontsource/rubik": "^5.0.20",
"astro": "^4.8.6",
"autoprefixer": "^10.4.19",
"cssnano": "^7.0.1",
"postcss-preset-env": "^9.5.13",
"sharp": "^0.33.4",
"tailwindcss": "^3.4.3",
"typescript": "^5.4.5"
}
}

9544
docs/pnpm-lock.yaml generated Normal file
View file

@ -0,0 +1,9544 @@
lockfileVersion: "9.0"
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
"@astrojs/check":
specifier: ^0.7.0
version: 0.7.0(typescript@5.4.5)
"@astrojs/starlight":
specifier: ^0.22.4
version: 0.22.4(astro@4.8.6(typescript@5.4.5))
"@astrojs/starlight-tailwind":
specifier: ^2.0.2
version: 2.0.2(@astrojs/starlight@0.22.4(astro@4.8.6(typescript@5.4.5)))(@astrojs/tailwind@5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3))(tailwindcss@3.4.3)
"@astrojs/tailwind":
specifier: ^5.1.0
version: 5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3)
"@fontsource/inter":
specifier: ^5.0.18
version: 5.0.18
"@fontsource/rubik":
specifier: ^5.0.20
version: 5.0.20
astro:
specifier: ^4.8.6
version: 4.8.6(typescript@5.4.5)
autoprefixer:
specifier: ^10.4.19
version: 10.4.19(postcss@8.4.33)
cssnano:
specifier: ^7.0.1
version: 7.0.1(postcss@8.4.33)
postcss-preset-env:
specifier: ^9.5.13
version: 9.5.13(postcss@8.4.33)
sharp:
specifier: ^0.33.4
version: 0.33.4
tailwindcss:
specifier: ^3.4.3
version: 3.4.3
typescript:
specifier: ^5.4.5
version: 5.4.5
packages:
"@alloc/quick-lru@5.2.0":
resolution:
{
integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==,
}
engines: { node: ">=10" }
"@ampproject/remapping@2.2.1":
resolution:
{
integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==,
}
engines: { node: ">=6.0.0" }
"@astrojs/check@0.7.0":
resolution:
{
integrity: sha512-UTqwOeKNu9IYZmJXEeWnQuTdSd/pX58Hl4TUARsMlT97SVDL//kLBE4T/ctxRz6J573N87oE5ddtW/uOOnQTug==,
}
hasBin: true
peerDependencies:
typescript: ^5.0.0
"@astrojs/compiler@2.8.0":
resolution:
{
integrity: sha512-yrpD1WRGqsJwANaDIdtHo+YVjvIOFAjC83lu5qENIgrafwZcJgSXDuwVMXOgok4tFzpeKLsFQ6c3FoUdloLWBQ==,
}
"@astrojs/internal-helpers@0.4.0":
resolution:
{
integrity: sha512-6B13lz5n6BrbTqCTwhXjJXuR1sqiX/H6rTxzlXx+lN1NnV4jgnq/KJldCQaUWJzPL5SiWahQyinxAbxQtwgPHA==,
}
"@astrojs/language-server@2.10.0":
resolution:
{
integrity: sha512-crHXpqYfA5qWioiuZnZFpTsNItgBlF1f0S9MzDYS7/pfCALkHNJ7K3w9U/j0uMKymsT4hC7BfMaX0DYlfdSzHg==,
}
hasBin: true
peerDependencies:
prettier: ^3.0.0
prettier-plugin-astro: ">=0.11.0"
peerDependenciesMeta:
prettier:
optional: true
prettier-plugin-astro:
optional: true
"@astrojs/markdown-remark@5.1.0":
resolution:
{
integrity: sha512-S6Z3K2hOB7MfjeDoHsotnP/q2UsnEDB8NlNAaCjMDsGBZfTUbWxyLW3CaphEWw08f6KLZi2ibK9yC3BaMhh2NQ==,
}
"@astrojs/mdx@2.3.1":
resolution:
{
integrity: sha512-BOQFKD2Pi9cRntNQJlpF2fh4xV8doNpmVy9NKI95r4jsitrY4X5aTOhAowi+fkQgP/zW1A4HwCyQ6Pdam6z8zQ==,
}
engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 }
peerDependencies:
astro: ^4.0.0
"@astrojs/prism@3.1.0":
resolution:
{
integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==,
}
engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 }
"@astrojs/sitemap@3.0.5":
resolution:
{
integrity: sha512-60eLzNjMza3ABypiQPUC6ElOSZNZeY5CwSwgJ03hfeonl+Db9x12CCzBFdTw7A5Mq+O54xEZVUrR0tB+yWgX8w==,
}
"@astrojs/starlight-tailwind@2.0.2":
resolution:
{
integrity: sha512-XJccwk6VLeQZuGQwoiLZLNAPCn2fQobtl10Ra2c2yDLjdYEActcqy0eidZbouAwGlbS9I0iJogeGjHQJ2Casjg==,
}
peerDependencies:
"@astrojs/starlight": ">=0.9.0"
"@astrojs/tailwind": ^5.0.0
tailwindcss: ^3.3.3
"@astrojs/starlight@0.22.4":
resolution:
{
integrity: sha512-AgiVEVv2ZkGHkoJcjY0azXG2K7892i+z4FpKtasnESTciomO91I/X9vAfKfHxmTxdVP5BGPxBFVi0Bp2X4Lxvg==,
}
peerDependencies:
astro: ^4.2.7
"@astrojs/tailwind@5.1.0":
resolution:
{
integrity: sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==,
}
peerDependencies:
astro: ^3.0.0 || ^4.0.0
tailwindcss: ^3.0.24
"@astrojs/telemetry@3.1.0":
resolution:
{
integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==,
}
engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 }
"@babel/code-frame@7.24.2":
resolution:
{
integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==,
}
engines: { node: ">=6.9.0" }
"@babel/compat-data@7.24.4":
resolution:
{
integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==,
}
engines: { node: ">=6.9.0" }
"@babel/core@7.24.5":
resolution:
{
integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==,
}
engines: { node: ">=6.9.0" }
"@babel/generator@7.24.5":
resolution:
{
integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-annotate-as-pure@7.22.5":
resolution:
{
integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-compilation-targets@7.23.6":
resolution:
{
integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-environment-visitor@7.22.20":
resolution:
{
integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-function-name@7.23.0":
resolution:
{
integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-hoist-variables@7.22.5":
resolution:
{
integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-module-imports@7.22.15":
resolution:
{
integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-module-imports@7.24.3":
resolution:
{
integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-module-transforms@7.24.5":
resolution:
{
integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==,
}
engines: { node: ">=6.9.0" }
peerDependencies:
"@babel/core": ^7.0.0
"@babel/helper-plugin-utils@7.22.5":
resolution:
{
integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-simple-access@7.24.5":
resolution:
{
integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-split-export-declaration@7.24.5":
resolution:
{
integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-string-parser@7.24.1":
resolution:
{
integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-validator-identifier@7.24.5":
resolution:
{
integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==,
}
engines: { node: ">=6.9.0" }
"@babel/helper-validator-option@7.23.5":
resolution:
{
integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==,
}
engines: { node: ">=6.9.0" }
"@babel/helpers@7.24.5":
resolution:
{
integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==,
}
engines: { node: ">=6.9.0" }
"@babel/highlight@7.24.5":
resolution:
{
integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==,
}
engines: { node: ">=6.9.0" }
"@babel/parser@7.24.5":
resolution:
{
integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==,
}
engines: { node: ">=6.0.0" }
hasBin: true
"@babel/plugin-syntax-jsx@7.23.3":
resolution:
{
integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==,
}
engines: { node: ">=6.9.0" }
peerDependencies:
"@babel/core": ^7.0.0-0
"@babel/plugin-transform-react-jsx@7.23.4":
resolution:
{
integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==,
}
engines: { node: ">=6.9.0" }
peerDependencies:
"@babel/core": ^7.0.0-0
"@babel/template@7.22.15":
resolution:
{
integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==,
}
engines: { node: ">=6.9.0" }
"@babel/template@7.24.0":
resolution:
{
integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==,
}
engines: { node: ">=6.9.0" }
"@babel/traverse@7.24.5":
resolution:
{
integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==,
}
engines: { node: ">=6.9.0" }
"@babel/types@7.24.5":
resolution:
{
integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==,
}
engines: { node: ">=6.9.0" }
"@csstools/cascade-layer-name-parser@1.0.11":
resolution:
{
integrity: sha512-yhsonEAhaWRQvHFYhSzOUobH2Ev++fMci+ppFRagw0qVSPlcPV4FnNmlwpM/b2BM10ZeMRkVV4So6YRswD0O0w==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
"@csstools/css-parser-algorithms": ^2.6.3
"@csstools/css-tokenizer": ^2.3.1
"@csstools/color-helpers@4.2.0":
resolution:
{
integrity: sha512-hJJrSBzbfGxUsaR6X4Bzd/FLx0F1ulKnR5ljY9AiXCtsR+H+zSWQDFWlKES1BRaVZTDHLpIIHS9K2o0h+JLlrg==,
}
engines: { node: ^14 || ^16 || >=18 }
"@csstools/css-calc@1.2.2":
resolution:
{
integrity: sha512-0owrl7AruDRKAxoSIW8XzJdz7GnuW3AOj4rYLfmXsoKIX2ZZzttzGXoiC8n8V08X7wIBlEWWVB4C8fAN18+I6Q==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
"@csstools/css-parser-algorithms": ^2.6.3
"@csstools/css-tokenizer": ^2.3.1
"@csstools/css-color-parser@2.0.2":
resolution:
{
integrity: sha512-Agx2YmxTcZ7TfB7KNZQ+iekaxbWSdblvtA35aTwE3KfuYyjOlCg3P4KGGdQF/cjm1pHWVSBo5duF/BRfZ8s07A==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
"@csstools/css-parser-algorithms": ^2.6.3
"@csstools/css-tokenizer": ^2.3.1
"@csstools/css-parser-algorithms@2.6.3":
resolution:
{
integrity: sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
"@csstools/css-tokenizer": ^2.3.1
"@csstools/css-tokenizer@2.3.1":
resolution:
{
integrity: sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==,
}
engines: { node: ^14 || ^16 || >=18 }
"@csstools/media-query-list-parser@2.1.11":
resolution:
{
integrity: sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
"@csstools/css-parser-algorithms": ^2.6.3
"@csstools/css-tokenizer": ^2.3.1
"@csstools/postcss-cascade-layers@4.0.6":
resolution:
{
integrity: sha512-Xt00qGAQyqAODFiFEJNkTpSUz5VfYqnDLECdlA/Vv17nl/OIV5QfTRHGAXrBGG5YcJyHpJ+GF9gF/RZvOQz4oA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-color-function@3.0.16":
resolution:
{
integrity: sha512-KtmXfckANSKsLBoTQCzggvKft1cmmmDKYjFO4yVlB23nWUgGInVBTE9T5JLmH29NNdTWSEPLWPUxoQ6XiIEn2Q==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-color-mix-function@2.0.16":
resolution:
{
integrity: sha512-BJnD1M5Pdypl1cJuwGuzVC52PqgzaObsDLu34jgf+QU7daVFqz432PvpqvXTmfTSNt4OckOT1QIzWexEFlDNXw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-exponential-functions@1.0.7":
resolution:
{
integrity: sha512-9usBPQX74OhiF/VuaVrp44UAPzqbKNyoaxEa6tbEXiFp+OAm3yB/TLRKyPUWg5tvvHGCduGJVdJJB3w8c8NBtA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-font-format-keywords@3.0.2":
resolution:
{
integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-gamut-mapping@1.0.9":
resolution:
{
integrity: sha512-JmOeiBJj1RJriAkr+aLBaiYUpEqdNOIo3ERQ5a4uNzy18upzrQ6tz7m2Vt1GQpJ62zQj7rC5PjAhCoZCoyE31g==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-gradients-interpolation-method@4.0.17":
resolution:
{
integrity: sha512-qSNIqzLPKd2SadfWwHZv42lDRyYlLaM+Vx5rRIsnYCZbQxzFfe1XAwssrcCsHgba5bA6bi5oDoFCx0W+PRCpfw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-hwb-function@3.0.15":
resolution:
{
integrity: sha512-l34fRiZ7o5+pULv7OplXniBTU4TuKYNNOv0abuvUanddWGSy3+YHlMKUSgcVFo0d1DorxPAhJSTCrugl+4OmMQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-ic-unit@3.0.6":
resolution:
{
integrity: sha512-fHaU9C/sZPauXMrzPitZ/xbACbvxbkPpHoUgB9Kw5evtsBWdVkVrajOyiT9qX7/c+G1yjApoQjP1fQatldsy9w==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-initial@1.0.1":
resolution:
{
integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-is-pseudo-class@4.0.8":
resolution:
{
integrity: sha512-0aj591yGlq5Qac+plaWCbn5cpjs5Sh0daovYUKJUOMjIp70prGH/XPLp7QjxtbFXz3CTvb0H9a35dpEuIuUi3Q==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-light-dark-function@1.0.5":
resolution:
{
integrity: sha512-kKM9dtEaVmSTb3scL2pgef62KyWv6SK19JiAnCCuiDhlRE6PADKzaPPBXmP3qj4IEgIH+cQhdEosB0eroU6Fnw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-logical-float-and-clear@2.0.1":
resolution:
{
integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-logical-overflow@1.0.1":
resolution:
{
integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-logical-overscroll-behavior@1.0.1":
resolution:
{
integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-logical-resize@2.0.1":
resolution:
{
integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-logical-viewport-units@2.0.9":
resolution:
{
integrity: sha512-iBBJuExgHwedFH9AqNOHWzZFgYnt17zhu1qWjmSihu1P5pw0lIG9q5t3uIgJJFDNmYoOGfBKan66z9u1QH8yBQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-media-minmax@1.1.6":
resolution:
{
integrity: sha512-bc0frf2Lod53j6wEHVsaVElfvCf6uhc96v99M/wUfer4MmNYfO3YLx1kFuB8xXvb0AXiWx4fohCJqemHV3bfRg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.9":
resolution:
{
integrity: sha512-PR0s3tFSxPoKoPLoKuiZuYhwQC5bQxq/gFfywX2u/kh8rMzesARPZYKxE71I3jHWi6KDHGZl9Xb5xcFPwtvLiQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-nested-calc@3.0.2":
resolution:
{
integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-normalize-display-values@3.0.2":
resolution:
{
integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-oklab-function@3.0.16":
resolution:
{
integrity: sha512-zm8nND+EraZrmbO4mgcT8FrJrAQUfWNfMmbV5uTCpWtAcO5ycX3E3bO8T1TjczKYRxC5QMM/91n9YExYCF4Mvw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-progressive-custom-properties@3.2.0":
resolution:
{
integrity: sha512-BZlirVxCRgKlE7yVme+Xvif72eTn1MYXj8oZ4Knb+jwaH4u3AN1DjbhM7j86RP5vvuAOexJ4JwfifYYKWMN/QQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-relative-color-syntax@2.0.16":
resolution:
{
integrity: sha512-TSM8fVqJkT8JZDranZPnkpxjU/Q1sNR192lXMND+EcKOUjYa6uYpGSfHgjnWjCRiBSciettS+sL7y9wmnas7qQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-scope-pseudo-class@3.0.1":
resolution:
{
integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-stepped-value-functions@3.0.8":
resolution:
{
integrity: sha512-X76+thsvsmH/SkqVbN+vjeFKe1ABGLRx8/Wl68QTb/zvJWdzgx5S/nbszZP5O3nTRc5eI8NxIOrQUiy30fR+0g==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-text-decoration-shorthand@3.0.6":
resolution:
{
integrity: sha512-Q8HEu4AEiwNVZBD6+DpQ8M9SajpMow4+WtmndWIAv8qxDtDYL4JK1xXWkhOGk28PrcJawOvkrEZ8Ri59UN1TJw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-trigonometric-functions@3.0.8":
resolution:
{
integrity: sha512-zEzyGriPqoIYFgHJqWNy8bmoxjM4+ONyTap1ZzQK/Lll/VsCYvx0IckB33W/u89uLSVeeB8xC7uTrkoQ7ogKyQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-unset-value@3.0.1":
resolution:
{
integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@csstools/selector-resolve-nested@1.1.0":
resolution:
{
integrity: sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss-selector-parser: ^6.0.13
"@csstools/selector-specificity@3.1.1":
resolution:
{
integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss-selector-parser: ^6.0.13
"@csstools/utilities@1.0.0":
resolution:
{
integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
"@ctrl/tinycolor@4.1.0":
resolution:
{
integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==,
}
engines: { node: ">=14" }
"@emmetio/abbreviation@2.3.3":
resolution:
{
integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==,
}
"@emmetio/css-abbreviation@2.1.8":
resolution:
{
integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==,
}
"@emmetio/css-parser@0.4.0":
resolution:
{
integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==,
}
"@emmetio/html-matcher@1.3.0":
resolution:
{
integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==,
}
"@emmetio/scanner@1.0.4":
resolution:
{
integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==,
}
"@emmetio/stream-reader-utils@0.1.0":
resolution:
{
integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==,
}
"@emmetio/stream-reader@2.2.0":
resolution:
{
integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==,
}
"@emnapi/runtime@1.1.1":
resolution:
{
integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==,
}
"@esbuild/aix-ppc64@0.20.2":
resolution:
{
integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==,
}
engines: { node: ">=12" }
cpu: [ppc64]
os: [aix]
"@esbuild/aix-ppc64@0.21.3":
resolution:
{
integrity: sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==,
}
engines: { node: ">=12" }
cpu: [ppc64]
os: [aix]
"@esbuild/android-arm64@0.20.2":
resolution:
{
integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [android]
"@esbuild/android-arm64@0.21.3":
resolution:
{
integrity: sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [android]
"@esbuild/android-arm@0.20.2":
resolution:
{
integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==,
}
engines: { node: ">=12" }
cpu: [arm]
os: [android]
"@esbuild/android-arm@0.21.3":
resolution:
{
integrity: sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==,
}
engines: { node: ">=12" }
cpu: [arm]
os: [android]
"@esbuild/android-x64@0.20.2":
resolution:
{
integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [android]
"@esbuild/android-x64@0.21.3":
resolution:
{
integrity: sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [android]
"@esbuild/darwin-arm64@0.20.2":
resolution:
{
integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [darwin]
"@esbuild/darwin-arm64@0.21.3":
resolution:
{
integrity: sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [darwin]
"@esbuild/darwin-x64@0.20.2":
resolution:
{
integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [darwin]
"@esbuild/darwin-x64@0.21.3":
resolution:
{
integrity: sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [darwin]
"@esbuild/freebsd-arm64@0.20.2":
resolution:
{
integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [freebsd]
"@esbuild/freebsd-arm64@0.21.3":
resolution:
{
integrity: sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [freebsd]
"@esbuild/freebsd-x64@0.20.2":
resolution:
{
integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [freebsd]
"@esbuild/freebsd-x64@0.21.3":
resolution:
{
integrity: sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [freebsd]
"@esbuild/linux-arm64@0.20.2":
resolution:
{
integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [linux]
"@esbuild/linux-arm64@0.21.3":
resolution:
{
integrity: sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [linux]
"@esbuild/linux-arm@0.20.2":
resolution:
{
integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==,
}
engines: { node: ">=12" }
cpu: [arm]
os: [linux]
"@esbuild/linux-arm@0.21.3":
resolution:
{
integrity: sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==,
}
engines: { node: ">=12" }
cpu: [arm]
os: [linux]
"@esbuild/linux-ia32@0.20.2":
resolution:
{
integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==,
}
engines: { node: ">=12" }
cpu: [ia32]
os: [linux]
"@esbuild/linux-ia32@0.21.3":
resolution:
{
integrity: sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==,
}
engines: { node: ">=12" }
cpu: [ia32]
os: [linux]
"@esbuild/linux-loong64@0.20.2":
resolution:
{
integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==,
}
engines: { node: ">=12" }
cpu: [loong64]
os: [linux]
"@esbuild/linux-loong64@0.21.3":
resolution:
{
integrity: sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==,
}
engines: { node: ">=12" }
cpu: [loong64]
os: [linux]
"@esbuild/linux-mips64el@0.20.2":
resolution:
{
integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==,
}
engines: { node: ">=12" }
cpu: [mips64el]
os: [linux]
"@esbuild/linux-mips64el@0.21.3":
resolution:
{
integrity: sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==,
}
engines: { node: ">=12" }
cpu: [mips64el]
os: [linux]
"@esbuild/linux-ppc64@0.20.2":
resolution:
{
integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==,
}
engines: { node: ">=12" }
cpu: [ppc64]
os: [linux]
"@esbuild/linux-ppc64@0.21.3":
resolution:
{
integrity: sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==,
}
engines: { node: ">=12" }
cpu: [ppc64]
os: [linux]
"@esbuild/linux-riscv64@0.20.2":
resolution:
{
integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==,
}
engines: { node: ">=12" }
cpu: [riscv64]
os: [linux]
"@esbuild/linux-riscv64@0.21.3":
resolution:
{
integrity: sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==,
}
engines: { node: ">=12" }
cpu: [riscv64]
os: [linux]
"@esbuild/linux-s390x@0.20.2":
resolution:
{
integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==,
}
engines: { node: ">=12" }
cpu: [s390x]
os: [linux]
"@esbuild/linux-s390x@0.21.3":
resolution:
{
integrity: sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==,
}
engines: { node: ">=12" }
cpu: [s390x]
os: [linux]
"@esbuild/linux-x64@0.20.2":
resolution:
{
integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [linux]
"@esbuild/linux-x64@0.21.3":
resolution:
{
integrity: sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [linux]
"@esbuild/netbsd-x64@0.20.2":
resolution:
{
integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [netbsd]
"@esbuild/netbsd-x64@0.21.3":
resolution:
{
integrity: sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [netbsd]
"@esbuild/openbsd-x64@0.20.2":
resolution:
{
integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [openbsd]
"@esbuild/openbsd-x64@0.21.3":
resolution:
{
integrity: sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [openbsd]
"@esbuild/sunos-x64@0.20.2":
resolution:
{
integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [sunos]
"@esbuild/sunos-x64@0.21.3":
resolution:
{
integrity: sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [sunos]
"@esbuild/win32-arm64@0.20.2":
resolution:
{
integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [win32]
"@esbuild/win32-arm64@0.21.3":
resolution:
{
integrity: sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==,
}
engines: { node: ">=12" }
cpu: [arm64]
os: [win32]
"@esbuild/win32-ia32@0.20.2":
resolution:
{
integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==,
}
engines: { node: ">=12" }
cpu: [ia32]
os: [win32]
"@esbuild/win32-ia32@0.21.3":
resolution:
{
integrity: sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==,
}
engines: { node: ">=12" }
cpu: [ia32]
os: [win32]
"@esbuild/win32-x64@0.20.2":
resolution:
{
integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [win32]
"@esbuild/win32-x64@0.21.3":
resolution:
{
integrity: sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==,
}
engines: { node: ">=12" }
cpu: [x64]
os: [win32]
"@expressive-code/core@0.35.3":
resolution:
{
integrity: sha512-SYamcarAjufYhbuK/kfvJSvAXLsfnM7DKc78R7Dq4B73R5bKQK2m5zR0l57tXr4yp2C5Z8lu5xZncdwWxcmPdg==,
}
"@expressive-code/plugin-frames@0.35.3":
resolution:
{
integrity: sha512-QYytMq6IsaHgTofQ5b6d+CnbxkqLdikSF2hC+IL/ZZwPYHYZoUlmjIwmJZhY4/hHqJGELrtZsyVdlt06RntgmA==,
}
"@expressive-code/plugin-shiki@0.35.3":
resolution:
{
integrity: sha512-aFQBPepv0zhVXqJFAvfQ4vXYv/meJKiqmEEKSxdjAfwXllIV49PDlnGEXmbGYjR4hUQQjbfDgzAbrbfePc3YVQ==,
}
"@expressive-code/plugin-text-markers@0.35.3":
resolution:
{
integrity: sha512-gDdnQrfDRXw5Y+PKHJDkpAUdf2pthYOthGcgy3JB8GOTQ3EL1h+755Ct/bGc4MR6jn+dgnQP47uHMWQaccvN6Q==,
}
"@fontsource/inter@5.0.18":
resolution:
{
integrity: sha512-YCsoYPTcs713sI7tLtxaPrIhXAXvEetGg5Ry02ivA8qUOb3fQHojbK/X9HLD5OOKvFUNR2Ynkwb1kR1hVKQHpw==,
}
"@fontsource/rubik@5.0.20":
resolution:
{
integrity: sha512-4iEk1Nnnz4kzrpfsjfHXOm7HDVtsDfs8uihhE4LaXqQuxnY8lERZWJhtGAKILDwbx3gsnVXI+0beUNLRmaHeCw==,
}
"@img/sharp-darwin-arm64@0.33.4":
resolution:
{
integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==,
}
engines:
{
glibc: ">=2.26",
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [arm64]
os: [darwin]
"@img/sharp-darwin-x64@0.33.4":
resolution:
{
integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==,
}
engines:
{
glibc: ">=2.26",
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [x64]
os: [darwin]
"@img/sharp-libvips-darwin-arm64@1.0.2":
resolution:
{
integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==,
}
engines: { macos: ">=11", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" }
cpu: [arm64]
os: [darwin]
"@img/sharp-libvips-darwin-x64@1.0.2":
resolution:
{
integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==,
}
engines:
{ macos: ">=10.13", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" }
cpu: [x64]
os: [darwin]
"@img/sharp-libvips-linux-arm64@1.0.2":
resolution:
{
integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==,
}
engines:
{ glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" }
cpu: [arm64]
os: [linux]
"@img/sharp-libvips-linux-arm@1.0.2":
resolution:
{
integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==,
}
engines:
{ glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" }
cpu: [arm]
os: [linux]
"@img/sharp-libvips-linux-s390x@1.0.2":
resolution:
{
integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==,
}
engines:
{ glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" }
cpu: [s390x]
os: [linux]
"@img/sharp-libvips-linux-x64@1.0.2":
resolution:
{
integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==,
}
engines:
{ glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" }
cpu: [x64]
os: [linux]
"@img/sharp-libvips-linuxmusl-arm64@1.0.2":
resolution:
{
integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==,
}
engines:
{ musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" }
cpu: [arm64]
os: [linux]
"@img/sharp-libvips-linuxmusl-x64@1.0.2":
resolution:
{
integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==,
}
engines:
{ musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" }
cpu: [x64]
os: [linux]
"@img/sharp-linux-arm64@0.33.4":
resolution:
{
integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==,
}
engines:
{
glibc: ">=2.26",
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [arm64]
os: [linux]
"@img/sharp-linux-arm@0.33.4":
resolution:
{
integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==,
}
engines:
{
glibc: ">=2.28",
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [arm]
os: [linux]
"@img/sharp-linux-s390x@0.33.4":
resolution:
{
integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==,
}
engines:
{
glibc: ">=2.31",
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [s390x]
os: [linux]
"@img/sharp-linux-x64@0.33.4":
resolution:
{
integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==,
}
engines:
{
glibc: ">=2.26",
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [x64]
os: [linux]
"@img/sharp-linuxmusl-arm64@0.33.4":
resolution:
{
integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==,
}
engines:
{
musl: ">=1.2.2",
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [arm64]
os: [linux]
"@img/sharp-linuxmusl-x64@0.33.4":
resolution:
{
integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==,
}
engines:
{
musl: ">=1.2.2",
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [x64]
os: [linux]
"@img/sharp-wasm32@0.33.4":
resolution:
{
integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==,
}
engines:
{
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [wasm32]
"@img/sharp-win32-ia32@0.33.4":
resolution:
{
integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==,
}
engines:
{
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [ia32]
os: [win32]
"@img/sharp-win32-x64@0.33.4":
resolution:
{
integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==,
}
engines:
{
node: ^18.17.0 || ^20.3.0 || >=21.0.0,
npm: ">=9.6.5",
pnpm: ">=7.1.0",
yarn: ">=3.2.0",
}
cpu: [x64]
os: [win32]
"@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462":
resolution:
{
integrity: sha512-etqLfpSJ5zaw76KUNF603be6d6QsiQPmaHr9FKEp4zhLZJzWCCMH6Icak7MtLUFLZLMpL761mZNImi/joBo1ZA==,
}
"@jridgewell/gen-mapping@0.3.3":
resolution:
{
integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==,
}
engines: { node: ">=6.0.0" }
"@jridgewell/gen-mapping@0.3.5":
resolution:
{
integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==,
}
engines: { node: ">=6.0.0" }
"@jridgewell/resolve-uri@3.1.1":
resolution:
{
integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==,
}
engines: { node: ">=6.0.0" }
"@jridgewell/set-array@1.1.2":
resolution:
{
integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==,
}
engines: { node: ">=6.0.0" }
"@jridgewell/set-array@1.2.1":
resolution:
{
integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==,
}
engines: { node: ">=6.0.0" }
"@jridgewell/sourcemap-codec@1.4.15":
resolution:
{
integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==,
}
"@jridgewell/trace-mapping@0.3.20":
resolution:
{
integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==,
}
"@jridgewell/trace-mapping@0.3.25":
resolution:
{
integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==,
}
"@mdx-js/mdx@3.0.0":
resolution:
{
integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==,
}
"@nodelib/fs.scandir@2.1.5":
resolution:
{
integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==,
}
engines: { node: ">= 8" }
"@nodelib/fs.stat@2.0.5":
resolution:
{
integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==,
}
engines: { node: ">= 8" }
"@nodelib/fs.walk@1.2.8":
resolution:
{
integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==,
}
engines: { node: ">= 8" }
"@pagefind/darwin-arm64@1.0.4":
resolution:
{
integrity: sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==,
}
cpu: [arm64]
os: [darwin]
"@pagefind/darwin-x64@1.0.4":
resolution:
{
integrity: sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==,
}
cpu: [x64]
os: [darwin]
"@pagefind/default-ui@1.0.4":
resolution:
{
integrity: sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==,
}
"@pagefind/linux-arm64@1.0.4":
resolution:
{
integrity: sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==,
}
cpu: [arm64]
os: [linux]
"@pagefind/linux-x64@1.0.4":
resolution:
{
integrity: sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==,
}
cpu: [x64]
os: [linux]
"@pagefind/windows-x64@1.0.4":
resolution:
{
integrity: sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==,
}
cpu: [x64]
os: [win32]
"@rollup/rollup-android-arm-eabi@4.17.2":
resolution:
{
integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==,
}
cpu: [arm]
os: [android]
"@rollup/rollup-android-arm64@4.17.2":
resolution:
{
integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==,
}
cpu: [arm64]
os: [android]
"@rollup/rollup-darwin-arm64@4.17.2":
resolution:
{
integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==,
}
cpu: [arm64]
os: [darwin]
"@rollup/rollup-darwin-x64@4.17.2":
resolution:
{
integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==,
}
cpu: [x64]
os: [darwin]
"@rollup/rollup-linux-arm-gnueabihf@4.17.2":
resolution:
{
integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==,
}
cpu: [arm]
os: [linux]
"@rollup/rollup-linux-arm-musleabihf@4.17.2":
resolution:
{
integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==,
}
cpu: [arm]
os: [linux]
"@rollup/rollup-linux-arm64-gnu@4.17.2":
resolution:
{
integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==,
}
cpu: [arm64]
os: [linux]
"@rollup/rollup-linux-arm64-musl@4.17.2":
resolution:
{
integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==,
}
cpu: [arm64]
os: [linux]
"@rollup/rollup-linux-powerpc64le-gnu@4.17.2":
resolution:
{
integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==,
}
cpu: [ppc64]
os: [linux]
"@rollup/rollup-linux-riscv64-gnu@4.17.2":
resolution:
{
integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==,
}
cpu: [riscv64]
os: [linux]
"@rollup/rollup-linux-s390x-gnu@4.17.2":
resolution:
{
integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==,
}
cpu: [s390x]
os: [linux]
"@rollup/rollup-linux-x64-gnu@4.17.2":
resolution:
{
integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==,
}
cpu: [x64]
os: [linux]
"@rollup/rollup-linux-x64-musl@4.17.2":
resolution:
{
integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==,
}
cpu: [x64]
os: [linux]
"@rollup/rollup-win32-arm64-msvc@4.17.2":
resolution:
{
integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==,
}
cpu: [arm64]
os: [win32]
"@rollup/rollup-win32-ia32-msvc@4.17.2":
resolution:
{
integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==,
}
cpu: [ia32]
os: [win32]
"@rollup/rollup-win32-x64-msvc@4.17.2":
resolution:
{
integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==,
}
cpu: [x64]
os: [win32]
"@shikijs/core@1.5.2":
resolution:
{
integrity: sha512-wSAOgaz48GmhILFElMCeQypSZmj6Ru6DttOOtl3KNkdJ17ApQuGNCfzpk4cClasVrnIu45++2DBwG4LNMQAfaA==,
}
"@trysound/sax@0.2.0":
resolution:
{
integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==,
}
engines: { node: ">=10.13.0" }
"@types/acorn@4.0.6":
resolution:
{
integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==,
}
"@types/babel__core@7.20.5":
resolution:
{
integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==,
}
"@types/babel__generator@7.6.7":
resolution:
{
integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==,
}
"@types/babel__template@7.4.4":
resolution:
{
integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==,
}
"@types/babel__traverse@7.20.4":
resolution:
{
integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==,
}
"@types/cookie@0.6.0":
resolution:
{
integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==,
}
"@types/debug@4.1.12":
resolution:
{
integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==,
}
"@types/estree-jsx@1.0.3":
resolution:
{
integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==,
}
"@types/estree@1.0.5":
resolution:
{
integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==,
}
"@types/hast@3.0.3":
resolution:
{
integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==,
}
"@types/mdast@4.0.3":
resolution:
{
integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==,
}
"@types/mdx@2.0.10":
resolution:
{
integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==,
}
"@types/ms@0.7.34":
resolution:
{
integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==,
}
"@types/nlcst@1.0.4":
resolution:
{
integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==,
}
"@types/node@17.0.45":
resolution:
{
integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==,
}
"@types/sax@1.2.7":
resolution:
{
integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==,
}
"@types/unist@2.0.10":
resolution:
{
integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==,
}
"@types/unist@3.0.2":
resolution:
{
integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==,
}
"@ungap/structured-clone@1.2.0":
resolution:
{
integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==,
}
"@volar/kit@2.2.4":
resolution:
{
integrity: sha512-TyRYaj56NBwa+0DgYbIkNQm+pN5DaV1dvZ5PzoKGDk9oag/sCG+W6wVkyaqmYCNJkXpmRtM627RkeMRTBvnYzw==,
}
peerDependencies:
typescript: "*"
"@volar/language-core@2.2.4":
resolution:
{
integrity: sha512-7As47GndxGxsqqYnbreLrfB5NDUeQioPM2LJKUuB4/34c0NpEJ2byVl3c9KYdjIdiEstWZ9JLtLKNTaPWb5jtA==,
}
"@volar/language-server@2.2.4":
resolution:
{
integrity: sha512-wgRsKsqFMY7MRkmBfIX+GB0uzAv2Nks7YS3Ud6RWdHsjEu7tF+cXzBX/IRgW5HOayLLPC1xES2PYXk26hdOIoA==,
}
"@volar/language-service@2.2.4":
resolution:
{
integrity: sha512-3OxJFADEsAZp1RoTS3SX2GY9SeVnB9mbd3N/Faz45IvnT2EFAyVJGPOyrz5bJDvKuCtjdoTNNWS1GX1bHGytrA==,
}
"@volar/snapshot-document@2.2.4":
resolution:
{
integrity: sha512-XwL9Jo5+nn4WZystok1+kRXbmFuJXaCx0KfJYZizJQDd7kPDgBcyci/aKsBVNhIgiD9JT0KKycru0ndyHRadGQ==,
}
"@volar/source-map@2.2.4":
resolution:
{
integrity: sha512-m92FLpR9vB1YEZfiZ+bfgpLrToL/DNkOrorWVep3pffHrwwI4Tx2oIQN+sqHJfKkiT5N3J1owC+8crhAEinfjg==,
}
"@volar/typescript@2.2.4":
resolution:
{
integrity: sha512-uAQC53tgEbHO62G8NXMfmBrJAlP2QJ9WxVEEQqqK3I6VSy8frL5LbH3hAWODxiwMWixv74wJLWlKbWXOgdIoRQ==,
}
"@vscode/emmet-helper@2.9.2":
resolution:
{
integrity: sha512-MaGuyW+fa13q3aYsluKqclmh62Hgp0BpKIqS66fCxfOaBcVQ1OnMQxRRgQUYnCkxFISAQlkJ0qWWPyXjro1Qrg==,
}
"@vscode/l10n@0.0.16":
resolution:
{
integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==,
}
"@vscode/l10n@0.0.18":
resolution:
{
integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==,
}
acorn-jsx@5.3.2:
resolution:
{
integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==,
}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
acorn@8.11.2:
resolution:
{
integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==,
}
engines: { node: ">=0.4.0" }
hasBin: true
acorn@8.11.3:
resolution:
{
integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==,
}
engines: { node: ">=0.4.0" }
hasBin: true
ansi-align@3.0.1:
resolution:
{
integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==,
}
ansi-regex@5.0.1:
resolution:
{
integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==,
}
engines: { node: ">=8" }
ansi-regex@6.0.1:
resolution:
{
integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==,
}
engines: { node: ">=12" }
ansi-styles@3.2.1:
resolution:
{
integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==,
}
engines: { node: ">=4" }
ansi-styles@4.3.0:
resolution:
{
integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==,
}
engines: { node: ">=8" }
ansi-styles@6.2.1:
resolution:
{
integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==,
}
engines: { node: ">=12" }
any-promise@1.3.0:
resolution:
{
integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==,
}
anymatch@3.1.3:
resolution:
{
integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==,
}
engines: { node: ">= 8" }
arg@5.0.2:
resolution:
{
integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==,
}
argparse@1.0.10:
resolution:
{
integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==,
}
argparse@2.0.1:
resolution:
{
integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==,
}
aria-query@5.3.0:
resolution:
{
integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==,
}
array-iterate@2.0.1:
resolution:
{
integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==,
}
astring@1.8.6:
resolution:
{
integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==,
}
hasBin: true
astro-expressive-code@0.35.3:
resolution:
{
integrity: sha512-f1L1m3J3EzZHDEox6TXmuKo5fTSbaNxE/HU0S0UQmvlCowtOKnU/LOsoDwsbQSYGKz+fdLRPsCjFMiKqEoyfcw==,
}
peerDependencies:
astro: ^4.0.0-beta || ^3.3.0
astro@4.8.6:
resolution:
{
integrity: sha512-psHIfK+e+bMPhRwghV9yCGH/uc1jvY4DHmDZdoEepax9yA7kzYH0wt3dpkqlcrO2zxl5jzSC3DmqZfkD6wnW9A==,
}
engines:
{ node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0" }
hasBin: true
autoprefixer@10.4.19:
resolution:
{
integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==,
}
engines: { node: ^10 || ^12 || >=14 }
hasBin: true
peerDependencies:
postcss: ^8.1.0
axobject-query@4.0.0:
resolution:
{
integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==,
}
bail@2.0.2:
resolution:
{
integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==,
}
balanced-match@1.0.2:
resolution:
{
integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==,
}
base-64@1.0.0:
resolution:
{
integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==,
}
bcp-47-match@2.0.3:
resolution:
{
integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==,
}
bcp-47@2.1.0:
resolution:
{
integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==,
}
binary-extensions@2.2.0:
resolution:
{
integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==,
}
engines: { node: ">=8" }
boolbase@1.0.0:
resolution:
{
integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==,
}
boxen@7.1.1:
resolution:
{
integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==,
}
engines: { node: ">=14.16" }
brace-expansion@1.1.11:
resolution:
{
integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==,
}
braces@3.0.2:
resolution:
{
integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==,
}
engines: { node: ">=8" }
browserslist@4.23.0:
resolution:
{
integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==,
}
engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 }
hasBin: true
camelcase-css@2.0.1:
resolution:
{
integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==,
}
engines: { node: ">= 6" }
camelcase@7.0.1:
resolution:
{
integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==,
}
engines: { node: ">=14.16" }
caniuse-api@3.0.0:
resolution:
{
integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==,
}
caniuse-lite@1.0.30001620:
resolution:
{
integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==,
}
ccount@2.0.1:
resolution:
{
integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==,
}
chalk@2.4.2:
resolution:
{
integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==,
}
engines: { node: ">=4" }
chalk@5.3.0:
resolution:
{
integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==,
}
engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 }
character-entities-html4@2.1.0:
resolution:
{
integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==,
}
character-entities-legacy@3.0.0:
resolution:
{
integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==,
}
character-entities@2.0.2:
resolution:
{
integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==,
}
character-reference-invalid@2.0.1:
resolution:
{
integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==,
}
chokidar@3.5.3:
resolution:
{
integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==,
}
engines: { node: ">= 8.10.0" }
chokidar@3.6.0:
resolution:
{
integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==,
}
engines: { node: ">= 8.10.0" }
ci-info@4.0.0:
resolution:
{
integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==,
}
engines: { node: ">=8" }
cli-boxes@3.0.0:
resolution:
{
integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==,
}
engines: { node: ">=10" }
cli-cursor@4.0.0:
resolution:
{
integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==,
}
engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 }
cli-spinners@2.9.2:
resolution:
{
integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==,
}
engines: { node: ">=6" }
cliui@8.0.1:
resolution:
{
integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==,
}
engines: { node: ">=12" }
clsx@2.1.1:
resolution:
{
integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==,
}
engines: { node: ">=6" }
collapse-white-space@2.1.0:
resolution:
{
integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==,
}
color-convert@1.9.3:
resolution:
{
integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==,
}
color-convert@2.0.1:
resolution:
{
integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==,
}
engines: { node: ">=7.0.0" }
color-name@1.1.3:
resolution:
{
integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==,
}
color-name@1.1.4:
resolution:
{
integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==,
}
color-string@1.9.1:
resolution:
{
integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==,
}
color@4.2.3:
resolution:
{
integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==,
}
engines: { node: ">=12.5.0" }
colord@2.9.3:
resolution:
{
integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==,
}
comma-separated-tokens@2.0.3:
resolution:
{
integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==,
}
commander@4.1.1:
resolution:
{
integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==,
}
engines: { node: ">= 6" }
commander@7.2.0:
resolution:
{
integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==,
}
engines: { node: ">= 10" }
common-ancestor-path@1.0.1:
resolution:
{
integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==,
}
concat-map@0.0.1:
resolution:
{
integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==,
}
convert-source-map@2.0.0:
resolution:
{
integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==,
}
cookie@0.6.0:
resolution:
{
integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==,
}
engines: { node: ">= 0.6" }
cross-spawn@7.0.3:
resolution:
{
integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==,
}
engines: { node: ">= 8" }
css-blank-pseudo@6.0.2:
resolution:
{
integrity: sha512-J/6m+lsqpKPqWHOifAFtKFeGLOzw3jR92rxQcwRUfA/eTuZzKfKlxOmYDx2+tqOPQAueNvBiY8WhAeHu5qNmTg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
css-declaration-sorter@7.2.0:
resolution:
{
integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.0.9
css-has-pseudo@6.0.5:
resolution:
{
integrity: sha512-ZTv6RlvJJZKp32jPYnAJVhowDCrRrHUTAxsYSuUPBEDJjzws6neMnzkRblxtgmv1RgcV5dhH2gn7E3wA9Wt6lw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
css-prefers-color-scheme@9.0.1:
resolution:
{
integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
css-select@5.1.0:
resolution:
{
integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==,
}
css-selector-parser@3.0.4:
resolution:
{
integrity: sha512-pnmS1dbKsz6KA4EW4BznyPL2xxkNDRg62hcD0v8g6DEw2W7hxOln5M953jsp9hmw5Dg57S6o/A8GOn37mbAgcQ==,
}
css-tree@2.2.1:
resolution:
{
integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==,
}
engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" }
css-tree@2.3.1:
resolution:
{
integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==,
}
engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 }
css-what@6.1.0:
resolution:
{
integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==,
}
engines: { node: ">= 6" }
cssdb@8.0.1:
resolution:
{
integrity: sha512-diegY/vnOYmPXY0bOBj5jeHaiK8MMpjgPuipirY8pF9AthtqEXgqVdKF5tnb6RTc/ZdhQqG0TBnInQ5CbbUW7Q==,
}
cssesc@3.0.0:
resolution:
{
integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==,
}
engines: { node: ">=4" }
hasBin: true
cssnano-preset-default@7.0.1:
resolution:
{
integrity: sha512-Fumyr+uZMcjYQeuHssAZxn0cKj3cdQc5GcxkBcmEzISGB+UW9CLNlU4tBOJbJGcPukFDlicG32eFbrc8K9V5pw==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
cssnano-utils@5.0.0:
resolution:
{
integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
cssnano@7.0.1:
resolution:
{
integrity: sha512-917Mej/4SdI7b55atsli3sU4MOJ9XDoKgnlCtQtXYj8XUFcM3riTuYHyqBBnnskawW+zWwp0KxJzpEUodlpqUg==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
csso@5.0.5:
resolution:
{
integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==,
}
engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" }
debug@4.3.4:
resolution:
{
integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==,
}
engines: { node: ">=6.0" }
peerDependencies:
supports-color: "*"
peerDependenciesMeta:
supports-color:
optional: true
decode-named-character-reference@1.0.2:
resolution:
{
integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==,
}
dequal@2.0.3:
resolution:
{
integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==,
}
engines: { node: ">=6" }
detect-libc@2.0.3:
resolution:
{
integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==,
}
engines: { node: ">=8" }
deterministic-object-hash@2.0.2:
resolution:
{
integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==,
}
engines: { node: ">=18" }
devalue@5.0.0:
resolution:
{
integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==,
}
devlop@1.1.0:
resolution:
{
integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==,
}
didyoumean@1.2.2:
resolution:
{
integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==,
}
diff@5.2.0:
resolution:
{
integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==,
}
engines: { node: ">=0.3.1" }
direction@2.0.1:
resolution:
{
integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==,
}
hasBin: true
dlv@1.1.3:
resolution:
{
integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==,
}
dom-serializer@2.0.0:
resolution:
{
integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==,
}
domelementtype@2.3.0:
resolution:
{
integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==,
}
domhandler@5.0.3:
resolution:
{
integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==,
}
engines: { node: ">= 4" }
domutils@3.1.0:
resolution:
{
integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==,
}
dset@3.1.3:
resolution:
{
integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==,
}
engines: { node: ">=4" }
eastasianwidth@0.2.0:
resolution:
{
integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==,
}
electron-to-chromium@1.4.773:
resolution:
{
integrity: sha512-87eHF+h3PlCRwbxVEAw9KtK3v7lWfc/sUDr0W76955AdYTG4bV/k0zrl585Qnj/skRMH2qOSiE+kqMeOQ+LOpw==,
}
emmet@2.4.6:
resolution:
{
integrity: sha512-dJfbdY/hfeTyf/Ef7Y7ubLYzkBvPQ912wPaeVYpAxvFxkEBf/+hJu4H6vhAvFN6HlxqedlfVn2x1S44FfQ97pg==,
}
emoji-regex@10.3.0:
resolution:
{
integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==,
}
emoji-regex@8.0.0:
resolution:
{
integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==,
}
emoji-regex@9.2.2:
resolution:
{
integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==,
}
entities@4.5.0:
resolution:
{
integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==,
}
engines: { node: ">=0.12" }
es-module-lexer@1.4.1:
resolution:
{
integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==,
}
es-module-lexer@1.5.2:
resolution:
{
integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==,
}
esbuild@0.20.2:
resolution:
{
integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==,
}
engines: { node: ">=12" }
hasBin: true
esbuild@0.21.3:
resolution:
{
integrity: sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==,
}
engines: { node: ">=12" }
hasBin: true
escalade@3.1.1:
resolution:
{
integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==,
}
engines: { node: ">=6" }
escape-string-regexp@1.0.5:
resolution:
{
integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==,
}
engines: { node: ">=0.8.0" }
escape-string-regexp@5.0.0:
resolution:
{
integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==,
}
engines: { node: ">=12" }
esprima@4.0.1:
resolution:
{
integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==,
}
engines: { node: ">=4" }
hasBin: true
estree-util-attach-comments@3.0.0:
resolution:
{
integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==,
}
estree-util-build-jsx@3.0.1:
resolution:
{
integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==,
}
estree-util-is-identifier-name@3.0.0:
resolution:
{
integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==,
}
estree-util-to-js@2.0.0:
resolution:
{
integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==,
}
estree-util-visit@2.0.0:
resolution:
{
integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==,
}
estree-walker@3.0.3:
resolution:
{
integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==,
}
eventemitter3@5.0.1:
resolution:
{
integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==,
}
execa@8.0.1:
resolution:
{
integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==,
}
engines: { node: ">=16.17" }
expressive-code@0.35.3:
resolution:
{
integrity: sha512-XjWWUCxS4uQjPoRM98R7SNWWIYlFEaOeHm1piWv+c7coHCekuWno81thsc3g/UJ+DajNtOEsIQIAAcsBQZ8LMg==,
}
extend-shallow@2.0.1:
resolution:
{
integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==,
}
engines: { node: ">=0.10.0" }
extend@3.0.2:
resolution:
{
integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==,
}
fast-glob@3.3.2:
resolution:
{
integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==,
}
engines: { node: ">=8.6.0" }
fastq@1.15.0:
resolution:
{
integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==,
}
fill-range@7.0.1:
resolution:
{
integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==,
}
engines: { node: ">=8" }
find-up@4.1.0:
resolution:
{
integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==,
}
engines: { node: ">=8" }
find-up@5.0.0:
resolution:
{
integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==,
}
engines: { node: ">=10" }
find-yarn-workspace-root2@1.2.16:
resolution:
{
integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==,
}
flattie@1.1.1:
resolution:
{
integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==,
}
engines: { node: ">=8" }
fraction.js@4.3.7:
resolution:
{
integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==,
}
fs.realpath@1.0.0:
resolution:
{
integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==,
}
fsevents@2.3.3:
resolution:
{
integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==,
}
engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 }
os: [darwin]
function-bind@1.1.2:
resolution:
{
integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==,
}
gensync@1.0.0-beta.2:
resolution:
{
integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==,
}
engines: { node: ">=6.9.0" }
get-caller-file@2.0.5:
resolution:
{
integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==,
}
engines: { node: 6.* || 8.* || >= 10.* }
get-east-asian-width@1.2.0:
resolution:
{
integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==,
}
engines: { node: ">=18" }
get-stream@8.0.1:
resolution:
{
integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==,
}
engines: { node: ">=16" }
github-slugger@2.0.0:
resolution:
{
integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==,
}
glob-parent@5.1.2:
resolution:
{
integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==,
}
engines: { node: ">= 6" }
glob-parent@6.0.2:
resolution:
{
integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==,
}
engines: { node: ">=10.13.0" }
glob@7.1.6:
resolution:
{
integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==,
}
globals@11.12.0:
resolution:
{
integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==,
}
engines: { node: ">=4" }
graceful-fs@4.2.11:
resolution:
{
integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==,
}
gray-matter@4.0.3:
resolution:
{
integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==,
}
engines: { node: ">=6.0" }
has-flag@3.0.0:
resolution:
{
integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==,
}
engines: { node: ">=4" }
hasown@2.0.0:
resolution:
{
integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==,
}
engines: { node: ">= 0.4" }
hast-util-embedded@3.0.0:
resolution:
{
integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==,
}
hast-util-from-html@2.0.1:
resolution:
{
integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==,
}
hast-util-from-parse5@8.0.1:
resolution:
{
integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==,
}
hast-util-has-property@3.0.0:
resolution:
{
integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==,
}
hast-util-is-body-ok-link@3.0.0:
resolution:
{
integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==,
}
hast-util-is-element@3.0.0:
resolution:
{
integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==,
}
hast-util-parse-selector@4.0.0:
resolution:
{
integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==,
}
hast-util-phrasing@3.0.1:
resolution:
{
integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==,
}
hast-util-raw@9.0.1:
resolution:
{
integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==,
}
hast-util-select@6.0.2:
resolution:
{
integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==,
}
hast-util-to-estree@3.1.0:
resolution:
{
integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==,
}
hast-util-to-html@9.0.0:
resolution:
{
integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==,
}
hast-util-to-html@9.0.1:
resolution:
{
integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==,
}
hast-util-to-jsx-runtime@2.3.0:
resolution:
{
integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==,
}
hast-util-to-parse5@8.0.0:
resolution:
{
integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==,
}
hast-util-to-string@3.0.0:
resolution:
{
integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==,
}
hast-util-to-text@4.0.2:
resolution:
{
integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==,
}
hast-util-whitespace@3.0.0:
resolution:
{
integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==,
}
hastscript@8.0.0:
resolution:
{
integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==,
}
hastscript@9.0.0:
resolution:
{
integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==,
}
html-escaper@3.0.3:
resolution:
{
integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==,
}
html-void-elements@3.0.0:
resolution:
{
integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==,
}
html-whitespace-sensitive-tag-names@3.0.0:
resolution:
{
integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==,
}
http-cache-semantics@4.1.1:
resolution:
{
integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==,
}
human-signals@5.0.0:
resolution:
{
integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==,
}
engines: { node: ">=16.17.0" }
import-meta-resolve@4.0.0:
resolution:
{
integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==,
}
inflight@1.0.6:
resolution:
{
integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==,
}
inherits@2.0.4:
resolution:
{
integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==,
}
inline-style-parser@0.1.1:
resolution:
{
integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==,
}
inline-style-parser@0.2.2:
resolution:
{
integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==,
}
is-alphabetical@2.0.1:
resolution:
{
integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==,
}
is-alphanumerical@2.0.1:
resolution:
{
integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==,
}
is-arrayish@0.3.2:
resolution:
{
integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==,
}
is-binary-path@2.1.0:
resolution:
{
integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==,
}
engines: { node: ">=8" }
is-buffer@2.0.5:
resolution:
{
integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==,
}
engines: { node: ">=4" }
is-core-module@2.13.1:
resolution:
{
integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==,
}
is-decimal@2.0.1:
resolution:
{
integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==,
}
is-docker@3.0.0:
resolution:
{
integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==,
}
engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 }
hasBin: true
is-extendable@0.1.1:
resolution:
{
integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==,
}
engines: { node: ">=0.10.0" }
is-extglob@2.1.1:
resolution:
{
integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==,
}
engines: { node: ">=0.10.0" }
is-fullwidth-code-point@3.0.0:
resolution:
{
integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==,
}
engines: { node: ">=8" }
is-glob@4.0.3:
resolution:
{
integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==,
}
engines: { node: ">=0.10.0" }
is-hexadecimal@2.0.1:
resolution:
{
integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==,
}
is-inside-container@1.0.0:
resolution:
{
integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==,
}
engines: { node: ">=14.16" }
hasBin: true
is-interactive@2.0.0:
resolution:
{
integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==,
}
engines: { node: ">=12" }
is-number@7.0.0:
resolution:
{
integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==,
}
engines: { node: ">=0.12.0" }
is-plain-obj@4.1.0:
resolution:
{
integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==,
}
engines: { node: ">=12" }
is-reference@3.0.2:
resolution:
{
integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==,
}
is-stream@3.0.0:
resolution:
{
integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==,
}
engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 }
is-unicode-supported@1.3.0:
resolution:
{
integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==,
}
engines: { node: ">=12" }
is-unicode-supported@2.0.0:
resolution:
{
integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==,
}
engines: { node: ">=18" }
is-wsl@3.1.0:
resolution:
{
integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==,
}
engines: { node: ">=16" }
isexe@2.0.0:
resolution:
{
integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==,
}
jiti@1.21.0:
resolution:
{
integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==,
}
hasBin: true
js-tokens@4.0.0:
resolution:
{
integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==,
}
js-yaml@3.14.1:
resolution:
{
integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==,
}
hasBin: true
js-yaml@4.1.0:
resolution:
{
integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==,
}
hasBin: true
jsesc@2.5.2:
resolution:
{
integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==,
}
engines: { node: ">=4" }
hasBin: true
json5@2.2.3:
resolution:
{
integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==,
}
engines: { node: ">=6" }
hasBin: true
jsonc-parser@2.3.1:
resolution:
{
integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==,
}
kind-of@6.0.3:
resolution:
{
integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==,
}
engines: { node: ">=0.10.0" }
kleur@3.0.3:
resolution:
{
integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==,
}
engines: { node: ">=6" }
kleur@4.1.5:
resolution:
{
integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==,
}
engines: { node: ">=6" }
lilconfig@2.1.0:
resolution:
{
integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==,
}
engines: { node: ">=10" }
lilconfig@3.0.0:
resolution:
{
integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==,
}
engines: { node: ">=14" }
lilconfig@3.1.1:
resolution:
{
integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==,
}
engines: { node: ">=14" }
lines-and-columns@1.2.4:
resolution:
{
integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==,
}
load-yaml-file@0.2.0:
resolution:
{
integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==,
}
engines: { node: ">=6" }
locate-path@5.0.0:
resolution:
{
integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==,
}
engines: { node: ">=8" }
locate-path@6.0.0:
resolution:
{
integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==,
}
engines: { node: ">=10" }
lodash.memoize@4.1.2:
resolution:
{
integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==,
}
lodash.uniq@4.5.0:
resolution:
{
integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==,
}
log-symbols@6.0.0:
resolution:
{
integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==,
}
engines: { node: ">=18" }
longest-streak@3.1.0:
resolution:
{
integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==,
}
lru-cache@5.1.1:
resolution:
{
integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==,
}
lru-cache@6.0.0:
resolution:
{
integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==,
}
engines: { node: ">=10" }
magic-string@0.30.10:
resolution:
{
integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==,
}
markdown-extensions@2.0.0:
resolution:
{
integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==,
}
engines: { node: ">=16" }
markdown-table@3.0.3:
resolution:
{
integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==,
}
mdast-util-definitions@6.0.0:
resolution:
{
integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==,
}
mdast-util-directive@3.0.0:
resolution:
{
integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==,
}
mdast-util-find-and-replace@3.0.1:
resolution:
{
integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==,
}
mdast-util-from-markdown@2.0.0:
resolution:
{
integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==,
}
mdast-util-gfm-autolink-literal@2.0.0:
resolution:
{
integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==,
}
mdast-util-gfm-footnote@2.0.0:
resolution:
{
integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==,
}
mdast-util-gfm-strikethrough@2.0.0:
resolution:
{
integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==,
}
mdast-util-gfm-table@2.0.0:
resolution:
{
integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==,
}
mdast-util-gfm-task-list-item@2.0.0:
resolution:
{
integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==,
}
mdast-util-gfm@3.0.0:
resolution:
{
integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==,
}
mdast-util-mdx-expression@2.0.0:
resolution:
{
integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==,
}
mdast-util-mdx-jsx@3.0.0:
resolution:
{
integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==,
}
mdast-util-mdx@3.0.0:
resolution:
{
integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==,
}
mdast-util-mdxjs-esm@2.0.1:
resolution:
{
integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==,
}
mdast-util-phrasing@4.0.0:
resolution:
{
integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==,
}
mdast-util-to-hast@13.0.2:
resolution:
{
integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==,
}
mdast-util-to-markdown@2.1.0:
resolution:
{
integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==,
}
mdast-util-to-string@4.0.0:
resolution:
{
integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==,
}
mdn-data@2.0.28:
resolution:
{
integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==,
}
mdn-data@2.0.30:
resolution:
{
integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==,
}
merge-stream@2.0.0:
resolution:
{
integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==,
}
merge2@1.4.1:
resolution:
{
integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==,
}
engines: { node: ">= 8" }
micromark-core-commonmark@2.0.0:
resolution:
{
integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==,
}
micromark-extension-directive@3.0.0:
resolution:
{
integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==,
}
micromark-extension-gfm-autolink-literal@2.0.0:
resolution:
{
integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==,
}
micromark-extension-gfm-footnote@2.0.0:
resolution:
{
integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==,
}
micromark-extension-gfm-strikethrough@2.0.0:
resolution:
{
integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==,
}
micromark-extension-gfm-table@2.0.0:
resolution:
{
integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==,
}
micromark-extension-gfm-tagfilter@2.0.0:
resolution:
{
integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==,
}
micromark-extension-gfm-task-list-item@2.0.1:
resolution:
{
integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==,
}
micromark-extension-gfm@3.0.0:
resolution:
{
integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==,
}
micromark-extension-mdx-expression@3.0.0:
resolution:
{
integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==,
}
micromark-extension-mdx-jsx@3.0.0:
resolution:
{
integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==,
}
micromark-extension-mdx-md@2.0.0:
resolution:
{
integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==,
}
micromark-extension-mdxjs-esm@3.0.0:
resolution:
{
integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==,
}
micromark-extension-mdxjs@3.0.0:
resolution:
{
integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==,
}
micromark-factory-destination@2.0.0:
resolution:
{
integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==,
}
micromark-factory-label@2.0.0:
resolution:
{
integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==,
}
micromark-factory-mdx-expression@2.0.1:
resolution:
{
integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==,
}
micromark-factory-space@2.0.0:
resolution:
{
integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==,
}
micromark-factory-title@2.0.0:
resolution:
{
integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==,
}
micromark-factory-whitespace@2.0.0:
resolution:
{
integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==,
}
micromark-util-character@2.0.1:
resolution:
{
integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==,
}
micromark-util-chunked@2.0.0:
resolution:
{
integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==,
}
micromark-util-classify-character@2.0.0:
resolution:
{
integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==,
}
micromark-util-combine-extensions@2.0.0:
resolution:
{
integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==,
}
micromark-util-decode-numeric-character-reference@2.0.1:
resolution:
{
integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==,
}
micromark-util-decode-string@2.0.0:
resolution:
{
integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==,
}
micromark-util-encode@2.0.0:
resolution:
{
integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==,
}
micromark-util-events-to-acorn@2.0.2:
resolution:
{
integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==,
}
micromark-util-html-tag-name@2.0.0:
resolution:
{
integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==,
}
micromark-util-normalize-identifier@2.0.0:
resolution:
{
integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==,
}
micromark-util-resolve-all@2.0.0:
resolution:
{
integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==,
}
micromark-util-sanitize-uri@2.0.0:
resolution:
{
integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==,
}
micromark-util-subtokenize@2.0.0:
resolution:
{
integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==,
}
micromark-util-symbol@2.0.0:
resolution:
{
integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==,
}
micromark-util-types@2.0.0:
resolution:
{
integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==,
}
micromark@4.0.0:
resolution:
{
integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==,
}
micromatch@4.0.5:
resolution:
{
integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==,
}
engines: { node: ">=8.6" }
mimic-fn@2.1.0:
resolution:
{
integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==,
}
engines: { node: ">=6" }
mimic-fn@4.0.0:
resolution:
{
integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==,
}
engines: { node: ">=12" }
minimatch@3.1.2:
resolution:
{
integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==,
}
mrmime@2.0.0:
resolution:
{
integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==,
}
engines: { node: ">=10" }
ms@2.1.2:
resolution:
{
integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==,
}
muggle-string@0.4.1:
resolution:
{
integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==,
}
mz@2.7.0:
resolution:
{
integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==,
}
nanoid@3.3.7:
resolution:
{
integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==,
}
engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 }
hasBin: true
nlcst-to-string@3.1.1:
resolution:
{
integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==,
}
node-releases@2.0.14:
resolution:
{
integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==,
}
normalize-path@3.0.0:
resolution:
{
integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==,
}
engines: { node: ">=0.10.0" }
normalize-range@0.1.2:
resolution:
{
integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==,
}
engines: { node: ">=0.10.0" }
not@0.1.0:
resolution:
{
integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==,
}
npm-run-path@5.1.0:
resolution:
{
integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==,
}
engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 }
nth-check@2.1.1:
resolution:
{
integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==,
}
object-assign@4.1.1:
resolution:
{
integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==,
}
engines: { node: ">=0.10.0" }
object-hash@3.0.0:
resolution:
{
integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==,
}
engines: { node: ">= 6" }
once@1.4.0:
resolution:
{
integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==,
}
onetime@5.1.2:
resolution:
{
integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==,
}
engines: { node: ">=6" }
onetime@6.0.0:
resolution:
{
integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==,
}
engines: { node: ">=12" }
ora@8.0.1:
resolution:
{
integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==,
}
engines: { node: ">=18" }
p-limit@2.3.0:
resolution:
{
integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==,
}
engines: { node: ">=6" }
p-limit@3.1.0:
resolution:
{
integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==,
}
engines: { node: ">=10" }
p-limit@5.0.0:
resolution:
{
integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==,
}
engines: { node: ">=18" }
p-locate@4.1.0:
resolution:
{
integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==,
}
engines: { node: ">=8" }
p-locate@5.0.0:
resolution:
{
integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==,
}
engines: { node: ">=10" }
p-queue@8.0.1:
resolution:
{
integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==,
}
engines: { node: ">=18" }
p-timeout@6.1.2:
resolution:
{
integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==,
}
engines: { node: ">=14.16" }
p-try@2.2.0:
resolution:
{
integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==,
}
engines: { node: ">=6" }
pagefind@1.0.4:
resolution:
{
integrity: sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==,
}
hasBin: true
parse-entities@4.0.1:
resolution:
{
integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==,
}
parse-latin@5.0.1:
resolution:
{
integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==,
}
parse5@7.1.2:
resolution:
{
integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==,
}
path-browserify@1.0.1:
resolution:
{
integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==,
}
path-exists@4.0.0:
resolution:
{
integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==,
}
engines: { node: ">=8" }
path-is-absolute@1.0.1:
resolution:
{
integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==,
}
engines: { node: ">=0.10.0" }
path-key@3.1.1:
resolution:
{
integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==,
}
engines: { node: ">=8" }
path-key@4.0.0:
resolution:
{
integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==,
}
engines: { node: ">=12" }
path-parse@1.0.7:
resolution:
{
integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==,
}
path-to-regexp@6.2.2:
resolution:
{
integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==,
}
periscopic@3.1.0:
resolution:
{
integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==,
}
picocolors@1.0.0:
resolution:
{
integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==,
}
picomatch@2.3.1:
resolution:
{
integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==,
}
engines: { node: ">=8.6" }
pify@2.3.0:
resolution:
{
integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==,
}
engines: { node: ">=0.10.0" }
pify@4.0.1:
resolution:
{
integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==,
}
engines: { node: ">=6" }
pirates@4.0.6:
resolution:
{
integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==,
}
engines: { node: ">= 6" }
pkg-dir@4.2.0:
resolution:
{
integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==,
}
engines: { node: ">=8" }
postcss-attribute-case-insensitive@6.0.3:
resolution:
{
integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-calc@10.0.0:
resolution:
{
integrity: sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==,
}
engines: { node: ^18.12 || ^20.9 || >=22.0 }
peerDependencies:
postcss: ^8.4.38
postcss-clamp@4.1.0:
resolution:
{
integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==,
}
engines: { node: ">=7.6.0" }
peerDependencies:
postcss: ^8.4.6
postcss-color-functional-notation@6.0.11:
resolution:
{
integrity: sha512-gJ+hAtAsgBF4w7eh28Pg7EA60lx7vE5xO/B/yZawaI6FYHky+5avA9YSe73nJHnAMEVFpCMeJc6Wts5g+niksg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-color-hex-alpha@9.0.4:
resolution:
{
integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-color-rebeccapurple@9.0.3:
resolution:
{
integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-colormin@7.0.0:
resolution:
{
integrity: sha512-5CN6fqtsEtEtwf3mFV3B4UaZnlYljPpzmGeDB4yCK067PnAtfLe9uX2aFZaEwxHE7HopG5rUkW8gyHrNAesHEg==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-convert-values@7.0.0:
resolution:
{
integrity: sha512-bMuzDgXBbFbByPgj+/r6va8zNuIDUaIIbvAFgdO1t3zdgJZ77BZvu6dfWyd6gHEJnYzmeVr9ayUsAQL3/qLJ0w==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-custom-media@10.0.6:
resolution:
{
integrity: sha512-BjihQoIO4Wjqv9fQNExSJIim8UAmkhLxuJnhJsLTRFSba1y1MhxkJK5awsM//6JJ+/Tu5QUxf624RQAvKHv6SA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-custom-properties@13.3.10:
resolution:
{
integrity: sha512-ejaalIpl7p0k0L5ngIZ86AZGmp3m1KdeOCbSQTK4gQcB1ncaoPTHorw206+tsZRIhIDYvh5ZButEje6740YDXw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-custom-selectors@7.1.10:
resolution:
{
integrity: sha512-bV/6+IExyT2J4kMzX6c+ZMlN1xDfjcC4ePr1ywKezcTgwgUn11qQN3jdzFBpo8Dk1K7vO/OYOwMb5AtJP4JZcg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-dir-pseudo-class@8.0.1:
resolution:
{
integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-discard-comments@7.0.0:
resolution:
{
integrity: sha512-xpSdzRqYmy4YIVmjfGyYXKaI1SRnK6CTr+4Zmvyof8ANwvgfZgGdVtmgAvzh59gJm808mJCWQC9tFN0KF5dEXA==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-discard-duplicates@7.0.0:
resolution:
{
integrity: sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-discard-empty@7.0.0:
resolution:
{
integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-discard-overridden@7.0.0:
resolution:
{
integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-double-position-gradients@5.0.6:
resolution:
{
integrity: sha512-QJ+089FKMaqDxOhhIHsJrh4IP7h4PIHNC5jZP5PMmnfUScNu8Hji2lskqpFWCvu+5sj+2EJFyzKd13sLEWOZmQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-focus-visible@9.0.1:
resolution:
{
integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-focus-within@8.0.1:
resolution:
{
integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-font-variant@5.0.0:
resolution:
{
integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==,
}
peerDependencies:
postcss: ^8.1.0
postcss-gap-properties@5.0.1:
resolution:
{
integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-image-set-function@6.0.3:
resolution:
{
integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-import@15.1.0:
resolution:
{
integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==,
}
engines: { node: ">=14.0.0" }
peerDependencies:
postcss: ^8.0.0
postcss-js@4.0.1:
resolution:
{
integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==,
}
engines: { node: ^12 || ^14 || >= 16 }
peerDependencies:
postcss: ^8.4.21
postcss-lab-function@6.0.16:
resolution:
{
integrity: sha512-QWv0VxfjgIl8jBR/wuQcm/o31jn4P/LwzYuVKzNQoO5t7HPcU0d3RfWUiDrHN3frmSv+YYZppr3P81tKFTDyqg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-load-config@4.0.2:
resolution:
{
integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==,
}
engines: { node: ">= 14" }
peerDependencies:
postcss: ">=8.0.9"
ts-node: ">=9.0.0"
peerDependenciesMeta:
postcss:
optional: true
ts-node:
optional: true
postcss-logical@7.0.1:
resolution:
{
integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-merge-longhand@7.0.0:
resolution:
{
integrity: sha512-0X8I4/9+G03X5/5NnrfopG/YEln2XU8heDh7YqBaiq2SeaKIG3n66ShZPjIolmVuLBQ0BEm3yS8o1mlCLHdW7A==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-merge-rules@7.0.0:
resolution:
{
integrity: sha512-Zty3VlOsD6VSjBMu6PiHCVpLegtBT/qtZRVBcSeyEZ6q1iU5qTYT0WtEoLRV+YubZZguS5/ycfP+NRiKfjv6aw==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-minify-font-values@7.0.0:
resolution:
{
integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-minify-gradients@7.0.0:
resolution:
{
integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-minify-params@7.0.0:
resolution:
{
integrity: sha512-XOJAuX8Q/9GT1sGxlUvaFEe2H9n50bniLZblXXsAT/BwSfFYvzSZeFG7uupwc0KbKpTnflnQ7aMwGzX6JUWliQ==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-minify-selectors@7.0.0:
resolution:
{
integrity: sha512-f00CExZhD6lNw2vTZbcnmfxVgaVKzUw6IRsIFX3JTT8GdsoABc1WnhhGwL1i8YPJ3sSWw39fv7XPtvLb+3Uitw==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-nested@6.0.1:
resolution:
{
integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==,
}
engines: { node: ">=12.0" }
peerDependencies:
postcss: ^8.2.14
postcss-nesting@12.1.4:
resolution:
{
integrity: sha512-CcHOq94K137E+U4Ommu7pexcpp0Tjm24zl4UcqWs1oSLAr5cLI+jLrqQ5h/bdjhMX6cMbzunyustVNnvrzF8Zg==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-normalize-charset@7.0.0:
resolution:
{
integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-normalize-display-values@7.0.0:
resolution:
{
integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-normalize-positions@7.0.0:
resolution:
{
integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-normalize-repeat-style@7.0.0:
resolution:
{
integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-normalize-string@7.0.0:
resolution:
{
integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-normalize-timing-functions@7.0.0:
resolution:
{
integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-normalize-unicode@7.0.0:
resolution:
{
integrity: sha512-OnKV52/VFFDAim4n0pdI+JAhsolLBdnCKxE6VV5lW5Q/JeVGFN8UM8ur6/A3EAMLsT1ZRm3fDHh/rBoBQpqi2w==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-normalize-url@7.0.0:
resolution:
{
integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-normalize-whitespace@7.0.0:
resolution:
{
integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-opacity-percentage@2.0.0:
resolution:
{
integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.2
postcss-ordered-values@7.0.0:
resolution:
{
integrity: sha512-KROvC63A8UQW1eYDljQe1dtwc1E/M+mMwDT6z7khV/weHYLWTghaLRLunU7x1xw85lWFwVZOAGakxekYvKV+0w==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-overflow-shorthand@5.0.1:
resolution:
{
integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-page-break@3.0.4:
resolution:
{
integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==,
}
peerDependencies:
postcss: ^8
postcss-place@9.0.1:
resolution:
{
integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-preset-env@9.5.13:
resolution:
{
integrity: sha512-YQMwWu6MAc4Envrjf/mW2BTrb5J8WkrJ4dV2VostZVDhrmEPpYREOyhmvtlFLDxK1/AmTDY8aXjZViMC1qKu/w==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-pseudo-class-any-link@9.0.2:
resolution:
{
integrity: sha512-HFSsxIqQ9nA27ahyfH37cRWGk3SYyQLpk0LiWw/UGMV4VKT5YG2ONee4Pz/oFesnK0dn2AjcyequDbIjKJgB0g==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-reduce-initial@7.0.0:
resolution:
{
integrity: sha512-iqGgmBxY9LrblZ0BKLjmrA1mC/cf9A/wYCCqSmD6tMi+xAyVl0+DfixZIHSVDMbCPRPjNmVF0DFGth/IDGelFQ==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-reduce-transforms@7.0.0:
resolution:
{
integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-replace-overflow-wrap@4.0.0:
resolution:
{
integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==,
}
peerDependencies:
postcss: ^8.0.3
postcss-selector-not@7.0.2:
resolution:
{
integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==,
}
engines: { node: ^14 || ^16 || >=18 }
peerDependencies:
postcss: ^8.4
postcss-selector-parser@6.0.13:
resolution:
{
integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==,
}
engines: { node: ">=4" }
postcss-selector-parser@6.0.16:
resolution:
{
integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==,
}
engines: { node: ">=4" }
postcss-svgo@7.0.0:
resolution:
{
integrity: sha512-Xj5DRdvA97yRy3wjbCH2NKXtDUwEnph6EHr5ZXszsBVKCNrKXYBjzAXqav7/Afz5WwJ/1peZoTguCEJIg7ytmA==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >= 18 }
peerDependencies:
postcss: ^8.4.31
postcss-unique-selectors@7.0.0:
resolution:
{
integrity: sha512-NYFqcft7vVQMZlQPsMdMPy+qU/zDpy95Malpw4GeA9ZZjM6dVXDshXtDmLc0m4WCD6XeZCJqjTfPT1USsdt+rA==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
postcss-value-parser@4.2.0:
resolution:
{
integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==,
}
postcss@8.4.31:
resolution:
{
integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==,
}
engines: { node: ^10 || ^12 || >=14 }
postcss@8.4.33:
resolution:
{
integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==,
}
engines: { node: ^10 || ^12 || >=14 }
postcss@8.4.38:
resolution:
{
integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==,
}
engines: { node: ^10 || ^12 || >=14 }
preferred-pm@3.1.3:
resolution:
{
integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==,
}
engines: { node: ">=10" }
prismjs@1.29.0:
resolution:
{
integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==,
}
engines: { node: ">=6" }
prompts@2.4.2:
resolution:
{
integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==,
}
engines: { node: ">= 6" }
property-information@6.4.0:
resolution:
{
integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==,
}
queue-microtask@1.2.3:
resolution:
{
integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==,
}
read-cache@1.0.0:
resolution:
{
integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==,
}
readdirp@3.6.0:
resolution:
{
integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==,
}
engines: { node: ">=8.10.0" }
rehype-expressive-code@0.35.3:
resolution:
{
integrity: sha512-kj43Rg+WzYUs8RRr6XyBr60pnrIZEgbmn9yJoV6qka1UDpcx7r8icn6Q2uSAgaLtlEUy+HCPgQJraOZrA53LOQ==,
}
rehype-format@5.0.0:
resolution:
{
integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==,
}
rehype-minify-whitespace@6.0.0:
resolution:
{
integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==,
}
rehype-parse@9.0.0:
resolution:
{
integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==,
}
rehype-raw@7.0.0:
resolution:
{
integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==,
}
rehype-stringify@10.0.0:
resolution:
{
integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==,
}
rehype@13.0.1:
resolution:
{
integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==,
}
remark-directive@3.0.0:
resolution:
{
integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==,
}
remark-gfm@4.0.0:
resolution:
{
integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==,
}
remark-mdx@3.0.0:
resolution:
{
integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==,
}
remark-parse@11.0.0:
resolution:
{
integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==,
}
remark-rehype@11.1.0:
resolution:
{
integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==,
}
remark-smartypants@2.0.0:
resolution:
{
integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==,
}
engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 }
remark-stringify@11.0.0:
resolution:
{
integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==,
}
request-light@0.7.0:
resolution:
{
integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==,
}
require-directory@2.1.1:
resolution:
{
integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==,
}
engines: { node: ">=0.10.0" }
resolve@1.22.8:
resolution:
{
integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==,
}
hasBin: true
restore-cursor@4.0.0:
resolution:
{
integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==,
}
engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 }
retext-latin@3.1.0:
resolution:
{
integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==,
}
retext-smartypants@5.2.0:
resolution:
{
integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==,
}
retext-stringify@3.1.0:
resolution:
{
integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==,
}
retext@8.1.0:
resolution:
{
integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==,
}
reusify@1.0.4:
resolution:
{
integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==,
}
engines: { iojs: ">=1.0.0", node: ">=0.10.0" }
rollup@4.17.2:
resolution:
{
integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==,
}
engines: { node: ">=18.0.0", npm: ">=8.0.0" }
hasBin: true
run-parallel@1.2.0:
resolution:
{
integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==,
}
sax@1.3.0:
resolution:
{
integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==,
}
section-matter@1.0.0:
resolution:
{
integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==,
}
engines: { node: ">=4" }
semver@6.3.1:
resolution:
{
integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==,
}
hasBin: true
semver@7.5.4:
resolution:
{
integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==,
}
engines: { node: ">=10" }
hasBin: true
semver@7.6.2:
resolution:
{
integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==,
}
engines: { node: ">=10" }
hasBin: true
sharp@0.33.4:
resolution:
{
integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==,
}
engines: { libvips: ">=8.15.2", node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
shebang-command@2.0.0:
resolution:
{
integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==,
}
engines: { node: ">=8" }
shebang-regex@3.0.0:
resolution:
{
integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==,
}
engines: { node: ">=8" }
shiki@1.5.2:
resolution:
{
integrity: sha512-fpPbuSaatinmdGijE7VYUD3hxLozR3ZZ+iAx8Iy2X6REmJGyF5hQl94SgmiUNTospq346nXUVZx0035dyGvIVw==,
}
signal-exit@3.0.7:
resolution:
{
integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==,
}
signal-exit@4.1.0:
resolution:
{
integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==,
}
engines: { node: ">=14" }
simple-swizzle@0.2.2:
resolution:
{
integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==,
}
sisteransi@1.0.5:
resolution:
{
integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==,
}
sitemap@7.1.1:
resolution:
{
integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==,
}
engines: { node: ">=12.0.0", npm: ">=5.6.0" }
hasBin: true
source-map-js@1.0.2:
resolution:
{
integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==,
}
engines: { node: ">=0.10.0" }
source-map-js@1.2.0:
resolution:
{
integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==,
}
engines: { node: ">=0.10.0" }
source-map@0.7.4:
resolution:
{
integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==,
}
engines: { node: ">= 8" }
space-separated-tokens@2.0.2:
resolution:
{
integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==,
}
sprintf-js@1.0.3:
resolution:
{
integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==,
}
stdin-discarder@0.2.2:
resolution:
{
integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==,
}
engines: { node: ">=18" }
string-width@4.2.3:
resolution:
{
integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==,
}
engines: { node: ">=8" }
string-width@5.1.2:
resolution:
{
integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==,
}
engines: { node: ">=12" }
string-width@7.1.0:
resolution:
{
integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==,
}
engines: { node: ">=18" }
stringify-entities@4.0.3:
resolution:
{
integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==,
}
strip-ansi@6.0.1:
resolution:
{
integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==,
}
engines: { node: ">=8" }
strip-ansi@7.1.0:
resolution:
{
integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==,
}
engines: { node: ">=12" }
strip-bom-string@1.0.0:
resolution:
{
integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==,
}
engines: { node: ">=0.10.0" }
strip-bom@3.0.0:
resolution:
{
integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==,
}
engines: { node: ">=4" }
strip-final-newline@3.0.0:
resolution:
{
integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==,
}
engines: { node: ">=12" }
style-to-object@0.4.4:
resolution:
{
integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==,
}
style-to-object@1.0.5:
resolution:
{
integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==,
}
stylehacks@7.0.0:
resolution:
{
integrity: sha512-47Nw4pQ6QJb4CA6dzF2m9810sjQik4dfk4UwAm5wlwhrW3syzZKF8AR4/cfO3Cr6lsFgAoznQq0Wg57qhjTA2A==,
}
engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 }
peerDependencies:
postcss: ^8.4.31
sucrase@3.34.0:
resolution:
{
integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==,
}
engines: { node: ">=8" }
hasBin: true
supports-color@5.5.0:
resolution:
{
integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==,
}
engines: { node: ">=4" }
supports-preserve-symlinks-flag@1.0.0:
resolution:
{
integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==,
}
engines: { node: ">= 0.4" }
svgo@3.3.2:
resolution:
{
integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==,
}
engines: { node: ">=14.0.0" }
hasBin: true
tailwindcss@3.4.3:
resolution:
{
integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==,
}
engines: { node: ">=14.0.0" }
hasBin: true
thenify-all@1.6.0:
resolution:
{
integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==,
}
engines: { node: ">=0.8" }
thenify@3.3.1:
resolution:
{
integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==,
}
to-fast-properties@2.0.0:
resolution:
{
integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==,
}
engines: { node: ">=4" }
to-regex-range@5.0.1:
resolution:
{
integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==,
}
engines: { node: ">=8.0" }
trim-lines@3.0.1:
resolution:
{
integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==,
}
trough@2.1.0:
resolution:
{
integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==,
}
ts-interface-checker@0.1.13:
resolution:
{
integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==,
}
tsconfck@3.0.3:
resolution:
{
integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==,
}
engines: { node: ^18 || >=20 }
hasBin: true
peerDependencies:
typescript: ^5.0.0
peerDependenciesMeta:
typescript:
optional: true
tslib@2.6.2:
resolution:
{
integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==,
}
type-fest@2.19.0:
resolution:
{
integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==,
}
engines: { node: ">=12.20" }
typesafe-path@0.2.2:
resolution:
{
integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==,
}
typescript-auto-import-cache@0.3.2:
resolution:
{
integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==,
}
typescript@5.4.5:
resolution:
{
integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==,
}
engines: { node: ">=14.17" }
hasBin: true
unherit@3.0.1:
resolution:
{
integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==,
}
unified@10.1.2:
resolution:
{
integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==,
}
unified@11.0.4:
resolution:
{
integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==,
}
unist-util-find-after@5.0.0:
resolution:
{
integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==,
}
unist-util-is@5.2.1:
resolution:
{
integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==,
}
unist-util-is@6.0.0:
resolution:
{
integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==,
}
unist-util-modify-children@3.1.1:
resolution:
{
integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==,
}
unist-util-position-from-estree@2.0.0:
resolution:
{
integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==,
}
unist-util-position@5.0.0:
resolution:
{
integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==,
}
unist-util-remove-position@5.0.0:
resolution:
{
integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==,
}
unist-util-stringify-position@3.0.3:
resolution:
{
integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==,
}
unist-util-stringify-position@4.0.0:
resolution:
{
integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==,
}
unist-util-visit-children@2.0.2:
resolution:
{
integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==,
}
unist-util-visit-parents@5.1.3:
resolution:
{
integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==,
}
unist-util-visit-parents@6.0.1:
resolution:
{
integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==,
}
unist-util-visit@4.1.2:
resolution:
{
integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==,
}
unist-util-visit@5.0.0:
resolution:
{
integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==,
}
update-browserslist-db@1.0.13:
resolution:
{
integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==,
}
hasBin: true
peerDependencies:
browserslist: ">= 4.21.0"
util-deprecate@1.0.2:
resolution:
{
integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==,
}
vfile-location@5.0.2:
resolution:
{
integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==,
}
vfile-message@3.1.4:
resolution:
{
integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==,
}
vfile-message@4.0.2:
resolution:
{
integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==,
}
vfile@5.3.7:
resolution:
{
integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==,
}
vfile@6.0.1:
resolution:
{
integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==,
}
vite@5.2.11:
resolution:
{
integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==,
}
engines: { node: ^18.0.0 || >=20.0.0 }
hasBin: true
peerDependencies:
"@types/node": ^18.0.0 || >=20.0.0
less: "*"
lightningcss: ^1.21.0
sass: "*"
stylus: "*"
sugarss: "*"
terser: ^5.4.0
peerDependenciesMeta:
"@types/node":
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
vitefu@0.2.5:
resolution:
{
integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==,
}
peerDependencies:
vite: ^3.0.0 || ^4.0.0 || ^5.0.0
peerDependenciesMeta:
vite:
optional: true
volar-service-css@0.0.45:
resolution:
{
integrity: sha512-f+AlUI1+kESbcZSVaNJVAnK0c/9Da5StoxzPqA5/8VqUHJWNdubWNnwG5xpFVTfgh6pgTcey3UBhBfHytFaIOg==,
}
peerDependencies:
"@volar/language-service": ~2.2.3
peerDependenciesMeta:
"@volar/language-service":
optional: true
volar-service-emmet@0.0.45:
resolution:
{
integrity: sha512-9nLXSDkR1vA/3fQkFEsSXAu3XovQxOpTkVG2jilQgfek/K1ZLkaA/WMhN/TtmPmQg4NxE9Ni6mA5udBQ5gVXIA==,
}
peerDependencies:
"@volar/language-service": ~2.2.3
peerDependenciesMeta:
"@volar/language-service":
optional: true
volar-service-html@0.0.45:
resolution:
{
integrity: sha512-tLTJqfy1v5C4nmeAsfekFIKPl4r4qDMyL0L9MWywr/EApZzPCsbeUGxCqdzxSMC2q7PMCfX2i167txDo+J0LVA==,
}
peerDependencies:
"@volar/language-service": ~2.2.3
peerDependenciesMeta:
"@volar/language-service":
optional: true
volar-service-prettier@0.0.45:
resolution:
{
integrity: sha512-+mBS2EsDgp/kunKEBnHvhBwIQm5v2ahw4NKpKdg4sTpXy3UxqHt+Fq/wRYQ7Z8LlNVNRVfp75ThjM+w2zaZBAw==,
}
peerDependencies:
"@volar/language-service": ~2.2.3
prettier: ^2.2 || ^3.0
peerDependenciesMeta:
"@volar/language-service":
optional: true
prettier:
optional: true
volar-service-typescript-twoslash-queries@0.0.45:
resolution:
{
integrity: sha512-KrPUUvKggZgV9mrDpstCzmf20irgv0ooMv+FGDzIIQUkya+d2+nSS8Mx2h9FvsYgLccUVw5jU3Rhwhd3pv/7qg==,
}
peerDependencies:
"@volar/language-service": ~2.2.3
peerDependenciesMeta:
"@volar/language-service":
optional: true
volar-service-typescript@0.0.45:
resolution:
{
integrity: sha512-i/mMIIAMastJ2kgPo3qvX0Rrl7NyxhIYZ0ug/B4ambZcLPI1vzBgS2fmvyWX3jhBYHh8NmbAotFj+0Y9JtN47A==,
}
peerDependencies:
"@volar/language-service": ~2.2.3
peerDependenciesMeta:
"@volar/language-service":
optional: true
vscode-css-languageservice@6.2.10:
resolution:
{
integrity: sha512-sYUZPku4mQ06AWGCbMyjv2tdR6juBW6hTbVPFwbJvNVzdtEfBioQOgkdXg7yMJNWnXkvWSU1FL2kb4Vxu5Cdyw==,
}
vscode-html-languageservice@5.2.0:
resolution:
{
integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==,
}
vscode-jsonrpc@8.2.0:
resolution:
{
integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==,
}
engines: { node: ">=14.0.0" }
vscode-languageserver-protocol@3.17.5:
resolution:
{
integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==,
}
vscode-languageserver-textdocument@1.0.11:
resolution:
{
integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==,
}
vscode-languageserver-types@3.17.5:
resolution:
{
integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==,
}
vscode-languageserver@9.0.1:
resolution:
{
integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==,
}
hasBin: true
vscode-nls@5.2.0:
resolution:
{
integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==,
}
vscode-uri@2.1.2:
resolution:
{
integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==,
}
vscode-uri@3.0.8:
resolution:
{
integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==,
}
web-namespaces@2.0.1:
resolution:
{
integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==,
}
which-pm-runs@1.1.0:
resolution:
{
integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==,
}
engines: { node: ">=4" }
which-pm@2.0.0:
resolution:
{
integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==,
}
engines: { node: ">=8.15" }
which-pm@2.1.1:
resolution:
{
integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==,
}
engines: { node: ">=8.15" }
which@2.0.2:
resolution:
{
integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==,
}
engines: { node: ">= 8" }
hasBin: true
widest-line@4.0.1:
resolution:
{
integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==,
}
engines: { node: ">=12" }
wrap-ansi@7.0.0:
resolution:
{
integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==,
}
engines: { node: ">=10" }
wrap-ansi@8.1.0:
resolution:
{
integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==,
}
engines: { node: ">=12" }
wrappy@1.0.2:
resolution:
{
integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==,
}
y18n@5.0.8:
resolution:
{
integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==,
}
engines: { node: ">=10" }
yallist@3.1.1:
resolution:
{
integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==,
}
yallist@4.0.0:
resolution:
{
integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==,
}
yaml@2.3.4:
resolution:
{
integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==,
}
engines: { node: ">= 14" }
yargs-parser@21.1.1:
resolution:
{
integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==,
}
engines: { node: ">=12" }
yargs@17.7.2:
resolution:
{
integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==,
}
engines: { node: ">=12" }
yocto-queue@0.1.0:
resolution:
{
integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==,
}
engines: { node: ">=10" }
yocto-queue@1.0.0:
resolution:
{
integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==,
}
engines: { node: ">=12.20" }
zod-to-json-schema@3.23.0:
resolution:
{
integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==,
}
peerDependencies:
zod: ^3.23.3
zod@3.22.4:
resolution:
{
integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==,
}
zod@3.23.8:
resolution:
{
integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==,
}
zwitch@2.0.4:
resolution:
{
integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==,
}
snapshots:
"@alloc/quick-lru@5.2.0": {}
"@ampproject/remapping@2.2.1":
dependencies:
"@jridgewell/gen-mapping": 0.3.3
"@jridgewell/trace-mapping": 0.3.20
"@astrojs/check@0.7.0(typescript@5.4.5)":
dependencies:
"@astrojs/language-server": 2.10.0(typescript@5.4.5)
chokidar: 3.5.3
fast-glob: 3.3.2
kleur: 4.1.5
typescript: 5.4.5
yargs: 17.7.2
transitivePeerDependencies:
- prettier
- prettier-plugin-astro
"@astrojs/compiler@2.8.0": {}
"@astrojs/internal-helpers@0.4.0": {}
"@astrojs/language-server@2.10.0(typescript@5.4.5)":
dependencies:
"@astrojs/compiler": 2.8.0
"@jridgewell/sourcemap-codec": 1.4.15
"@volar/kit": 2.2.4(typescript@5.4.5)
"@volar/language-core": 2.2.4
"@volar/language-server": 2.2.4
"@volar/language-service": 2.2.4
"@volar/typescript": 2.2.4
fast-glob: 3.3.2
volar-service-css: 0.0.45(@volar/language-service@2.2.4)
volar-service-emmet: 0.0.45(@volar/language-service@2.2.4)
volar-service-html: 0.0.45(@volar/language-service@2.2.4)
volar-service-prettier: 0.0.45(@volar/language-service@2.2.4)
volar-service-typescript: 0.0.45(@volar/language-service@2.2.4)
volar-service-typescript-twoslash-queries: 0.0.45(@volar/language-service@2.2.4)
vscode-html-languageservice: 5.2.0
vscode-uri: 3.0.8
transitivePeerDependencies:
- typescript
"@astrojs/markdown-remark@5.1.0":
dependencies:
"@astrojs/prism": 3.1.0
github-slugger: 2.0.0
hast-util-from-html: 2.0.1
hast-util-to-text: 4.0.2
import-meta-resolve: 4.0.0
mdast-util-definitions: 6.0.0
rehype-raw: 7.0.0
rehype-stringify: 10.0.0
remark-gfm: 4.0.0
remark-parse: 11.0.0
remark-rehype: 11.1.0
remark-smartypants: 2.0.0
shiki: 1.5.2
unified: 11.0.4
unist-util-remove-position: 5.0.0
unist-util-visit: 5.0.0
unist-util-visit-parents: 6.0.1
vfile: 6.0.1
transitivePeerDependencies:
- supports-color
"@astrojs/mdx@2.3.1(astro@4.8.6(typescript@5.4.5))":
dependencies:
"@astrojs/markdown-remark": 5.1.0
"@mdx-js/mdx": 3.0.0
acorn: 8.11.2
astro: 4.8.6(typescript@5.4.5)
es-module-lexer: 1.4.1
estree-util-visit: 2.0.0
github-slugger: 2.0.0
gray-matter: 4.0.3
hast-util-to-html: 9.0.0
kleur: 4.1.5
rehype-raw: 7.0.0
remark-gfm: 4.0.0
remark-smartypants: 2.0.0
source-map: 0.7.4
unist-util-visit: 5.0.0
vfile: 6.0.1
transitivePeerDependencies:
- supports-color
"@astrojs/prism@3.1.0":
dependencies:
prismjs: 1.29.0
"@astrojs/sitemap@3.0.5":
dependencies:
sitemap: 7.1.1
zod: 3.22.4
"@astrojs/starlight-tailwind@2.0.2(@astrojs/starlight@0.22.4(astro@4.8.6(typescript@5.4.5)))(@astrojs/tailwind@5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3))(tailwindcss@3.4.3)":
dependencies:
"@astrojs/starlight": 0.22.4(astro@4.8.6(typescript@5.4.5))
"@astrojs/tailwind": 5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3)
tailwindcss: 3.4.3
"@astrojs/starlight@0.22.4(astro@4.8.6(typescript@5.4.5))":
dependencies:
"@astrojs/mdx": 2.3.1(astro@4.8.6(typescript@5.4.5))
"@astrojs/sitemap": 3.0.5
"@pagefind/default-ui": 1.0.4
"@types/hast": 3.0.3
"@types/mdast": 4.0.3
astro: 4.8.6(typescript@5.4.5)
astro-expressive-code: 0.35.3(astro@4.8.6(typescript@5.4.5))
bcp-47: 2.1.0
hast-util-from-html: 2.0.1
hast-util-select: 6.0.2
hast-util-to-string: 3.0.0
hastscript: 8.0.0
mdast-util-directive: 3.0.0
mdast-util-to-markdown: 2.1.0
pagefind: 1.0.4
rehype: 13.0.1
rehype-format: 5.0.0
remark-directive: 3.0.0
unified: 11.0.4
unist-util-visit: 5.0.0
vfile: 6.0.1
transitivePeerDependencies:
- supports-color
"@astrojs/tailwind@5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3)":
dependencies:
astro: 4.8.6(typescript@5.4.5)
autoprefixer: 10.4.19(postcss@8.4.31)
postcss: 8.4.31
postcss-load-config: 4.0.2(postcss@8.4.31)
tailwindcss: 3.4.3
transitivePeerDependencies:
- ts-node
"@astrojs/telemetry@3.1.0":
dependencies:
ci-info: 4.0.0
debug: 4.3.4
dlv: 1.1.3
dset: 3.1.3
is-docker: 3.0.0
is-wsl: 3.1.0
which-pm-runs: 1.1.0
transitivePeerDependencies:
- supports-color
"@babel/code-frame@7.24.2":
dependencies:
"@babel/highlight": 7.24.5
picocolors: 1.0.0
"@babel/compat-data@7.24.4": {}
"@babel/core@7.24.5":
dependencies:
"@ampproject/remapping": 2.2.1
"@babel/code-frame": 7.24.2
"@babel/generator": 7.24.5
"@babel/helper-compilation-targets": 7.23.6
"@babel/helper-module-transforms": 7.24.5(@babel/core@7.24.5)
"@babel/helpers": 7.24.5
"@babel/parser": 7.24.5
"@babel/template": 7.24.0
"@babel/traverse": 7.24.5
"@babel/types": 7.24.5
convert-source-map: 2.0.0
debug: 4.3.4
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
transitivePeerDependencies:
- supports-color
"@babel/generator@7.24.5":
dependencies:
"@babel/types": 7.24.5
"@jridgewell/gen-mapping": 0.3.5
"@jridgewell/trace-mapping": 0.3.25
jsesc: 2.5.2
"@babel/helper-annotate-as-pure@7.22.5":
dependencies:
"@babel/types": 7.24.5
"@babel/helper-compilation-targets@7.23.6":
dependencies:
"@babel/compat-data": 7.24.4
"@babel/helper-validator-option": 7.23.5
browserslist: 4.23.0
lru-cache: 5.1.1
semver: 6.3.1
"@babel/helper-environment-visitor@7.22.20": {}
"@babel/helper-function-name@7.23.0":
dependencies:
"@babel/template": 7.22.15
"@babel/types": 7.24.5
"@babel/helper-hoist-variables@7.22.5":
dependencies:
"@babel/types": 7.24.5
"@babel/helper-module-imports@7.22.15":
dependencies:
"@babel/types": 7.24.5
"@babel/helper-module-imports@7.24.3":
dependencies:
"@babel/types": 7.24.5
"@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)":
dependencies:
"@babel/core": 7.24.5
"@babel/helper-environment-visitor": 7.22.20
"@babel/helper-module-imports": 7.24.3
"@babel/helper-simple-access": 7.24.5
"@babel/helper-split-export-declaration": 7.24.5
"@babel/helper-validator-identifier": 7.24.5
"@babel/helper-plugin-utils@7.22.5": {}
"@babel/helper-simple-access@7.24.5":
dependencies:
"@babel/types": 7.24.5
"@babel/helper-split-export-declaration@7.24.5":
dependencies:
"@babel/types": 7.24.5
"@babel/helper-string-parser@7.24.1": {}
"@babel/helper-validator-identifier@7.24.5": {}
"@babel/helper-validator-option@7.23.5": {}
"@babel/helpers@7.24.5":
dependencies:
"@babel/template": 7.24.0
"@babel/traverse": 7.24.5
"@babel/types": 7.24.5
transitivePeerDependencies:
- supports-color
"@babel/highlight@7.24.5":
dependencies:
"@babel/helper-validator-identifier": 7.24.5
chalk: 2.4.2
js-tokens: 4.0.0
picocolors: 1.0.0
"@babel/parser@7.24.5":
dependencies:
"@babel/types": 7.24.5
"@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.5)":
dependencies:
"@babel/core": 7.24.5
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5)":
dependencies:
"@babel/core": 7.24.5
"@babel/helper-annotate-as-pure": 7.22.5
"@babel/helper-module-imports": 7.22.15
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-jsx": 7.23.3(@babel/core@7.24.5)
"@babel/types": 7.24.5
"@babel/template@7.22.15":
dependencies:
"@babel/code-frame": 7.24.2
"@babel/parser": 7.24.5
"@babel/types": 7.24.5
"@babel/template@7.24.0":
dependencies:
"@babel/code-frame": 7.24.2
"@babel/parser": 7.24.5
"@babel/types": 7.24.5
"@babel/traverse@7.24.5":
dependencies:
"@babel/code-frame": 7.24.2
"@babel/generator": 7.24.5
"@babel/helper-environment-visitor": 7.22.20
"@babel/helper-function-name": 7.23.0
"@babel/helper-hoist-variables": 7.22.5
"@babel/helper-split-export-declaration": 7.24.5
"@babel/parser": 7.24.5
"@babel/types": 7.24.5
debug: 4.3.4
globals: 11.12.0
transitivePeerDependencies:
- supports-color
"@babel/types@7.24.5":
dependencies:
"@babel/helper-string-parser": 7.24.1
"@babel/helper-validator-identifier": 7.24.5
to-fast-properties: 2.0.0
"@csstools/cascade-layer-name-parser@1.0.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)":
dependencies:
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/color-helpers@4.2.0": {}
"@csstools/css-calc@1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)":
dependencies:
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/css-color-parser@2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)":
dependencies:
"@csstools/color-helpers": 4.2.0
"@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1)":
dependencies:
"@csstools/css-tokenizer": 2.3.1
"@csstools/css-tokenizer@2.3.1": {}
"@csstools/media-query-list-parser@2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)":
dependencies:
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-cascade-layers@4.0.6(postcss@8.4.33)":
dependencies:
"@csstools/selector-specificity": 3.1.1(postcss-selector-parser@6.0.16)
postcss: 8.4.33
postcss-selector-parser: 6.0.16
"@csstools/postcss-color-function@3.0.16(postcss@8.4.33)":
dependencies:
"@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
"@csstools/postcss-color-mix-function@2.0.16(postcss@8.4.33)":
dependencies:
"@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
"@csstools/postcss-exponential-functions@1.0.7(postcss@8.4.33)":
dependencies:
"@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
postcss: 8.4.33
"@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.33)":
dependencies:
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
"@csstools/postcss-gamut-mapping@1.0.9(postcss@8.4.33)":
dependencies:
"@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
postcss: 8.4.33
"@csstools/postcss-gradients-interpolation-method@4.0.17(postcss@8.4.33)":
dependencies:
"@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
"@csstools/postcss-hwb-function@3.0.15(postcss@8.4.33)":
dependencies:
"@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
"@csstools/postcss-ic-unit@3.0.6(postcss@8.4.33)":
dependencies:
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
"@csstools/postcss-initial@1.0.1(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
"@csstools/postcss-is-pseudo-class@4.0.8(postcss@8.4.33)":
dependencies:
"@csstools/selector-specificity": 3.1.1(postcss-selector-parser@6.0.16)
postcss: 8.4.33
postcss-selector-parser: 6.0.16
"@csstools/postcss-light-dark-function@1.0.5(postcss@8.4.33)":
dependencies:
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
"@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
"@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
"@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
"@csstools/postcss-logical-resize@2.0.1(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
"@csstools/postcss-logical-viewport-units@2.0.9(postcss@8.4.33)":
dependencies:
"@csstools/css-tokenizer": 2.3.1
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
"@csstools/postcss-media-minmax@1.1.6(postcss@8.4.33)":
dependencies:
"@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/media-query-list-parser": 2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
postcss: 8.4.33
"@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.9(postcss@8.4.33)":
dependencies:
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/media-query-list-parser": 2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
postcss: 8.4.33
"@csstools/postcss-nested-calc@3.0.2(postcss@8.4.33)":
dependencies:
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
"@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
"@csstools/postcss-oklab-function@3.0.16(postcss@8.4.33)":
dependencies:
"@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
"@csstools/postcss-progressive-custom-properties@3.2.0(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
"@csstools/postcss-relative-color-syntax@2.0.16(postcss@8.4.33)":
dependencies:
"@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
"@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
"@csstools/postcss-stepped-value-functions@3.0.8(postcss@8.4.33)":
dependencies:
"@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
postcss: 8.4.33
"@csstools/postcss-text-decoration-shorthand@3.0.6(postcss@8.4.33)":
dependencies:
"@csstools/color-helpers": 4.2.0
postcss: 8.4.33
postcss-value-parser: 4.2.0
"@csstools/postcss-trigonometric-functions@3.0.8(postcss@8.4.33)":
dependencies:
"@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
postcss: 8.4.33
"@csstools/postcss-unset-value@3.0.1(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
"@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.16)":
dependencies:
postcss-selector-parser: 6.0.16
"@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.0.16)":
dependencies:
postcss-selector-parser: 6.0.16
"@csstools/utilities@1.0.0(postcss@8.4.33)":
dependencies:
postcss: 8.4.33
"@ctrl/tinycolor@4.1.0": {}
"@emmetio/abbreviation@2.3.3":
dependencies:
"@emmetio/scanner": 1.0.4
"@emmetio/css-abbreviation@2.1.8":
dependencies:
"@emmetio/scanner": 1.0.4
"@emmetio/css-parser@0.4.0":
dependencies:
"@emmetio/stream-reader": 2.2.0
"@emmetio/stream-reader-utils": 0.1.0
"@emmetio/html-matcher@1.3.0":
dependencies:
"@emmetio/scanner": 1.0.4
"@emmetio/scanner@1.0.4": {}
"@emmetio/stream-reader-utils@0.1.0": {}
"@emmetio/stream-reader@2.2.0": {}
"@emnapi/runtime@1.1.1":
dependencies:
tslib: 2.6.2
optional: true
"@esbuild/aix-ppc64@0.20.2":
optional: true
"@esbuild/aix-ppc64@0.21.3":
optional: true
"@esbuild/android-arm64@0.20.2":
optional: true
"@esbuild/android-arm64@0.21.3":
optional: true
"@esbuild/android-arm@0.20.2":
optional: true
"@esbuild/android-arm@0.21.3":
optional: true
"@esbuild/android-x64@0.20.2":
optional: true
"@esbuild/android-x64@0.21.3":
optional: true
"@esbuild/darwin-arm64@0.20.2":
optional: true
"@esbuild/darwin-arm64@0.21.3":
optional: true
"@esbuild/darwin-x64@0.20.2":
optional: true
"@esbuild/darwin-x64@0.21.3":
optional: true
"@esbuild/freebsd-arm64@0.20.2":
optional: true
"@esbuild/freebsd-arm64@0.21.3":
optional: true
"@esbuild/freebsd-x64@0.20.2":
optional: true
"@esbuild/freebsd-x64@0.21.3":
optional: true
"@esbuild/linux-arm64@0.20.2":
optional: true
"@esbuild/linux-arm64@0.21.3":
optional: true
"@esbuild/linux-arm@0.20.2":
optional: true
"@esbuild/linux-arm@0.21.3":
optional: true
"@esbuild/linux-ia32@0.20.2":
optional: true
"@esbuild/linux-ia32@0.21.3":
optional: true
"@esbuild/linux-loong64@0.20.2":
optional: true
"@esbuild/linux-loong64@0.21.3":
optional: true
"@esbuild/linux-mips64el@0.20.2":
optional: true
"@esbuild/linux-mips64el@0.21.3":
optional: true
"@esbuild/linux-ppc64@0.20.2":
optional: true
"@esbuild/linux-ppc64@0.21.3":
optional: true
"@esbuild/linux-riscv64@0.20.2":
optional: true
"@esbuild/linux-riscv64@0.21.3":
optional: true
"@esbuild/linux-s390x@0.20.2":
optional: true
"@esbuild/linux-s390x@0.21.3":
optional: true
"@esbuild/linux-x64@0.20.2":
optional: true
"@esbuild/linux-x64@0.21.3":
optional: true
"@esbuild/netbsd-x64@0.20.2":
optional: true
"@esbuild/netbsd-x64@0.21.3":
optional: true
"@esbuild/openbsd-x64@0.20.2":
optional: true
"@esbuild/openbsd-x64@0.21.3":
optional: true
"@esbuild/sunos-x64@0.20.2":
optional: true
"@esbuild/sunos-x64@0.21.3":
optional: true
"@esbuild/win32-arm64@0.20.2":
optional: true
"@esbuild/win32-arm64@0.21.3":
optional: true
"@esbuild/win32-ia32@0.20.2":
optional: true
"@esbuild/win32-ia32@0.21.3":
optional: true
"@esbuild/win32-x64@0.20.2":
optional: true
"@esbuild/win32-x64@0.21.3":
optional: true
"@expressive-code/core@0.35.3":
dependencies:
"@ctrl/tinycolor": 4.1.0
hast-util-select: 6.0.2
hast-util-to-html: 9.0.1
hast-util-to-text: 4.0.2
hastscript: 9.0.0
postcss: 8.4.38
postcss-nested: 6.0.1(postcss@8.4.38)
unist-util-visit: 5.0.0
unist-util-visit-parents: 6.0.1
"@expressive-code/plugin-frames@0.35.3":
dependencies:
"@expressive-code/core": 0.35.3
"@expressive-code/plugin-shiki@0.35.3":
dependencies:
"@expressive-code/core": 0.35.3
shiki: 1.5.2
"@expressive-code/plugin-text-markers@0.35.3":
dependencies:
"@expressive-code/core": 0.35.3
"@fontsource/inter@5.0.18": {}
"@fontsource/rubik@5.0.20": {}
"@img/sharp-darwin-arm64@0.33.4":
optionalDependencies:
"@img/sharp-libvips-darwin-arm64": 1.0.2
optional: true
"@img/sharp-darwin-x64@0.33.4":
optionalDependencies:
"@img/sharp-libvips-darwin-x64": 1.0.2
optional: true
"@img/sharp-libvips-darwin-arm64@1.0.2":
optional: true
"@img/sharp-libvips-darwin-x64@1.0.2":
optional: true
"@img/sharp-libvips-linux-arm64@1.0.2":
optional: true
"@img/sharp-libvips-linux-arm@1.0.2":
optional: true
"@img/sharp-libvips-linux-s390x@1.0.2":
optional: true
"@img/sharp-libvips-linux-x64@1.0.2":
optional: true
"@img/sharp-libvips-linuxmusl-arm64@1.0.2":
optional: true
"@img/sharp-libvips-linuxmusl-x64@1.0.2":
optional: true
"@img/sharp-linux-arm64@0.33.4":
optionalDependencies:
"@img/sharp-libvips-linux-arm64": 1.0.2
optional: true
"@img/sharp-linux-arm@0.33.4":
optionalDependencies:
"@img/sharp-libvips-linux-arm": 1.0.2
optional: true
"@img/sharp-linux-s390x@0.33.4":
optionalDependencies:
"@img/sharp-libvips-linux-s390x": 1.0.2
optional: true
"@img/sharp-linux-x64@0.33.4":
optionalDependencies:
"@img/sharp-libvips-linux-x64": 1.0.2
optional: true
"@img/sharp-linuxmusl-arm64@0.33.4":
optionalDependencies:
"@img/sharp-libvips-linuxmusl-arm64": 1.0.2
optional: true
"@img/sharp-linuxmusl-x64@0.33.4":
optionalDependencies:
"@img/sharp-libvips-linuxmusl-x64": 1.0.2
optional: true
"@img/sharp-wasm32@0.33.4":
dependencies:
"@emnapi/runtime": 1.1.1
optional: true
"@img/sharp-win32-ia32@0.33.4":
optional: true
"@img/sharp-win32-x64@0.33.4":
optional: true
"@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462":
dependencies:
"@vscode/l10n": 0.0.18
vscode-languageserver-textdocument: 1.0.11
vscode-languageserver-types: 3.17.5
vscode-uri: 3.0.8
"@jridgewell/gen-mapping@0.3.3":
dependencies:
"@jridgewell/set-array": 1.1.2
"@jridgewell/sourcemap-codec": 1.4.15
"@jridgewell/trace-mapping": 0.3.20
"@jridgewell/gen-mapping@0.3.5":
dependencies:
"@jridgewell/set-array": 1.2.1
"@jridgewell/sourcemap-codec": 1.4.15
"@jridgewell/trace-mapping": 0.3.25
"@jridgewell/resolve-uri@3.1.1": {}
"@jridgewell/set-array@1.1.2": {}
"@jridgewell/set-array@1.2.1": {}
"@jridgewell/sourcemap-codec@1.4.15": {}
"@jridgewell/trace-mapping@0.3.20":
dependencies:
"@jridgewell/resolve-uri": 3.1.1
"@jridgewell/sourcemap-codec": 1.4.15
"@jridgewell/trace-mapping@0.3.25":
dependencies:
"@jridgewell/resolve-uri": 3.1.1
"@jridgewell/sourcemap-codec": 1.4.15
"@mdx-js/mdx@3.0.0":
dependencies:
"@types/estree": 1.0.5
"@types/estree-jsx": 1.0.3
"@types/hast": 3.0.3
"@types/mdx": 2.0.10
collapse-white-space: 2.1.0
devlop: 1.1.0
estree-util-build-jsx: 3.0.1
estree-util-is-identifier-name: 3.0.0
estree-util-to-js: 2.0.0
estree-walker: 3.0.3
hast-util-to-estree: 3.1.0
hast-util-to-jsx-runtime: 2.3.0
markdown-extensions: 2.0.0
periscopic: 3.1.0
remark-mdx: 3.0.0
remark-parse: 11.0.0
remark-rehype: 11.1.0
source-map: 0.7.4
unified: 11.0.4
unist-util-position-from-estree: 2.0.0
unist-util-stringify-position: 4.0.0
unist-util-visit: 5.0.0
vfile: 6.0.1
transitivePeerDependencies:
- supports-color
"@nodelib/fs.scandir@2.1.5":
dependencies:
"@nodelib/fs.stat": 2.0.5
run-parallel: 1.2.0
"@nodelib/fs.stat@2.0.5": {}
"@nodelib/fs.walk@1.2.8":
dependencies:
"@nodelib/fs.scandir": 2.1.5
fastq: 1.15.0
"@pagefind/darwin-arm64@1.0.4":
optional: true
"@pagefind/darwin-x64@1.0.4":
optional: true
"@pagefind/default-ui@1.0.4": {}
"@pagefind/linux-arm64@1.0.4":
optional: true
"@pagefind/linux-x64@1.0.4":
optional: true
"@pagefind/windows-x64@1.0.4":
optional: true
"@rollup/rollup-android-arm-eabi@4.17.2":
optional: true
"@rollup/rollup-android-arm64@4.17.2":
optional: true
"@rollup/rollup-darwin-arm64@4.17.2":
optional: true
"@rollup/rollup-darwin-x64@4.17.2":
optional: true
"@rollup/rollup-linux-arm-gnueabihf@4.17.2":
optional: true
"@rollup/rollup-linux-arm-musleabihf@4.17.2":
optional: true
"@rollup/rollup-linux-arm64-gnu@4.17.2":
optional: true
"@rollup/rollup-linux-arm64-musl@4.17.2":
optional: true
"@rollup/rollup-linux-powerpc64le-gnu@4.17.2":
optional: true
"@rollup/rollup-linux-riscv64-gnu@4.17.2":
optional: true
"@rollup/rollup-linux-s390x-gnu@4.17.2":
optional: true
"@rollup/rollup-linux-x64-gnu@4.17.2":
optional: true
"@rollup/rollup-linux-x64-musl@4.17.2":
optional: true
"@rollup/rollup-win32-arm64-msvc@4.17.2":
optional: true
"@rollup/rollup-win32-ia32-msvc@4.17.2":
optional: true
"@rollup/rollup-win32-x64-msvc@4.17.2":
optional: true
"@shikijs/core@1.5.2": {}
"@trysound/sax@0.2.0": {}
"@types/acorn@4.0.6":
dependencies:
"@types/estree": 1.0.5
"@types/babel__core@7.20.5":
dependencies:
"@babel/parser": 7.24.5
"@babel/types": 7.24.5
"@types/babel__generator": 7.6.7
"@types/babel__template": 7.4.4
"@types/babel__traverse": 7.20.4
"@types/babel__generator@7.6.7":
dependencies:
"@babel/types": 7.24.5
"@types/babel__template@7.4.4":
dependencies:
"@babel/parser": 7.24.5
"@babel/types": 7.24.5
"@types/babel__traverse@7.20.4":
dependencies:
"@babel/types": 7.24.5
"@types/cookie@0.6.0": {}
"@types/debug@4.1.12":
dependencies:
"@types/ms": 0.7.34
"@types/estree-jsx@1.0.3":
dependencies:
"@types/estree": 1.0.5
"@types/estree@1.0.5": {}
"@types/hast@3.0.3":
dependencies:
"@types/unist": 3.0.2
"@types/mdast@4.0.3":
dependencies:
"@types/unist": 3.0.2
"@types/mdx@2.0.10": {}
"@types/ms@0.7.34": {}
"@types/nlcst@1.0.4":
dependencies:
"@types/unist": 2.0.10
"@types/node@17.0.45": {}
"@types/sax@1.2.7":
dependencies:
"@types/node": 17.0.45
"@types/unist@2.0.10": {}
"@types/unist@3.0.2": {}
"@ungap/structured-clone@1.2.0": {}
"@volar/kit@2.2.4(typescript@5.4.5)":
dependencies:
"@volar/language-service": 2.2.4
"@volar/typescript": 2.2.4
typesafe-path: 0.2.2
typescript: 5.4.5
vscode-languageserver-textdocument: 1.0.11
vscode-uri: 3.0.8
"@volar/language-core@2.2.4":
dependencies:
"@volar/source-map": 2.2.4
"@volar/language-server@2.2.4":
dependencies:
"@volar/language-core": 2.2.4
"@volar/language-service": 2.2.4
"@volar/snapshot-document": 2.2.4
"@volar/typescript": 2.2.4
"@vscode/l10n": 0.0.16
path-browserify: 1.0.1
request-light: 0.7.0
vscode-languageserver: 9.0.1
vscode-languageserver-protocol: 3.17.5
vscode-languageserver-textdocument: 1.0.11
vscode-uri: 3.0.8
"@volar/language-service@2.2.4":
dependencies:
"@volar/language-core": 2.2.4
vscode-languageserver-protocol: 3.17.5
vscode-languageserver-textdocument: 1.0.11
vscode-uri: 3.0.8
"@volar/snapshot-document@2.2.4":
dependencies:
vscode-languageserver-protocol: 3.17.5
vscode-languageserver-textdocument: 1.0.11
"@volar/source-map@2.2.4":
dependencies:
muggle-string: 0.4.1
"@volar/typescript@2.2.4":
dependencies:
"@volar/language-core": 2.2.4
path-browserify: 1.0.1
"@vscode/emmet-helper@2.9.2":
dependencies:
emmet: 2.4.6
jsonc-parser: 2.3.1
vscode-languageserver-textdocument: 1.0.11
vscode-languageserver-types: 3.17.5
vscode-uri: 2.1.2
"@vscode/l10n@0.0.16": {}
"@vscode/l10n@0.0.18": {}
acorn-jsx@5.3.2(acorn@8.11.2):
dependencies:
acorn: 8.11.2
acorn@8.11.2: {}
acorn@8.11.3: {}
ansi-align@3.0.1:
dependencies:
string-width: 4.2.3
ansi-regex@5.0.1: {}
ansi-regex@6.0.1: {}
ansi-styles@3.2.1:
dependencies:
color-convert: 1.9.3
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
ansi-styles@6.2.1: {}
any-promise@1.3.0: {}
anymatch@3.1.3:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
arg@5.0.2: {}
argparse@1.0.10:
dependencies:
sprintf-js: 1.0.3
argparse@2.0.1: {}
aria-query@5.3.0:
dependencies:
dequal: 2.0.3
array-iterate@2.0.1: {}
astring@1.8.6: {}
astro-expressive-code@0.35.3(astro@4.8.6(typescript@5.4.5)):
dependencies:
astro: 4.8.6(typescript@5.4.5)
rehype-expressive-code: 0.35.3
astro@4.8.6(typescript@5.4.5):
dependencies:
"@astrojs/compiler": 2.8.0
"@astrojs/internal-helpers": 0.4.0
"@astrojs/markdown-remark": 5.1.0
"@astrojs/telemetry": 3.1.0
"@babel/core": 7.24.5
"@babel/generator": 7.24.5
"@babel/parser": 7.24.5
"@babel/plugin-transform-react-jsx": 7.23.4(@babel/core@7.24.5)
"@babel/traverse": 7.24.5
"@babel/types": 7.24.5
"@types/babel__core": 7.20.5
"@types/cookie": 0.6.0
acorn: 8.11.3
aria-query: 5.3.0
axobject-query: 4.0.0
boxen: 7.1.1
chokidar: 3.6.0
ci-info: 4.0.0
clsx: 2.1.1
common-ancestor-path: 1.0.1
cookie: 0.6.0
cssesc: 3.0.0
debug: 4.3.4
deterministic-object-hash: 2.0.2
devalue: 5.0.0
diff: 5.2.0
dlv: 1.1.3
dset: 3.1.3
es-module-lexer: 1.5.2
esbuild: 0.21.3
estree-walker: 3.0.3
execa: 8.0.1
fast-glob: 3.3.2
flattie: 1.1.1
github-slugger: 2.0.0
gray-matter: 4.0.3
html-escaper: 3.0.3
http-cache-semantics: 4.1.1
js-yaml: 4.1.0
kleur: 4.1.5
magic-string: 0.30.10
mrmime: 2.0.0
ora: 8.0.1
p-limit: 5.0.0
p-queue: 8.0.1
path-to-regexp: 6.2.2
preferred-pm: 3.1.3
prompts: 2.4.2
rehype: 13.0.1
resolve: 1.22.8
semver: 7.6.2
shiki: 1.5.2
string-width: 7.1.0
strip-ansi: 7.1.0
tsconfck: 3.0.3(typescript@5.4.5)
unist-util-visit: 5.0.0
vfile: 6.0.1
vite: 5.2.11
vitefu: 0.2.5(vite@5.2.11)
which-pm: 2.1.1
yargs-parser: 21.1.1
zod: 3.23.8
zod-to-json-schema: 3.23.0(zod@3.23.8)
optionalDependencies:
sharp: 0.33.4
transitivePeerDependencies:
- "@types/node"
- less
- lightningcss
- sass
- stylus
- sugarss
- supports-color
- terser
- typescript
autoprefixer@10.4.19(postcss@8.4.31):
dependencies:
browserslist: 4.23.0
caniuse-lite: 1.0.30001620
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.0
postcss: 8.4.31
postcss-value-parser: 4.2.0
autoprefixer@10.4.19(postcss@8.4.33):
dependencies:
browserslist: 4.23.0
caniuse-lite: 1.0.30001620
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.0
postcss: 8.4.33
postcss-value-parser: 4.2.0
axobject-query@4.0.0:
dependencies:
dequal: 2.0.3
bail@2.0.2: {}
balanced-match@1.0.2: {}
base-64@1.0.0: {}
bcp-47-match@2.0.3: {}
bcp-47@2.1.0:
dependencies:
is-alphabetical: 2.0.1
is-alphanumerical: 2.0.1
is-decimal: 2.0.1
binary-extensions@2.2.0: {}
boolbase@1.0.0: {}
boxen@7.1.1:
dependencies:
ansi-align: 3.0.1
camelcase: 7.0.1
chalk: 5.3.0
cli-boxes: 3.0.0
string-width: 5.1.2
type-fest: 2.19.0
widest-line: 4.0.1
wrap-ansi: 8.1.0
brace-expansion@1.1.11:
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
braces@3.0.2:
dependencies:
fill-range: 7.0.1
browserslist@4.23.0:
dependencies:
caniuse-lite: 1.0.30001620
electron-to-chromium: 1.4.773
node-releases: 2.0.14
update-browserslist-db: 1.0.13(browserslist@4.23.0)
camelcase-css@2.0.1: {}
camelcase@7.0.1: {}
caniuse-api@3.0.0:
dependencies:
browserslist: 4.23.0
caniuse-lite: 1.0.30001620
lodash.memoize: 4.1.2
lodash.uniq: 4.5.0
caniuse-lite@1.0.30001620: {}
ccount@2.0.1: {}
chalk@2.4.2:
dependencies:
ansi-styles: 3.2.1
escape-string-regexp: 1.0.5
supports-color: 5.5.0
chalk@5.3.0: {}
character-entities-html4@2.1.0: {}
character-entities-legacy@3.0.0: {}
character-entities@2.0.2: {}
character-reference-invalid@2.0.1: {}
chokidar@3.5.3:
dependencies:
anymatch: 3.1.3
braces: 3.0.2
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.3
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
braces: 3.0.2
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.3
ci-info@4.0.0: {}
cli-boxes@3.0.0: {}
cli-cursor@4.0.0:
dependencies:
restore-cursor: 4.0.0
cli-spinners@2.9.2: {}
cliui@8.0.1:
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
clsx@2.1.1: {}
collapse-white-space@2.1.0: {}
color-convert@1.9.3:
dependencies:
color-name: 1.1.3
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
color-name@1.1.3: {}
color-name@1.1.4: {}
color-string@1.9.1:
dependencies:
color-name: 1.1.4
simple-swizzle: 0.2.2
color@4.2.3:
dependencies:
color-convert: 2.0.1
color-string: 1.9.1
colord@2.9.3: {}
comma-separated-tokens@2.0.3: {}
commander@4.1.1: {}
commander@7.2.0: {}
common-ancestor-path@1.0.1: {}
concat-map@0.0.1: {}
convert-source-map@2.0.0: {}
cookie@0.6.0: {}
cross-spawn@7.0.3:
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
css-blank-pseudo@6.0.2(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
css-declaration-sorter@7.2.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
css-has-pseudo@6.0.5(postcss@8.4.33):
dependencies:
"@csstools/selector-specificity": 3.1.1(postcss-selector-parser@6.0.16)
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-value-parser: 4.2.0
css-prefers-color-scheme@9.0.1(postcss@8.4.33):
dependencies:
postcss: 8.4.33
css-select@5.1.0:
dependencies:
boolbase: 1.0.0
css-what: 6.1.0
domhandler: 5.0.3
domutils: 3.1.0
nth-check: 2.1.1
css-selector-parser@3.0.4: {}
css-tree@2.2.1:
dependencies:
mdn-data: 2.0.28
source-map-js: 1.2.0
css-tree@2.3.1:
dependencies:
mdn-data: 2.0.30
source-map-js: 1.2.0
css-what@6.1.0: {}
cssdb@8.0.1: {}
cssesc@3.0.0: {}
cssnano-preset-default@7.0.1(postcss@8.4.33):
dependencies:
browserslist: 4.23.0
css-declaration-sorter: 7.2.0(postcss@8.4.33)
cssnano-utils: 5.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-calc: 10.0.0(postcss@8.4.33)
postcss-colormin: 7.0.0(postcss@8.4.33)
postcss-convert-values: 7.0.0(postcss@8.4.33)
postcss-discard-comments: 7.0.0(postcss@8.4.33)
postcss-discard-duplicates: 7.0.0(postcss@8.4.33)
postcss-discard-empty: 7.0.0(postcss@8.4.33)
postcss-discard-overridden: 7.0.0(postcss@8.4.33)
postcss-merge-longhand: 7.0.0(postcss@8.4.33)
postcss-merge-rules: 7.0.0(postcss@8.4.33)
postcss-minify-font-values: 7.0.0(postcss@8.4.33)
postcss-minify-gradients: 7.0.0(postcss@8.4.33)
postcss-minify-params: 7.0.0(postcss@8.4.33)
postcss-minify-selectors: 7.0.0(postcss@8.4.33)
postcss-normalize-charset: 7.0.0(postcss@8.4.33)
postcss-normalize-display-values: 7.0.0(postcss@8.4.33)
postcss-normalize-positions: 7.0.0(postcss@8.4.33)
postcss-normalize-repeat-style: 7.0.0(postcss@8.4.33)
postcss-normalize-string: 7.0.0(postcss@8.4.33)
postcss-normalize-timing-functions: 7.0.0(postcss@8.4.33)
postcss-normalize-unicode: 7.0.0(postcss@8.4.33)
postcss-normalize-url: 7.0.0(postcss@8.4.33)
postcss-normalize-whitespace: 7.0.0(postcss@8.4.33)
postcss-ordered-values: 7.0.0(postcss@8.4.33)
postcss-reduce-initial: 7.0.0(postcss@8.4.33)
postcss-reduce-transforms: 7.0.0(postcss@8.4.33)
postcss-svgo: 7.0.0(postcss@8.4.33)
postcss-unique-selectors: 7.0.0(postcss@8.4.33)
cssnano-utils@5.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
cssnano@7.0.1(postcss@8.4.33):
dependencies:
cssnano-preset-default: 7.0.1(postcss@8.4.33)
lilconfig: 3.1.1
postcss: 8.4.33
csso@5.0.5:
dependencies:
css-tree: 2.2.1
debug@4.3.4:
dependencies:
ms: 2.1.2
decode-named-character-reference@1.0.2:
dependencies:
character-entities: 2.0.2
dequal@2.0.3: {}
detect-libc@2.0.3: {}
deterministic-object-hash@2.0.2:
dependencies:
base-64: 1.0.0
devalue@5.0.0: {}
devlop@1.1.0:
dependencies:
dequal: 2.0.3
didyoumean@1.2.2: {}
diff@5.2.0: {}
direction@2.0.1: {}
dlv@1.1.3: {}
dom-serializer@2.0.0:
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
entities: 4.5.0
domelementtype@2.3.0: {}
domhandler@5.0.3:
dependencies:
domelementtype: 2.3.0
domutils@3.1.0:
dependencies:
dom-serializer: 2.0.0
domelementtype: 2.3.0
domhandler: 5.0.3
dset@3.1.3: {}
eastasianwidth@0.2.0: {}
electron-to-chromium@1.4.773: {}
emmet@2.4.6:
dependencies:
"@emmetio/abbreviation": 2.3.3
"@emmetio/css-abbreviation": 2.1.8
emoji-regex@10.3.0: {}
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
entities@4.5.0: {}
es-module-lexer@1.4.1: {}
es-module-lexer@1.5.2: {}
esbuild@0.20.2:
optionalDependencies:
"@esbuild/aix-ppc64": 0.20.2
"@esbuild/android-arm": 0.20.2
"@esbuild/android-arm64": 0.20.2
"@esbuild/android-x64": 0.20.2
"@esbuild/darwin-arm64": 0.20.2
"@esbuild/darwin-x64": 0.20.2
"@esbuild/freebsd-arm64": 0.20.2
"@esbuild/freebsd-x64": 0.20.2
"@esbuild/linux-arm": 0.20.2
"@esbuild/linux-arm64": 0.20.2
"@esbuild/linux-ia32": 0.20.2
"@esbuild/linux-loong64": 0.20.2
"@esbuild/linux-mips64el": 0.20.2
"@esbuild/linux-ppc64": 0.20.2
"@esbuild/linux-riscv64": 0.20.2
"@esbuild/linux-s390x": 0.20.2
"@esbuild/linux-x64": 0.20.2
"@esbuild/netbsd-x64": 0.20.2
"@esbuild/openbsd-x64": 0.20.2
"@esbuild/sunos-x64": 0.20.2
"@esbuild/win32-arm64": 0.20.2
"@esbuild/win32-ia32": 0.20.2
"@esbuild/win32-x64": 0.20.2
esbuild@0.21.3:
optionalDependencies:
"@esbuild/aix-ppc64": 0.21.3
"@esbuild/android-arm": 0.21.3
"@esbuild/android-arm64": 0.21.3
"@esbuild/android-x64": 0.21.3
"@esbuild/darwin-arm64": 0.21.3
"@esbuild/darwin-x64": 0.21.3
"@esbuild/freebsd-arm64": 0.21.3
"@esbuild/freebsd-x64": 0.21.3
"@esbuild/linux-arm": 0.21.3
"@esbuild/linux-arm64": 0.21.3
"@esbuild/linux-ia32": 0.21.3
"@esbuild/linux-loong64": 0.21.3
"@esbuild/linux-mips64el": 0.21.3
"@esbuild/linux-ppc64": 0.21.3
"@esbuild/linux-riscv64": 0.21.3
"@esbuild/linux-s390x": 0.21.3
"@esbuild/linux-x64": 0.21.3
"@esbuild/netbsd-x64": 0.21.3
"@esbuild/openbsd-x64": 0.21.3
"@esbuild/sunos-x64": 0.21.3
"@esbuild/win32-arm64": 0.21.3
"@esbuild/win32-ia32": 0.21.3
"@esbuild/win32-x64": 0.21.3
escalade@3.1.1: {}
escape-string-regexp@1.0.5: {}
escape-string-regexp@5.0.0: {}
esprima@4.0.1: {}
estree-util-attach-comments@3.0.0:
dependencies:
"@types/estree": 1.0.5
estree-util-build-jsx@3.0.1:
dependencies:
"@types/estree-jsx": 1.0.3
devlop: 1.1.0
estree-util-is-identifier-name: 3.0.0
estree-walker: 3.0.3
estree-util-is-identifier-name@3.0.0: {}
estree-util-to-js@2.0.0:
dependencies:
"@types/estree-jsx": 1.0.3
astring: 1.8.6
source-map: 0.7.4
estree-util-visit@2.0.0:
dependencies:
"@types/estree-jsx": 1.0.3
"@types/unist": 3.0.2
estree-walker@3.0.3:
dependencies:
"@types/estree": 1.0.5
eventemitter3@5.0.1: {}
execa@8.0.1:
dependencies:
cross-spawn: 7.0.3
get-stream: 8.0.1
human-signals: 5.0.0
is-stream: 3.0.0
merge-stream: 2.0.0
npm-run-path: 5.1.0
onetime: 6.0.0
signal-exit: 4.1.0
strip-final-newline: 3.0.0
expressive-code@0.35.3:
dependencies:
"@expressive-code/core": 0.35.3
"@expressive-code/plugin-frames": 0.35.3
"@expressive-code/plugin-shiki": 0.35.3
"@expressive-code/plugin-text-markers": 0.35.3
extend-shallow@2.0.1:
dependencies:
is-extendable: 0.1.1
extend@3.0.2: {}
fast-glob@3.3.2:
dependencies:
"@nodelib/fs.stat": 2.0.5
"@nodelib/fs.walk": 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
micromatch: 4.0.5
fastq@1.15.0:
dependencies:
reusify: 1.0.4
fill-range@7.0.1:
dependencies:
to-regex-range: 5.0.1
find-up@4.1.0:
dependencies:
locate-path: 5.0.0
path-exists: 4.0.0
find-up@5.0.0:
dependencies:
locate-path: 6.0.0
path-exists: 4.0.0
find-yarn-workspace-root2@1.2.16:
dependencies:
micromatch: 4.0.5
pkg-dir: 4.2.0
flattie@1.1.1: {}
fraction.js@4.3.7: {}
fs.realpath@1.0.0: {}
fsevents@2.3.3:
optional: true
function-bind@1.1.2: {}
gensync@1.0.0-beta.2: {}
get-caller-file@2.0.5: {}
get-east-asian-width@1.2.0: {}
get-stream@8.0.1: {}
github-slugger@2.0.0: {}
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
glob-parent@6.0.2:
dependencies:
is-glob: 4.0.3
glob@7.1.6:
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
inherits: 2.0.4
minimatch: 3.1.2
once: 1.4.0
path-is-absolute: 1.0.1
globals@11.12.0: {}
graceful-fs@4.2.11: {}
gray-matter@4.0.3:
dependencies:
js-yaml: 3.14.1
kind-of: 6.0.3
section-matter: 1.0.0
strip-bom-string: 1.0.0
has-flag@3.0.0: {}
hasown@2.0.0:
dependencies:
function-bind: 1.1.2
hast-util-embedded@3.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-is-element: 3.0.0
hast-util-from-html@2.0.1:
dependencies:
"@types/hast": 3.0.3
devlop: 1.1.0
hast-util-from-parse5: 8.0.1
parse5: 7.1.2
vfile: 6.0.1
vfile-message: 4.0.2
hast-util-from-parse5@8.0.1:
dependencies:
"@types/hast": 3.0.3
"@types/unist": 3.0.2
devlop: 1.1.0
hastscript: 8.0.0
property-information: 6.4.0
vfile: 6.0.1
vfile-location: 5.0.2
web-namespaces: 2.0.1
hast-util-has-property@3.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-is-body-ok-link@3.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-is-element@3.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-parse-selector@4.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-phrasing@3.0.1:
dependencies:
"@types/hast": 3.0.3
hast-util-embedded: 3.0.0
hast-util-has-property: 3.0.0
hast-util-is-body-ok-link: 3.0.0
hast-util-is-element: 3.0.0
hast-util-raw@9.0.1:
dependencies:
"@types/hast": 3.0.3
"@types/unist": 3.0.2
"@ungap/structured-clone": 1.2.0
hast-util-from-parse5: 8.0.1
hast-util-to-parse5: 8.0.0
html-void-elements: 3.0.0
mdast-util-to-hast: 13.0.2
parse5: 7.1.2
unist-util-position: 5.0.0
unist-util-visit: 5.0.0
vfile: 6.0.1
web-namespaces: 2.0.1
zwitch: 2.0.4
hast-util-select@6.0.2:
dependencies:
"@types/hast": 3.0.3
"@types/unist": 3.0.2
bcp-47-match: 2.0.3
comma-separated-tokens: 2.0.3
css-selector-parser: 3.0.4
devlop: 1.1.0
direction: 2.0.1
hast-util-has-property: 3.0.0
hast-util-to-string: 3.0.0
hast-util-whitespace: 3.0.0
not: 0.1.0
nth-check: 2.1.1
property-information: 6.4.0
space-separated-tokens: 2.0.2
unist-util-visit: 5.0.0
zwitch: 2.0.4
hast-util-to-estree@3.1.0:
dependencies:
"@types/estree": 1.0.5
"@types/estree-jsx": 1.0.3
"@types/hast": 3.0.3
comma-separated-tokens: 2.0.3
devlop: 1.1.0
estree-util-attach-comments: 3.0.0
estree-util-is-identifier-name: 3.0.0
hast-util-whitespace: 3.0.0
mdast-util-mdx-expression: 2.0.0
mdast-util-mdx-jsx: 3.0.0
mdast-util-mdxjs-esm: 2.0.1
property-information: 6.4.0
space-separated-tokens: 2.0.2
style-to-object: 0.4.4
unist-util-position: 5.0.0
zwitch: 2.0.4
transitivePeerDependencies:
- supports-color
hast-util-to-html@9.0.0:
dependencies:
"@types/hast": 3.0.3
"@types/unist": 3.0.2
ccount: 2.0.1
comma-separated-tokens: 2.0.3
hast-util-raw: 9.0.1
hast-util-whitespace: 3.0.0
html-void-elements: 3.0.0
mdast-util-to-hast: 13.0.2
property-information: 6.4.0
space-separated-tokens: 2.0.2
stringify-entities: 4.0.3
zwitch: 2.0.4
hast-util-to-html@9.0.1:
dependencies:
"@types/hast": 3.0.3
"@types/unist": 3.0.2
ccount: 2.0.1
comma-separated-tokens: 2.0.3
hast-util-raw: 9.0.1
hast-util-whitespace: 3.0.0
html-void-elements: 3.0.0
mdast-util-to-hast: 13.0.2
property-information: 6.4.0
space-separated-tokens: 2.0.2
stringify-entities: 4.0.3
zwitch: 2.0.4
hast-util-to-jsx-runtime@2.3.0:
dependencies:
"@types/estree": 1.0.5
"@types/hast": 3.0.3
"@types/unist": 3.0.2
comma-separated-tokens: 2.0.3
devlop: 1.1.0
estree-util-is-identifier-name: 3.0.0
hast-util-whitespace: 3.0.0
mdast-util-mdx-expression: 2.0.0
mdast-util-mdx-jsx: 3.0.0
mdast-util-mdxjs-esm: 2.0.1
property-information: 6.4.0
space-separated-tokens: 2.0.2
style-to-object: 1.0.5
unist-util-position: 5.0.0
vfile-message: 4.0.2
transitivePeerDependencies:
- supports-color
hast-util-to-parse5@8.0.0:
dependencies:
"@types/hast": 3.0.3
comma-separated-tokens: 2.0.3
devlop: 1.1.0
property-information: 6.4.0
space-separated-tokens: 2.0.2
web-namespaces: 2.0.1
zwitch: 2.0.4
hast-util-to-string@3.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-to-text@4.0.2:
dependencies:
"@types/hast": 3.0.3
"@types/unist": 3.0.2
hast-util-is-element: 3.0.0
unist-util-find-after: 5.0.0
hast-util-whitespace@3.0.0:
dependencies:
"@types/hast": 3.0.3
hastscript@8.0.0:
dependencies:
"@types/hast": 3.0.3
comma-separated-tokens: 2.0.3
hast-util-parse-selector: 4.0.0
property-information: 6.4.0
space-separated-tokens: 2.0.2
hastscript@9.0.0:
dependencies:
"@types/hast": 3.0.3
comma-separated-tokens: 2.0.3
hast-util-parse-selector: 4.0.0
property-information: 6.4.0
space-separated-tokens: 2.0.2
html-escaper@3.0.3: {}
html-void-elements@3.0.0: {}
html-whitespace-sensitive-tag-names@3.0.0: {}
http-cache-semantics@4.1.1: {}
human-signals@5.0.0: {}
import-meta-resolve@4.0.0: {}
inflight@1.0.6:
dependencies:
once: 1.4.0
wrappy: 1.0.2
inherits@2.0.4: {}
inline-style-parser@0.1.1: {}
inline-style-parser@0.2.2: {}
is-alphabetical@2.0.1: {}
is-alphanumerical@2.0.1:
dependencies:
is-alphabetical: 2.0.1
is-decimal: 2.0.1
is-arrayish@0.3.2: {}
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.2.0
is-buffer@2.0.5: {}
is-core-module@2.13.1:
dependencies:
hasown: 2.0.0
is-decimal@2.0.1: {}
is-docker@3.0.0: {}
is-extendable@0.1.1: {}
is-extglob@2.1.1: {}
is-fullwidth-code-point@3.0.0: {}
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
is-hexadecimal@2.0.1: {}
is-inside-container@1.0.0:
dependencies:
is-docker: 3.0.0
is-interactive@2.0.0: {}
is-number@7.0.0: {}
is-plain-obj@4.1.0: {}
is-reference@3.0.2:
dependencies:
"@types/estree": 1.0.5
is-stream@3.0.0: {}
is-unicode-supported@1.3.0: {}
is-unicode-supported@2.0.0: {}
is-wsl@3.1.0:
dependencies:
is-inside-container: 1.0.0
isexe@2.0.0: {}
jiti@1.21.0: {}
js-tokens@4.0.0: {}
js-yaml@3.14.1:
dependencies:
argparse: 1.0.10
esprima: 4.0.1
js-yaml@4.1.0:
dependencies:
argparse: 2.0.1
jsesc@2.5.2: {}
json5@2.2.3: {}
jsonc-parser@2.3.1: {}
kind-of@6.0.3: {}
kleur@3.0.3: {}
kleur@4.1.5: {}
lilconfig@2.1.0: {}
lilconfig@3.0.0: {}
lilconfig@3.1.1: {}
lines-and-columns@1.2.4: {}
load-yaml-file@0.2.0:
dependencies:
graceful-fs: 4.2.11
js-yaml: 3.14.1
pify: 4.0.1
strip-bom: 3.0.0
locate-path@5.0.0:
dependencies:
p-locate: 4.1.0
locate-path@6.0.0:
dependencies:
p-locate: 5.0.0
lodash.memoize@4.1.2: {}
lodash.uniq@4.5.0: {}
log-symbols@6.0.0:
dependencies:
chalk: 5.3.0
is-unicode-supported: 1.3.0
longest-streak@3.1.0: {}
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
lru-cache@6.0.0:
dependencies:
yallist: 4.0.0
magic-string@0.30.10:
dependencies:
"@jridgewell/sourcemap-codec": 1.4.15
markdown-extensions@2.0.0: {}
markdown-table@3.0.3: {}
mdast-util-definitions@6.0.0:
dependencies:
"@types/mdast": 4.0.3
"@types/unist": 3.0.2
unist-util-visit: 5.0.0
mdast-util-directive@3.0.0:
dependencies:
"@types/mdast": 4.0.3
"@types/unist": 3.0.2
devlop: 1.1.0
mdast-util-from-markdown: 2.0.0
mdast-util-to-markdown: 2.1.0
parse-entities: 4.0.1
stringify-entities: 4.0.3
unist-util-visit-parents: 6.0.1
transitivePeerDependencies:
- supports-color
mdast-util-find-and-replace@3.0.1:
dependencies:
"@types/mdast": 4.0.3
escape-string-regexp: 5.0.0
unist-util-is: 6.0.0
unist-util-visit-parents: 6.0.1
mdast-util-from-markdown@2.0.0:
dependencies:
"@types/mdast": 4.0.3
"@types/unist": 3.0.2
decode-named-character-reference: 1.0.2
devlop: 1.1.0
mdast-util-to-string: 4.0.0
micromark: 4.0.0
micromark-util-decode-numeric-character-reference: 2.0.1
micromark-util-decode-string: 2.0.0
micromark-util-normalize-identifier: 2.0.0
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
unist-util-stringify-position: 4.0.0
transitivePeerDependencies:
- supports-color
mdast-util-gfm-autolink-literal@2.0.0:
dependencies:
"@types/mdast": 4.0.3
ccount: 2.0.1
devlop: 1.1.0
mdast-util-find-and-replace: 3.0.1
micromark-util-character: 2.0.1
mdast-util-gfm-footnote@2.0.0:
dependencies:
"@types/mdast": 4.0.3
devlop: 1.1.0
mdast-util-from-markdown: 2.0.0
mdast-util-to-markdown: 2.1.0
micromark-util-normalize-identifier: 2.0.0
transitivePeerDependencies:
- supports-color
mdast-util-gfm-strikethrough@2.0.0:
dependencies:
"@types/mdast": 4.0.3
mdast-util-from-markdown: 2.0.0
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
mdast-util-gfm-table@2.0.0:
dependencies:
"@types/mdast": 4.0.3
devlop: 1.1.0
markdown-table: 3.0.3
mdast-util-from-markdown: 2.0.0
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
mdast-util-gfm-task-list-item@2.0.0:
dependencies:
"@types/mdast": 4.0.3
devlop: 1.1.0
mdast-util-from-markdown: 2.0.0
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
mdast-util-gfm@3.0.0:
dependencies:
mdast-util-from-markdown: 2.0.0
mdast-util-gfm-autolink-literal: 2.0.0
mdast-util-gfm-footnote: 2.0.0
mdast-util-gfm-strikethrough: 2.0.0
mdast-util-gfm-table: 2.0.0
mdast-util-gfm-task-list-item: 2.0.0
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
mdast-util-mdx-expression@2.0.0:
dependencies:
"@types/estree-jsx": 1.0.3
"@types/hast": 3.0.3
"@types/mdast": 4.0.3
devlop: 1.1.0
mdast-util-from-markdown: 2.0.0
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
mdast-util-mdx-jsx@3.0.0:
dependencies:
"@types/estree-jsx": 1.0.3
"@types/hast": 3.0.3
"@types/mdast": 4.0.3
"@types/unist": 3.0.2
ccount: 2.0.1
devlop: 1.1.0
mdast-util-from-markdown: 2.0.0
mdast-util-to-markdown: 2.1.0
parse-entities: 4.0.1
stringify-entities: 4.0.3
unist-util-remove-position: 5.0.0
unist-util-stringify-position: 4.0.0
vfile-message: 4.0.2
transitivePeerDependencies:
- supports-color
mdast-util-mdx@3.0.0:
dependencies:
mdast-util-from-markdown: 2.0.0
mdast-util-mdx-expression: 2.0.0
mdast-util-mdx-jsx: 3.0.0
mdast-util-mdxjs-esm: 2.0.1
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
mdast-util-mdxjs-esm@2.0.1:
dependencies:
"@types/estree-jsx": 1.0.3
"@types/hast": 3.0.3
"@types/mdast": 4.0.3
devlop: 1.1.0
mdast-util-from-markdown: 2.0.0
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
mdast-util-phrasing@4.0.0:
dependencies:
"@types/mdast": 4.0.3
unist-util-is: 6.0.0
mdast-util-to-hast@13.0.2:
dependencies:
"@types/hast": 3.0.3
"@types/mdast": 4.0.3
"@ungap/structured-clone": 1.2.0
devlop: 1.1.0
micromark-util-sanitize-uri: 2.0.0
trim-lines: 3.0.1
unist-util-position: 5.0.0
unist-util-visit: 5.0.0
mdast-util-to-markdown@2.1.0:
dependencies:
"@types/mdast": 4.0.3
"@types/unist": 3.0.2
longest-streak: 3.1.0
mdast-util-phrasing: 4.0.0
mdast-util-to-string: 4.0.0
micromark-util-decode-string: 2.0.0
unist-util-visit: 5.0.0
zwitch: 2.0.4
mdast-util-to-string@4.0.0:
dependencies:
"@types/mdast": 4.0.3
mdn-data@2.0.28: {}
mdn-data@2.0.30: {}
merge-stream@2.0.0: {}
merge2@1.4.1: {}
micromark-core-commonmark@2.0.0:
dependencies:
decode-named-character-reference: 1.0.2
devlop: 1.1.0
micromark-factory-destination: 2.0.0
micromark-factory-label: 2.0.0
micromark-factory-space: 2.0.0
micromark-factory-title: 2.0.0
micromark-factory-whitespace: 2.0.0
micromark-util-character: 2.0.1
micromark-util-chunked: 2.0.0
micromark-util-classify-character: 2.0.0
micromark-util-html-tag-name: 2.0.0
micromark-util-normalize-identifier: 2.0.0
micromark-util-resolve-all: 2.0.0
micromark-util-subtokenize: 2.0.0
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-extension-directive@3.0.0:
dependencies:
devlop: 1.1.0
micromark-factory-space: 2.0.0
micromark-factory-whitespace: 2.0.0
micromark-util-character: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
parse-entities: 4.0.1
micromark-extension-gfm-autolink-literal@2.0.0:
dependencies:
micromark-util-character: 2.0.1
micromark-util-sanitize-uri: 2.0.0
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-extension-gfm-footnote@2.0.0:
dependencies:
devlop: 1.1.0
micromark-core-commonmark: 2.0.0
micromark-factory-space: 2.0.0
micromark-util-character: 2.0.1
micromark-util-normalize-identifier: 2.0.0
micromark-util-sanitize-uri: 2.0.0
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-extension-gfm-strikethrough@2.0.0:
dependencies:
devlop: 1.1.0
micromark-util-chunked: 2.0.0
micromark-util-classify-character: 2.0.0
micromark-util-resolve-all: 2.0.0
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-extension-gfm-table@2.0.0:
dependencies:
devlop: 1.1.0
micromark-factory-space: 2.0.0
micromark-util-character: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-extension-gfm-tagfilter@2.0.0:
dependencies:
micromark-util-types: 2.0.0
micromark-extension-gfm-task-list-item@2.0.1:
dependencies:
devlop: 1.1.0
micromark-factory-space: 2.0.0
micromark-util-character: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-extension-gfm@3.0.0:
dependencies:
micromark-extension-gfm-autolink-literal: 2.0.0
micromark-extension-gfm-footnote: 2.0.0
micromark-extension-gfm-strikethrough: 2.0.0
micromark-extension-gfm-table: 2.0.0
micromark-extension-gfm-tagfilter: 2.0.0
micromark-extension-gfm-task-list-item: 2.0.1
micromark-util-combine-extensions: 2.0.0
micromark-util-types: 2.0.0
micromark-extension-mdx-expression@3.0.0:
dependencies:
"@types/estree": 1.0.5
devlop: 1.1.0
micromark-factory-mdx-expression: 2.0.1
micromark-factory-space: 2.0.0
micromark-util-character: 2.0.1
micromark-util-events-to-acorn: 2.0.2
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-extension-mdx-jsx@3.0.0:
dependencies:
"@types/acorn": 4.0.6
"@types/estree": 1.0.5
devlop: 1.1.0
estree-util-is-identifier-name: 3.0.0
micromark-factory-mdx-expression: 2.0.1
micromark-factory-space: 2.0.0
micromark-util-character: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
vfile-message: 4.0.2
micromark-extension-mdx-md@2.0.0:
dependencies:
micromark-util-types: 2.0.0
micromark-extension-mdxjs-esm@3.0.0:
dependencies:
"@types/estree": 1.0.5
devlop: 1.1.0
micromark-core-commonmark: 2.0.0
micromark-util-character: 2.0.1
micromark-util-events-to-acorn: 2.0.2
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
unist-util-position-from-estree: 2.0.0
vfile-message: 4.0.2
micromark-extension-mdxjs@3.0.0:
dependencies:
acorn: 8.11.2
acorn-jsx: 5.3.2(acorn@8.11.2)
micromark-extension-mdx-expression: 3.0.0
micromark-extension-mdx-jsx: 3.0.0
micromark-extension-mdx-md: 2.0.0
micromark-extension-mdxjs-esm: 3.0.0
micromark-util-combine-extensions: 2.0.0
micromark-util-types: 2.0.0
micromark-factory-destination@2.0.0:
dependencies:
micromark-util-character: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-factory-label@2.0.0:
dependencies:
devlop: 1.1.0
micromark-util-character: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-factory-mdx-expression@2.0.1:
dependencies:
"@types/estree": 1.0.5
devlop: 1.1.0
micromark-util-character: 2.0.1
micromark-util-events-to-acorn: 2.0.2
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
unist-util-position-from-estree: 2.0.0
vfile-message: 4.0.2
micromark-factory-space@2.0.0:
dependencies:
micromark-util-character: 2.0.1
micromark-util-types: 2.0.0
micromark-factory-title@2.0.0:
dependencies:
micromark-factory-space: 2.0.0
micromark-util-character: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-factory-whitespace@2.0.0:
dependencies:
micromark-factory-space: 2.0.0
micromark-util-character: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-util-character@2.0.1:
dependencies:
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-util-chunked@2.0.0:
dependencies:
micromark-util-symbol: 2.0.0
micromark-util-classify-character@2.0.0:
dependencies:
micromark-util-character: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-util-combine-extensions@2.0.0:
dependencies:
micromark-util-chunked: 2.0.0
micromark-util-types: 2.0.0
micromark-util-decode-numeric-character-reference@2.0.1:
dependencies:
micromark-util-symbol: 2.0.0
micromark-util-decode-string@2.0.0:
dependencies:
decode-named-character-reference: 1.0.2
micromark-util-character: 2.0.1
micromark-util-decode-numeric-character-reference: 2.0.1
micromark-util-symbol: 2.0.0
micromark-util-encode@2.0.0: {}
micromark-util-events-to-acorn@2.0.2:
dependencies:
"@types/acorn": 4.0.6
"@types/estree": 1.0.5
"@types/unist": 3.0.2
devlop: 1.1.0
estree-util-visit: 2.0.0
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
vfile-message: 4.0.2
micromark-util-html-tag-name@2.0.0: {}
micromark-util-normalize-identifier@2.0.0:
dependencies:
micromark-util-symbol: 2.0.0
micromark-util-resolve-all@2.0.0:
dependencies:
micromark-util-types: 2.0.0
micromark-util-sanitize-uri@2.0.0:
dependencies:
micromark-util-character: 2.0.1
micromark-util-encode: 2.0.0
micromark-util-symbol: 2.0.0
micromark-util-subtokenize@2.0.0:
dependencies:
devlop: 1.1.0
micromark-util-chunked: 2.0.0
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
micromark-util-symbol@2.0.0: {}
micromark-util-types@2.0.0: {}
micromark@4.0.0:
dependencies:
"@types/debug": 4.1.12
debug: 4.3.4
decode-named-character-reference: 1.0.2
devlop: 1.1.0
micromark-core-commonmark: 2.0.0
micromark-factory-space: 2.0.0
micromark-util-character: 2.0.1
micromark-util-chunked: 2.0.0
micromark-util-combine-extensions: 2.0.0
micromark-util-decode-numeric-character-reference: 2.0.1
micromark-util-encode: 2.0.0
micromark-util-normalize-identifier: 2.0.0
micromark-util-resolve-all: 2.0.0
micromark-util-sanitize-uri: 2.0.0
micromark-util-subtokenize: 2.0.0
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
transitivePeerDependencies:
- supports-color
micromatch@4.0.5:
dependencies:
braces: 3.0.2
picomatch: 2.3.1
mimic-fn@2.1.0: {}
mimic-fn@4.0.0: {}
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
mrmime@2.0.0: {}
ms@2.1.2: {}
muggle-string@0.4.1: {}
mz@2.7.0:
dependencies:
any-promise: 1.3.0
object-assign: 4.1.1
thenify-all: 1.6.0
nanoid@3.3.7: {}
nlcst-to-string@3.1.1:
dependencies:
"@types/nlcst": 1.0.4
node-releases@2.0.14: {}
normalize-path@3.0.0: {}
normalize-range@0.1.2: {}
not@0.1.0: {}
npm-run-path@5.1.0:
dependencies:
path-key: 4.0.0
nth-check@2.1.1:
dependencies:
boolbase: 1.0.0
object-assign@4.1.1: {}
object-hash@3.0.0: {}
once@1.4.0:
dependencies:
wrappy: 1.0.2
onetime@5.1.2:
dependencies:
mimic-fn: 2.1.0
onetime@6.0.0:
dependencies:
mimic-fn: 4.0.0
ora@8.0.1:
dependencies:
chalk: 5.3.0
cli-cursor: 4.0.0
cli-spinners: 2.9.2
is-interactive: 2.0.0
is-unicode-supported: 2.0.0
log-symbols: 6.0.0
stdin-discarder: 0.2.2
string-width: 7.1.0
strip-ansi: 7.1.0
p-limit@2.3.0:
dependencies:
p-try: 2.2.0
p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
p-limit@5.0.0:
dependencies:
yocto-queue: 1.0.0
p-locate@4.1.0:
dependencies:
p-limit: 2.3.0
p-locate@5.0.0:
dependencies:
p-limit: 3.1.0
p-queue@8.0.1:
dependencies:
eventemitter3: 5.0.1
p-timeout: 6.1.2
p-timeout@6.1.2: {}
p-try@2.2.0: {}
pagefind@1.0.4:
optionalDependencies:
"@pagefind/darwin-arm64": 1.0.4
"@pagefind/darwin-x64": 1.0.4
"@pagefind/linux-arm64": 1.0.4
"@pagefind/linux-x64": 1.0.4
"@pagefind/windows-x64": 1.0.4
parse-entities@4.0.1:
dependencies:
"@types/unist": 2.0.10
character-entities: 2.0.2
character-entities-legacy: 3.0.0
character-reference-invalid: 2.0.1
decode-named-character-reference: 1.0.2
is-alphanumerical: 2.0.1
is-decimal: 2.0.1
is-hexadecimal: 2.0.1
parse-latin@5.0.1:
dependencies:
nlcst-to-string: 3.1.1
unist-util-modify-children: 3.1.1
unist-util-visit-children: 2.0.2
parse5@7.1.2:
dependencies:
entities: 4.5.0
path-browserify@1.0.1: {}
path-exists@4.0.0: {}
path-is-absolute@1.0.1: {}
path-key@3.1.1: {}
path-key@4.0.0: {}
path-parse@1.0.7: {}
path-to-regexp@6.2.2: {}
periscopic@3.1.0:
dependencies:
"@types/estree": 1.0.5
estree-walker: 3.0.3
is-reference: 3.0.2
picocolors@1.0.0: {}
picomatch@2.3.1: {}
pify@2.3.0: {}
pify@4.0.1: {}
pirates@4.0.6: {}
pkg-dir@4.2.0:
dependencies:
find-up: 4.1.0
postcss-attribute-case-insensitive@6.0.3(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-calc@10.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-value-parser: 4.2.0
postcss-clamp@4.1.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-color-functional-notation@6.0.11(postcss@8.4.33):
dependencies:
"@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-color-hex-alpha@9.0.4(postcss@8.4.33):
dependencies:
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-color-rebeccapurple@9.0.3(postcss@8.4.33):
dependencies:
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-colormin@7.0.0(postcss@8.4.33):
dependencies:
browserslist: 4.23.0
caniuse-api: 3.0.0
colord: 2.9.3
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-convert-values@7.0.0(postcss@8.4.33):
dependencies:
browserslist: 4.23.0
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-custom-media@10.0.6(postcss@8.4.33):
dependencies:
"@csstools/cascade-layer-name-parser": 1.0.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/media-query-list-parser": 2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
postcss: 8.4.33
postcss-custom-properties@13.3.10(postcss@8.4.33):
dependencies:
"@csstools/cascade-layer-name-parser": 1.0.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-custom-selectors@7.1.10(postcss@8.4.33):
dependencies:
"@csstools/cascade-layer-name-parser": 1.0.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-dir-pseudo-class@8.0.1(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-discard-comments@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-discard-duplicates@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-discard-empty@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-discard-overridden@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-double-position-gradients@5.0.6(postcss@8.4.33):
dependencies:
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-focus-visible@9.0.1(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-focus-within@8.0.1(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-font-variant@5.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-gap-properties@5.0.1(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-image-set-function@6.0.3(postcss@8.4.33):
dependencies:
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-import@15.1.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.8
postcss-js@4.0.1(postcss@8.4.33):
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.33
postcss-lab-function@6.0.16(postcss@8.4.33):
dependencies:
"@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)
"@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1)
"@csstools/css-tokenizer": 2.3.1
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/utilities": 1.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-load-config@4.0.2(postcss@8.4.31):
dependencies:
lilconfig: 3.0.0
yaml: 2.3.4
optionalDependencies:
postcss: 8.4.31
postcss-load-config@4.0.2(postcss@8.4.33):
dependencies:
lilconfig: 3.0.0
yaml: 2.3.4
optionalDependencies:
postcss: 8.4.33
postcss-logical@7.0.1(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-merge-longhand@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
stylehacks: 7.0.0(postcss@8.4.33)
postcss-merge-rules@7.0.0(postcss@8.4.33):
dependencies:
browserslist: 4.23.0
caniuse-api: 3.0.0
cssnano-utils: 5.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-minify-font-values@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-minify-gradients@7.0.0(postcss@8.4.33):
dependencies:
colord: 2.9.3
cssnano-utils: 5.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-minify-params@7.0.0(postcss@8.4.33):
dependencies:
browserslist: 4.23.0
cssnano-utils: 5.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-minify-selectors@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-nested@6.0.1(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.13
postcss-nested@6.0.1(postcss@8.4.38):
dependencies:
postcss: 8.4.38
postcss-selector-parser: 6.0.13
postcss-nesting@12.1.4(postcss@8.4.33):
dependencies:
"@csstools/selector-resolve-nested": 1.1.0(postcss-selector-parser@6.0.16)
"@csstools/selector-specificity": 3.1.1(postcss-selector-parser@6.0.16)
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-normalize-charset@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-normalize-display-values@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-normalize-positions@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-normalize-repeat-style@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-normalize-string@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-normalize-timing-functions@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-normalize-unicode@7.0.0(postcss@8.4.33):
dependencies:
browserslist: 4.23.0
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-normalize-url@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-normalize-whitespace@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-opacity-percentage@2.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-ordered-values@7.0.0(postcss@8.4.33):
dependencies:
cssnano-utils: 5.0.0(postcss@8.4.33)
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-overflow-shorthand@5.0.1(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-page-break@3.0.4(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-place@9.0.1(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-preset-env@9.5.13(postcss@8.4.33):
dependencies:
"@csstools/postcss-cascade-layers": 4.0.6(postcss@8.4.33)
"@csstools/postcss-color-function": 3.0.16(postcss@8.4.33)
"@csstools/postcss-color-mix-function": 2.0.16(postcss@8.4.33)
"@csstools/postcss-exponential-functions": 1.0.7(postcss@8.4.33)
"@csstools/postcss-font-format-keywords": 3.0.2(postcss@8.4.33)
"@csstools/postcss-gamut-mapping": 1.0.9(postcss@8.4.33)
"@csstools/postcss-gradients-interpolation-method": 4.0.17(postcss@8.4.33)
"@csstools/postcss-hwb-function": 3.0.15(postcss@8.4.33)
"@csstools/postcss-ic-unit": 3.0.6(postcss@8.4.33)
"@csstools/postcss-initial": 1.0.1(postcss@8.4.33)
"@csstools/postcss-is-pseudo-class": 4.0.8(postcss@8.4.33)
"@csstools/postcss-light-dark-function": 1.0.5(postcss@8.4.33)
"@csstools/postcss-logical-float-and-clear": 2.0.1(postcss@8.4.33)
"@csstools/postcss-logical-overflow": 1.0.1(postcss@8.4.33)
"@csstools/postcss-logical-overscroll-behavior": 1.0.1(postcss@8.4.33)
"@csstools/postcss-logical-resize": 2.0.1(postcss@8.4.33)
"@csstools/postcss-logical-viewport-units": 2.0.9(postcss@8.4.33)
"@csstools/postcss-media-minmax": 1.1.6(postcss@8.4.33)
"@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.9(postcss@8.4.33)
"@csstools/postcss-nested-calc": 3.0.2(postcss@8.4.33)
"@csstools/postcss-normalize-display-values": 3.0.2(postcss@8.4.33)
"@csstools/postcss-oklab-function": 3.0.16(postcss@8.4.33)
"@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33)
"@csstools/postcss-relative-color-syntax": 2.0.16(postcss@8.4.33)
"@csstools/postcss-scope-pseudo-class": 3.0.1(postcss@8.4.33)
"@csstools/postcss-stepped-value-functions": 3.0.8(postcss@8.4.33)
"@csstools/postcss-text-decoration-shorthand": 3.0.6(postcss@8.4.33)
"@csstools/postcss-trigonometric-functions": 3.0.8(postcss@8.4.33)
"@csstools/postcss-unset-value": 3.0.1(postcss@8.4.33)
autoprefixer: 10.4.19(postcss@8.4.33)
browserslist: 4.23.0
css-blank-pseudo: 6.0.2(postcss@8.4.33)
css-has-pseudo: 6.0.5(postcss@8.4.33)
css-prefers-color-scheme: 9.0.1(postcss@8.4.33)
cssdb: 8.0.1
postcss: 8.4.33
postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.33)
postcss-clamp: 4.1.0(postcss@8.4.33)
postcss-color-functional-notation: 6.0.11(postcss@8.4.33)
postcss-color-hex-alpha: 9.0.4(postcss@8.4.33)
postcss-color-rebeccapurple: 9.0.3(postcss@8.4.33)
postcss-custom-media: 10.0.6(postcss@8.4.33)
postcss-custom-properties: 13.3.10(postcss@8.4.33)
postcss-custom-selectors: 7.1.10(postcss@8.4.33)
postcss-dir-pseudo-class: 8.0.1(postcss@8.4.33)
postcss-double-position-gradients: 5.0.6(postcss@8.4.33)
postcss-focus-visible: 9.0.1(postcss@8.4.33)
postcss-focus-within: 8.0.1(postcss@8.4.33)
postcss-font-variant: 5.0.0(postcss@8.4.33)
postcss-gap-properties: 5.0.1(postcss@8.4.33)
postcss-image-set-function: 6.0.3(postcss@8.4.33)
postcss-lab-function: 6.0.16(postcss@8.4.33)
postcss-logical: 7.0.1(postcss@8.4.33)
postcss-nesting: 12.1.4(postcss@8.4.33)
postcss-opacity-percentage: 2.0.0(postcss@8.4.33)
postcss-overflow-shorthand: 5.0.1(postcss@8.4.33)
postcss-page-break: 3.0.4(postcss@8.4.33)
postcss-place: 9.0.1(postcss@8.4.33)
postcss-pseudo-class-any-link: 9.0.2(postcss@8.4.33)
postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.33)
postcss-selector-not: 7.0.2(postcss@8.4.33)
postcss-pseudo-class-any-link@9.0.2(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-reduce-initial@7.0.0(postcss@8.4.33):
dependencies:
browserslist: 4.23.0
caniuse-api: 3.0.0
postcss: 8.4.33
postcss-reduce-transforms@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
postcss-replace-overflow-wrap@4.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-not@7.0.2(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-selector-parser@6.0.13:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
postcss-selector-parser@6.0.16:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
postcss-svgo@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-value-parser: 4.2.0
svgo: 3.3.2
postcss-unique-selectors@7.0.0(postcss@8.4.33):
dependencies:
postcss: 8.4.33
postcss-selector-parser: 6.0.16
postcss-value-parser@4.2.0: {}
postcss@8.4.31:
dependencies:
nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.0.2
postcss@8.4.33:
dependencies:
nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.0.2
postcss@8.4.38:
dependencies:
nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.2.0
preferred-pm@3.1.3:
dependencies:
find-up: 5.0.0
find-yarn-workspace-root2: 1.2.16
path-exists: 4.0.0
which-pm: 2.0.0
prismjs@1.29.0: {}
prompts@2.4.2:
dependencies:
kleur: 3.0.3
sisteransi: 1.0.5
property-information@6.4.0: {}
queue-microtask@1.2.3: {}
read-cache@1.0.0:
dependencies:
pify: 2.3.0
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
rehype-expressive-code@0.35.3:
dependencies:
expressive-code: 0.35.3
rehype-format@5.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-embedded: 3.0.0
hast-util-is-element: 3.0.0
hast-util-phrasing: 3.0.1
hast-util-whitespace: 3.0.0
html-whitespace-sensitive-tag-names: 3.0.0
rehype-minify-whitespace: 6.0.0
unist-util-visit-parents: 6.0.1
rehype-minify-whitespace@6.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-embedded: 3.0.0
hast-util-is-element: 3.0.0
hast-util-whitespace: 3.0.0
unist-util-is: 6.0.0
rehype-parse@9.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-from-html: 2.0.1
unified: 11.0.4
rehype-raw@7.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-raw: 9.0.1
vfile: 6.0.1
rehype-stringify@10.0.0:
dependencies:
"@types/hast": 3.0.3
hast-util-to-html: 9.0.0
unified: 11.0.4
rehype@13.0.1:
dependencies:
"@types/hast": 3.0.3
rehype-parse: 9.0.0
rehype-stringify: 10.0.0
unified: 11.0.4
remark-directive@3.0.0:
dependencies:
"@types/mdast": 4.0.3
mdast-util-directive: 3.0.0
micromark-extension-directive: 3.0.0
unified: 11.0.4
transitivePeerDependencies:
- supports-color
remark-gfm@4.0.0:
dependencies:
"@types/mdast": 4.0.3
mdast-util-gfm: 3.0.0
micromark-extension-gfm: 3.0.0
remark-parse: 11.0.0
remark-stringify: 11.0.0
unified: 11.0.4
transitivePeerDependencies:
- supports-color
remark-mdx@3.0.0:
dependencies:
mdast-util-mdx: 3.0.0
micromark-extension-mdxjs: 3.0.0
transitivePeerDependencies:
- supports-color
remark-parse@11.0.0:
dependencies:
"@types/mdast": 4.0.3
mdast-util-from-markdown: 2.0.0
micromark-util-types: 2.0.0
unified: 11.0.4
transitivePeerDependencies:
- supports-color
remark-rehype@11.1.0:
dependencies:
"@types/hast": 3.0.3
"@types/mdast": 4.0.3
mdast-util-to-hast: 13.0.2
unified: 11.0.4
vfile: 6.0.1
remark-smartypants@2.0.0:
dependencies:
retext: 8.1.0
retext-smartypants: 5.2.0
unist-util-visit: 4.1.2
remark-stringify@11.0.0:
dependencies:
"@types/mdast": 4.0.3
mdast-util-to-markdown: 2.1.0
unified: 11.0.4
request-light@0.7.0: {}
require-directory@2.1.1: {}
resolve@1.22.8:
dependencies:
is-core-module: 2.13.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
restore-cursor@4.0.0:
dependencies:
onetime: 5.1.2
signal-exit: 3.0.7
retext-latin@3.1.0:
dependencies:
"@types/nlcst": 1.0.4
parse-latin: 5.0.1
unherit: 3.0.1
unified: 10.1.2
retext-smartypants@5.2.0:
dependencies:
"@types/nlcst": 1.0.4
nlcst-to-string: 3.1.1
unified: 10.1.2
unist-util-visit: 4.1.2
retext-stringify@3.1.0:
dependencies:
"@types/nlcst": 1.0.4
nlcst-to-string: 3.1.1
unified: 10.1.2
retext@8.1.0:
dependencies:
"@types/nlcst": 1.0.4
retext-latin: 3.1.0
retext-stringify: 3.1.0
unified: 10.1.2
reusify@1.0.4: {}
rollup@4.17.2:
dependencies:
"@types/estree": 1.0.5
optionalDependencies:
"@rollup/rollup-android-arm-eabi": 4.17.2
"@rollup/rollup-android-arm64": 4.17.2
"@rollup/rollup-darwin-arm64": 4.17.2
"@rollup/rollup-darwin-x64": 4.17.2
"@rollup/rollup-linux-arm-gnueabihf": 4.17.2
"@rollup/rollup-linux-arm-musleabihf": 4.17.2
"@rollup/rollup-linux-arm64-gnu": 4.17.2
"@rollup/rollup-linux-arm64-musl": 4.17.2
"@rollup/rollup-linux-powerpc64le-gnu": 4.17.2
"@rollup/rollup-linux-riscv64-gnu": 4.17.2
"@rollup/rollup-linux-s390x-gnu": 4.17.2
"@rollup/rollup-linux-x64-gnu": 4.17.2
"@rollup/rollup-linux-x64-musl": 4.17.2
"@rollup/rollup-win32-arm64-msvc": 4.17.2
"@rollup/rollup-win32-ia32-msvc": 4.17.2
"@rollup/rollup-win32-x64-msvc": 4.17.2
fsevents: 2.3.3
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
sax@1.3.0: {}
section-matter@1.0.0:
dependencies:
extend-shallow: 2.0.1
kind-of: 6.0.3
semver@6.3.1: {}
semver@7.5.4:
dependencies:
lru-cache: 6.0.0
semver@7.6.2: {}
sharp@0.33.4:
dependencies:
color: 4.2.3
detect-libc: 2.0.3
semver: 7.6.2
optionalDependencies:
"@img/sharp-darwin-arm64": 0.33.4
"@img/sharp-darwin-x64": 0.33.4
"@img/sharp-libvips-darwin-arm64": 1.0.2
"@img/sharp-libvips-darwin-x64": 1.0.2
"@img/sharp-libvips-linux-arm": 1.0.2
"@img/sharp-libvips-linux-arm64": 1.0.2
"@img/sharp-libvips-linux-s390x": 1.0.2
"@img/sharp-libvips-linux-x64": 1.0.2
"@img/sharp-libvips-linuxmusl-arm64": 1.0.2
"@img/sharp-libvips-linuxmusl-x64": 1.0.2
"@img/sharp-linux-arm": 0.33.4
"@img/sharp-linux-arm64": 0.33.4
"@img/sharp-linux-s390x": 0.33.4
"@img/sharp-linux-x64": 0.33.4
"@img/sharp-linuxmusl-arm64": 0.33.4
"@img/sharp-linuxmusl-x64": 0.33.4
"@img/sharp-wasm32": 0.33.4
"@img/sharp-win32-ia32": 0.33.4
"@img/sharp-win32-x64": 0.33.4
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
shebang-regex@3.0.0: {}
shiki@1.5.2:
dependencies:
"@shikijs/core": 1.5.2
signal-exit@3.0.7: {}
signal-exit@4.1.0: {}
simple-swizzle@0.2.2:
dependencies:
is-arrayish: 0.3.2
sisteransi@1.0.5: {}
sitemap@7.1.1:
dependencies:
"@types/node": 17.0.45
"@types/sax": 1.2.7
arg: 5.0.2
sax: 1.3.0
source-map-js@1.0.2: {}
source-map-js@1.2.0: {}
source-map@0.7.4: {}
space-separated-tokens@2.0.2: {}
sprintf-js@1.0.3: {}
stdin-discarder@0.2.2: {}
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
string-width@5.1.2:
dependencies:
eastasianwidth: 0.2.0
emoji-regex: 9.2.2
strip-ansi: 7.1.0
string-width@7.1.0:
dependencies:
emoji-regex: 10.3.0
get-east-asian-width: 1.2.0
strip-ansi: 7.1.0
stringify-entities@4.0.3:
dependencies:
character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
strip-ansi@7.1.0:
dependencies:
ansi-regex: 6.0.1
strip-bom-string@1.0.0: {}
strip-bom@3.0.0: {}
strip-final-newline@3.0.0: {}
style-to-object@0.4.4:
dependencies:
inline-style-parser: 0.1.1
style-to-object@1.0.5:
dependencies:
inline-style-parser: 0.2.2
stylehacks@7.0.0(postcss@8.4.33):
dependencies:
browserslist: 4.23.0
postcss: 8.4.33
postcss-selector-parser: 6.0.16
sucrase@3.34.0:
dependencies:
"@jridgewell/gen-mapping": 0.3.3
commander: 4.1.1
glob: 7.1.6
lines-and-columns: 1.2.4
mz: 2.7.0
pirates: 4.0.6
ts-interface-checker: 0.1.13
supports-color@5.5.0:
dependencies:
has-flag: 3.0.0
supports-preserve-symlinks-flag@1.0.0: {}
svgo@3.3.2:
dependencies:
"@trysound/sax": 0.2.0
commander: 7.2.0
css-select: 5.1.0
css-tree: 2.3.1
css-what: 6.1.0
csso: 5.0.5
picocolors: 1.0.0
tailwindcss@3.4.3:
dependencies:
"@alloc/quick-lru": 5.2.0
arg: 5.0.2
chokidar: 3.5.3
didyoumean: 1.2.2
dlv: 1.1.3
fast-glob: 3.3.2
glob-parent: 6.0.2
is-glob: 4.0.3
jiti: 1.21.0
lilconfig: 2.1.0
micromatch: 4.0.5
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.0.0
postcss: 8.4.33
postcss-import: 15.1.0(postcss@8.4.33)
postcss-js: 4.0.1(postcss@8.4.33)
postcss-load-config: 4.0.2(postcss@8.4.33)
postcss-nested: 6.0.1(postcss@8.4.33)
postcss-selector-parser: 6.0.13
resolve: 1.22.8
sucrase: 3.34.0
transitivePeerDependencies:
- ts-node
thenify-all@1.6.0:
dependencies:
thenify: 3.3.1
thenify@3.3.1:
dependencies:
any-promise: 1.3.0
to-fast-properties@2.0.0: {}
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
trim-lines@3.0.1: {}
trough@2.1.0: {}
ts-interface-checker@0.1.13: {}
tsconfck@3.0.3(typescript@5.4.5):
optionalDependencies:
typescript: 5.4.5
tslib@2.6.2:
optional: true
type-fest@2.19.0: {}
typesafe-path@0.2.2: {}
typescript-auto-import-cache@0.3.2:
dependencies:
semver: 7.5.4
typescript@5.4.5: {}
unherit@3.0.1: {}
unified@10.1.2:
dependencies:
"@types/unist": 2.0.10
bail: 2.0.2
extend: 3.0.2
is-buffer: 2.0.5
is-plain-obj: 4.1.0
trough: 2.1.0
vfile: 5.3.7
unified@11.0.4:
dependencies:
"@types/unist": 3.0.2
bail: 2.0.2
devlop: 1.1.0
extend: 3.0.2
is-plain-obj: 4.1.0
trough: 2.1.0
vfile: 6.0.1
unist-util-find-after@5.0.0:
dependencies:
"@types/unist": 3.0.2
unist-util-is: 6.0.0
unist-util-is@5.2.1:
dependencies:
"@types/unist": 2.0.10
unist-util-is@6.0.0:
dependencies:
"@types/unist": 3.0.2
unist-util-modify-children@3.1.1:
dependencies:
"@types/unist": 2.0.10
array-iterate: 2.0.1
unist-util-position-from-estree@2.0.0:
dependencies:
"@types/unist": 3.0.2
unist-util-position@5.0.0:
dependencies:
"@types/unist": 3.0.2
unist-util-remove-position@5.0.0:
dependencies:
"@types/unist": 3.0.2
unist-util-visit: 5.0.0
unist-util-stringify-position@3.0.3:
dependencies:
"@types/unist": 2.0.10
unist-util-stringify-position@4.0.0:
dependencies:
"@types/unist": 3.0.2
unist-util-visit-children@2.0.2:
dependencies:
"@types/unist": 2.0.10
unist-util-visit-parents@5.1.3:
dependencies:
"@types/unist": 2.0.10
unist-util-is: 5.2.1
unist-util-visit-parents@6.0.1:
dependencies:
"@types/unist": 3.0.2
unist-util-is: 6.0.0
unist-util-visit@4.1.2:
dependencies:
"@types/unist": 2.0.10
unist-util-is: 5.2.1
unist-util-visit-parents: 5.1.3
unist-util-visit@5.0.0:
dependencies:
"@types/unist": 3.0.2
unist-util-is: 6.0.0
unist-util-visit-parents: 6.0.1
update-browserslist-db@1.0.13(browserslist@4.23.0):
dependencies:
browserslist: 4.23.0
escalade: 3.1.1
picocolors: 1.0.0
util-deprecate@1.0.2: {}
vfile-location@5.0.2:
dependencies:
"@types/unist": 3.0.2
vfile: 6.0.1
vfile-message@3.1.4:
dependencies:
"@types/unist": 2.0.10
unist-util-stringify-position: 3.0.3
vfile-message@4.0.2:
dependencies:
"@types/unist": 3.0.2
unist-util-stringify-position: 4.0.0
vfile@5.3.7:
dependencies:
"@types/unist": 2.0.10
is-buffer: 2.0.5
unist-util-stringify-position: 3.0.3
vfile-message: 3.1.4
vfile@6.0.1:
dependencies:
"@types/unist": 3.0.2
unist-util-stringify-position: 4.0.0
vfile-message: 4.0.2
vite@5.2.11:
dependencies:
esbuild: 0.20.2
postcss: 8.4.38
rollup: 4.17.2
optionalDependencies:
fsevents: 2.3.3
vitefu@0.2.5(vite@5.2.11):
optionalDependencies:
vite: 5.2.11
volar-service-css@0.0.45(@volar/language-service@2.2.4):
dependencies:
vscode-css-languageservice: 6.2.10
vscode-languageserver-textdocument: 1.0.11
vscode-uri: 3.0.8
optionalDependencies:
"@volar/language-service": 2.2.4
volar-service-emmet@0.0.45(@volar/language-service@2.2.4):
dependencies:
"@emmetio/css-parser": 0.4.0
"@emmetio/html-matcher": 1.3.0
"@vscode/emmet-helper": 2.9.2
optionalDependencies:
"@volar/language-service": 2.2.4
volar-service-html@0.0.45(@volar/language-service@2.2.4):
dependencies:
vscode-html-languageservice: "@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462"
vscode-languageserver-textdocument: 1.0.11
vscode-uri: 3.0.8
optionalDependencies:
"@volar/language-service": 2.2.4
volar-service-prettier@0.0.45(@volar/language-service@2.2.4):
dependencies:
vscode-uri: 3.0.8
optionalDependencies:
"@volar/language-service": 2.2.4
volar-service-typescript-twoslash-queries@0.0.45(@volar/language-service@2.2.4):
optionalDependencies:
"@volar/language-service": 2.2.4
volar-service-typescript@0.0.45(@volar/language-service@2.2.4):
dependencies:
path-browserify: 1.0.1
semver: 7.5.4
typescript-auto-import-cache: 0.3.2
vscode-languageserver-textdocument: 1.0.11
vscode-nls: 5.2.0
optionalDependencies:
"@volar/language-service": 2.2.4
vscode-css-languageservice@6.2.10:
dependencies:
"@vscode/l10n": 0.0.16
vscode-languageserver-textdocument: 1.0.11
vscode-languageserver-types: 3.17.5
vscode-uri: 3.0.8
vscode-html-languageservice@5.2.0:
dependencies:
"@vscode/l10n": 0.0.18
vscode-languageserver-textdocument: 1.0.11
vscode-languageserver-types: 3.17.5
vscode-uri: 3.0.8
vscode-jsonrpc@8.2.0: {}
vscode-languageserver-protocol@3.17.5:
dependencies:
vscode-jsonrpc: 8.2.0
vscode-languageserver-types: 3.17.5
vscode-languageserver-textdocument@1.0.11: {}
vscode-languageserver-types@3.17.5: {}
vscode-languageserver@9.0.1:
dependencies:
vscode-languageserver-protocol: 3.17.5
vscode-nls@5.2.0: {}
vscode-uri@2.1.2: {}
vscode-uri@3.0.8: {}
web-namespaces@2.0.1: {}
which-pm-runs@1.1.0: {}
which-pm@2.0.0:
dependencies:
load-yaml-file: 0.2.0
path-exists: 4.0.0
which-pm@2.1.1:
dependencies:
load-yaml-file: 0.2.0
path-exists: 4.0.0
which@2.0.2:
dependencies:
isexe: 2.0.0
widest-line@4.0.1:
dependencies:
string-width: 5.1.2
wrap-ansi@7.0.0:
dependencies:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi@8.1.0:
dependencies:
ansi-styles: 6.2.1
string-width: 5.1.2
strip-ansi: 7.1.0
wrappy@1.0.2: {}
y18n@5.0.8: {}
yallist@3.1.1: {}
yallist@4.0.0: {}
yaml@2.3.4: {}
yargs-parser@21.1.1: {}
yargs@17.7.2:
dependencies:
cliui: 8.0.1
escalade: 3.1.1
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
y18n: 5.0.8
yargs-parser: 21.1.1
yocto-queue@0.1.0: {}
yocto-queue@1.0.0: {}
zod-to-json-schema@3.23.0(zod@3.23.8):
dependencies:
zod: 3.23.8
zod@3.22.4: {}
zod@3.23.8: {}
zwitch@2.0.4: {}

10
docs/postcss.config.cjs Normal file
View file

@ -0,0 +1,10 @@
module.exports = {
plugins: [
require("autoprefixer"),
require("cssnano"),
require("postcss-preset-env")({
stage: 3,
features: { "nesting-rules": false },
}),
],
};

View file

@ -1,5 +0,0 @@
/* eslint-disable */
module.exports = {
plugins: [require("tailwindcss")],
};

View file

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before After
Before After

View file

@ -1,7 +1,13 @@
public
contributing
getting-started
index.md
fr
pt-BR
nn-NO
assets
styles
env.d.ts
content/config.ts
content/docs/en
content/docs/ca
content/docs/de
content/docs/es
content/docs/fr
content/docs/nn-no
content/docs/pt-br
content/docs/sr-latn
content/docs/zh-hans

View file

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

View file

@ -1,300 +0,0 @@
---
sidebarDepth: 2
---
# Welcome 👋
[![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![contributions-badge]][contributions]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![crowdin-badge]][crowdin]&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.
<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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## 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&nbsp;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&nbsp;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&nbsp;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 other podcasting solutions:
- 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&nbsp;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/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be&nbsp;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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑‍🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt="Benjamin Bellamy"/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ola Hneini"/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Romain de Laage"/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Cécile Ricordeau"/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Miś"/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="cExplorer"/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="ImaCrea"/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Delhaye Cyrille"/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt="João Leandro"/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt="Lucian I. Last"/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt="LuuzViir"/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt="bendaha"/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt="Samuel Roland"/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/leonfrom"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="leonfrom"/><br /><sub><b>leonfrom</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/agentcobra57"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="agentcobra"/><br /><sub><b>agentcobra</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KrzysztofDomanczyk"><img src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100" width="100px;" alt="KrzysztofDomanczyk"/><br /><sub><b>KrzysztofDomanczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/NeoluxConsulting"><img src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100" width="100px;" alt="Guy Martin"/><br /><sub><b>Guy Martin</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
<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>
</div>
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social
[release]: https://code.castopod.org/adaures/castopod/-/releases
[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md
[contributions]: https://code.castopod.org/adaures/castopod/-/issues
[semantic-release]: https://github.com/semantic-release/semantic-release
[discord]: https://castopod.org/discord
[stars]: https://github.com/ad-aures/castopod/stargazers
[crowdin]: https://translate.castopod.org/project/castopod

View file

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Before After
Before After

View file

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 261 50">
<style>
@media (prefers-color-scheme: dark) {
svg { background-color: white; }
}
</style>
<g clip-path="url(#a)"><path fill="#2A2D7C" d="M96.9 15.975v22.95h-6.1l-.675-1.625a10.875 10.875 0 0 1-6.925 2.5 11.699 11.699 0 0 1-12.05-12.3A11.65 11.65 0 0 1 83.2 15.35c2.554-.01 5.03.874 7 2.5l.825-1.775 5.875-.1Zm-7.5 11.5a5.15 5.15 0 1 0-10.275 0 5.15 5.15 0 1 0 10.275 0Zm36.725-19.75V38.95h-5.85l-.75-1.7a10.549 10.549 0 0 1-6.925 2.5 11.702 11.702 0 0 1-12.1-12.25 11.699 11.699 0 0 1 12.1-12.25c2.013-.018 3.99.537 5.7 1.6V7.725h7.825ZM118.8 27.5a5.152 5.152 0 0 0-5.137-5.509 5.151 5.151 0 0 0-5.138 5.509 5.152 5.152 0 0 0 5.138 5.509A5.15 5.15 0 0 0 118.8 27.5Zm45.925-11.525v22.95h-6.1L158 37.3a10.823 10.823 0 0 1-6.925 2.5A11.677 11.677 0 0 1 139 27.5a11.61 11.61 0 0 1 .763-4.706 11.612 11.612 0 0 1 6.564-6.633 11.626 11.626 0 0 1 4.698-.811 10.87 10.87 0 0 1 7 2.5l.825-1.775 5.875-.1Zm-7.5 11.5a5.152 5.152 0 0 0-5.137-5.509 5.151 5.151 0 0 0-5.138 5.509 5.152 5.152 0 0 0 5.138 5.509 5.15 5.15 0 0 0 5.137-5.509Zm12.2 1.625V16h7.9v12.75c0 2.5 1.3 3.85 3.425 3.85s3.375-1.45 3.375-3.85V16h7.9v13.1c0 6.425-4.5 10.6-11.275 10.6s-11.325-4.175-11.325-10.6Zm42.225-13.2v7.225h-3.075c-2.8 0-3.975 1.225-3.975 4.15V38.95h-7.9V16h5.3l1.225 2.5a7.675 7.675 0 0 1 6.325-2.65l2.1.05ZM238 27.275a14.703 14.703 0 0 1-.15 2.075H220.7a4.476 4.476 0 0 0 4.8 4 4.628 4.628 0 0 0 4.15-2.15h7.85a12.497 12.497 0 0 1-13.868 8.866A12.5 12.5 0 0 1 213 27.5a12.5 12.5 0 1 1 25-.2v-.025ZM220.85 25h9.275a4.6 4.6 0 0 0-4.625-3.55 4.425 4.425 0 0 0-4.65 3.55Zm29.5 14.7c-6.25 0-10-3.3-10-8.275h7.5a2.347 2.347 0 0 0 1.638 2.415 2.35 2.35 0 0 0 1.037.085c1.15 0 2.25-.575 2.25-1.775s-1.725-1.7-3.925-2.05c-3.6-.625-8.35-1.7-8.35-7.275 0-4.6 3.925-7.5 9.8-7.5 5.875 0 9.65 3.125 9.725 7.775h-7.5c0-1.475-.975-2.15-2.5-2.15s-2.125.625-2.125 1.675 1.75 1.625 3.925 2c3.625.65 8.45 1.4 8.45 7.225 0 4.8-4.05 7.925-10.15 7.925l.225-.075ZM.5 0v50h50V0H.5Zm33.35 31.65a9.6 9.6 0 0 1-6.275 9 9.75 9.75 0 0 1-3.325.6 9.6 9.6 0 0 1-3.325-18.6 2.5 2.5 0 0 1 3.3 1.525A2.5 2.5 0 0 1 22.7 27.5a4.454 4.454 0 0 0 3.1 8.35 4.4 4.4 0 0 0 2.9-4.175v-13.7a4.1 4.1 0 0 0-8.2 0 2.5 2.5 0 0 1-5 0 9.225 9.225 0 0 1 18.45 0l-.1 13.675Z"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h260v50H0z" transform="translate(.5)"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.1 KiB

View file

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

View file

@ -1,87 +0,0 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Rolloù an istañs
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| roll | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podkaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Aotreoù war an istañs
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| aotre | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Gallout a ra enporzhiañ podkastoù. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| roll | description | permissions |
| ---------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Merour·ez | Has complete control of podcast #{id}. | \* |
| Embanner | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Aozer·ez | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Kouviad·ez | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| aotre | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View file

@ -1,300 +0,0 @@
---
sidebarDepth: 2
---
# Donemat 👋
[![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![contributions-badge]][contributions]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![crowdin-badge]][crowdin]&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.
<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">Staliañ<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>
## Perzhioù
- 🌱 &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;Arc'hantaouiñ :
- 🔗 &nbsp;Funding links
- 📲 &nbsp;listen-to-click ads
- 🤝 &nbsp;value4value / WebMonetization
- 💎 &nbsp;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## Perak Castopod ?
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&nbsp;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&nbsp;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&nbsp;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 other podcasting solutions:
- 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&nbsp;started.
### Kod an dereadegezh
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/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be&nbsp;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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑‍🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt="Benjamin Bellamy"/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ola Hneini"/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Romain de Laage"/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Cécile Ricordeau"/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Miś"/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="cExplorer"/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="ImaCrea"/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Delhaye Cyrille"/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt="João Leandro"/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt="Lucian I. Last"/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt="LuuzViir"/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt="bendaha"/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt="Samuel Roland"/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/leonfrom"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="leonfrom"/><br /><sub><b>leonfrom</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/agentcobra57"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="agentcobra"/><br /><sub><b>agentcobra</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KrzysztofDomanczyk"><img src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100" width="100px;" alt="KrzysztofDomanczyk"/><br /><sub><b>KrzysztofDomanczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/NeoluxConsulting"><img src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100" width="100px;" alt="Guy Martin"/><br /><sub><b>Guy Martin</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## Darempred
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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
<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>
</div>
## Aotre
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social
[release]: https://code.castopod.org/adaures/castopod/-/releases
[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md
[contributions]: https://code.castopod.org/adaures/castopod/-/issues
[semantic-release]: https://github.com/semantic-release/semantic-release
[discord]: https://castopod.org/discord
[stars]: https://github.com/ad-aures/castopod/stargazers
[crowdin]: https://translate.castopod.org/project/castopod

View file

@ -1,302 +0,0 @@
---
sidebarDepth: 2
---
# Benvinguts 👋
[![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![contributions-badge]][contributions]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![crowdin-badge]][crowdin]&nbsp;[![discord-badge]][discord]&nbsp;[![stars-badge]][stars]
Castopod és una plataforma d'allotjament gratuïta i de codi obert creada per a
podcasters que volen involucrar i interactuar amb el seu públic.
Castopod és fàcil d'instal·lar i s'ha creat amb
[CodeIgniter4](https://codeigniter.com/), un marc PHP potent amb una empremta
molt petita.
<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">Instal·lar<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>
## Característiques
- 🌱 &nbsp;Gratis i de codi obert (llicència AGPL v3)
- 🔐 &nbsp;Centrat en la sobirania de les dades: el vostre contingut, audiència
i estadístiques us pertanyen, i només a vosaltres
- 🪄 &nbsp;Funcions de podcasting 2.0: GUID, bloqueigos, transcripcions,
finançament, capítols, geo-localització, persones, fragments d'àudio, …
- 💬 &nbsp;Xarxa social integrada:
- 🚀 &nbsp;Castopod forma part de Fediverse, una xarxa social descentralitzada
- ❤️ &nbsp;Creeu publicacions, compartiu-les, afegiu-hi com a preferits i
comenteu episodis
- 📈 &nbsp;Estadístiques integrades:
- ⚖️ &nbsp;Complint amb GDPR / CCPA / LGPD
- 🪙 &nbsp;Mesura d'audiència segons l'estàndard IABv2
- 🏡 &nbsp;Estadístiques locals, sense cap tercer implicat
- 📢 &nbsp;Eines de màrqueting integrades:
- ✅ &nbsp;Preparada per a SEO (metaetiquetes de gràfics oberts, JSON-LD, …)
- 📱 &nbsp;PWA: instal·lable pels oients com a aplicació autònoma
- 🎨 &nbsp;Colors del tema personalitzables
- 🎬 &nbsp;Genereu videoclips d'episodis preparats per compartir
- 🔉 &nbsp;Genera fragments d'àudio de cada episodi
- ▶️ &nbsp;Reproductor incrustable, per incrustar els episodis a qualsevol
lloc web
- 💸 &nbsp;Monetització:
- 🔗 &nbsp;Enllaços de finançament
- 📲 &nbsp;Anuncis per escoltar-fent-clic
- 🤝 &nbsp;Integració amb value4value i WebMonetization
- 💎 &nbsp;Premium podcasts
- 📡 &nbsp;Publiqueu els vostres episodis a tot arreu amb RSS:
- 📱 &nbsp;A tots els directoris i aplicacions: Podcast Index, Apple Podcasts,
Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Emeteu els vostres episodis a l'instant amb WebSub
- 📥 &nbsp;Importació de podcasts: moveu el vostre podcast existent a Castopod
- 📤 &nbsp;Traieu el vostre podcast fora de Castopod
- 🔀 &nbsp;Multi-podcast: allotgeu tants programes com vulgueu en un mateix lloc
- 👥 &nbsp;Multi-usuari: afegiu col·laboradors i definiu rols
- 🌎 &nbsp;Suport i18n: traduït a l'anglès, català, espanyol, xinès, francès,
polonès, alemany, portuguès brasiler ... i
[més per venir](https://translate.castopod.org)!
## Motivació
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.
## Comparació amb altres solucions
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&nbsp;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&nbsp;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&nbsp;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 altres plataformes de podcast
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 other podcasting solutions:
- Castopod es pot auto-allotjar i és la única solució que us permet mantenir el
control total sobre el que produïu. A més, com que és de codi obert, fins i
tot podeu personalitzar-lo com vulgueu.
- Castopod és l'única solució que actualment integra tant una xarxa social
descentralitzada amb ActivityPub com moltes de les funcions de podcasting 2.0,
amb l'esperança de salvar la bretxa entre les dues.
## Col·laborar
Love Castopod and would like to help? Take a look at the following documentation
to get you&nbsp;started.
### Codi de conducta
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/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be&nbsp;tolerated.
### Guia de col·laboració
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.
## Col·laboradors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑‍🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt="Benjamin Bellamy"/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ola Hneini"/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Romain de Laage"/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Cécile Ricordeau"/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Miś"/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="cExplorer"/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="ImaCrea"/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Delhaye Cyrille"/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt="João Leandro"/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt="Lucian I. Last"/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt="LuuzViir"/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt="bendaha"/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt="Samuel Roland"/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/leonfrom"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="leonfrom"/><br /><sub><b>leonfrom</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/agentcobra57"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="agentcobra"/><br /><sub><b>agentcobra</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KrzysztofDomanczyk"><img src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100" width="100px;" alt="KrzysztofDomanczyk"/><br /><sub><b>KrzysztofDomanczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/NeoluxConsulting"><img src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100" width="100px;" alt="Guy Martin"/><br /><sub><b>Guy Martin</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## Contacte
You may reach us for help or ask any question you have on:
- [Discord](https://castopod.org/discord) (per a la interacció directa amb
desenvolupadors i la comunitat)
- [Seguiment d'incidències](https://code.castopod.org/adaures/castopod/-/issues)
(per a sol·licituds de noves funcionalitats i informes d'errors)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (instància de Mastodon)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Patrocinadors
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
<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>
</div>
## Llicència
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social
[release]: https://code.castopod.org/adaures/castopod/-/releases
[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md
[contributions]: https://code.castopod.org/adaures/castopod/-/issues
[semantic-release]: https://github.com/semantic-release/semantic-release
[discord]: https://castopod.org/discord
[stars]: https://github.com/ad-aures/castopod/stargazers
[crowdin]: https://translate.castopod.org/project/castopod

View file

@ -0,0 +1,7 @@
import { defineCollection } from "astro:content";
import { docsSchema, i18nSchema } from "@astrojs/starlight/schema";
export const collections = {
docs: defineCollection({ schema: docsSchema() }),
i18n: defineCollection({ type: "data", schema: i18nSchema() }),
};

View file

@ -0,0 +1,85 @@
---
title: Autenticação & Autorização
---
Castopod lida com autenticação e autorização usando `codeigniter/shield`
juntamente com regras personalizadas. Papéis e permissões são definidos em dois
níveis:
1. [toda instância](#1-instance-wide-roles-and-permissions)
2. [por podcast](#2-per-podcast-roles-and-permissions)
## Papéis e permissões para toda a instância
### Cargos de instância
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Permissões da instância
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Por funções de podcast e permissões
### Por cargos de podcast
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Por permissões de podcast
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Official Docker images
sidebarDepth: 3
---
# Official Docker images
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:

View file

@ -1,21 +1,20 @@
---
title: Inštalácia
sidebarDepth: 3
title: How to install Castopod?
---
# How to install Castopod?
import { Aside } from "@astrojs/starlight/components";
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.
::: tip Note
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
:::
</Aside>
## Requirements
@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP:
> We recommend using [MariaDB](https://mariadb.org).
::: warning 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.
@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed:
2. Follow the instructions on your screen.
3. Začať podcastovať!
::: info Note
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
:::
</Aside>
### Using CLI
@ -226,13 +217,35 @@ 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
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>
<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>

View file

@ -2,8 +2,6 @@
title: Zabezpečenie
---
# 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).

View file

@ -1,9 +1,8 @@
---
title: Update
sidebarDepth: 3
title: How to update Castopod?
---
# How to update Castopod?
import { Aside } from "@astrojs/starlight/components";
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
@ -36,12 +35,12 @@ improvements ⚡.
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
@ -54,7 +53,7 @@ improvements ⚡.
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
@ -62,7 +61,7 @@ Releases may come with additional update instructions (see
- 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)
:::
</Aside>
## Fully Automated updates

View file

@ -0,0 +1,1381 @@
---
title: Donemat 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Staliañ" href="./getting-started/install" />
## Perzhioù
- 🌱 &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;Arc'hantaouiñ :
- 🔗 &nbsp;Funding links
- 📲 &nbsp;listen-to-click ads
- 🤝 &nbsp;value4value / WebMonetization
- 💎 &nbsp;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## Perak Castopod ?
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 other podcasting solutions:
- 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.
### Kod an dereadegezh
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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## Darempred
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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## Aotre
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,84 @@
---
title: Authentication & Authorization
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| --------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------ |
| Dreistmerour·ez | Ur c'hontroll klok en deus war Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Merour·ez | Merañ a ra endalc'had Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podkaster | Implijerien·ezed kustum Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------------------------------------- |
| admin.access | Gallout a ra gwelet taolenn-stur Castopod. |
| admin.settings | Gallout a ra gwelet arventennoù Castopod. |
| users.manage | Gallout a ra ober war-dro implijerien·ezed Castopod. |
| persons.manage | Gallout a ra merañ an emellerien·ezed. |
| pages.manage | Gallout a ra merañ ar pajennoù. |
| podcasts.view | Gallout a ra gwelet an holl bodkastoù. |
| podcasts.create | Gallout a ra krouiñ podkastoù nevez. |
| podcasts.import | Gallout a ra enporzhiañ podkastoù. |
| fediverse.manage-blocks | Gallout a ra mirout aktourien·ezed pe domanioù ar Fediverse ouzh kaout darempredoù gant Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ---------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Merour·ez | Ur c'hontroll klok en deus war ar podkast #\{id\}. | \* |
| Embanner | Merañ a ra endalc'had hag embannadurioù ar podkast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Aozer·ez | Merañ a ra endalc'had ar podkast #\{id\} met ne c'hall ket embann anezho. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Kouviad·ez | Perzhiad·ez eus ar podkast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| view | Gallout a ra gwelet taolenn-stur ha muzulioù heklev ar podkast #\{id\}. |
| edit | Gallout a ra kemmañ ar podkast #\{id\}. |
| delete | Gallout a ra lemel ar podkast #\{id\}. |
| manage-import | Gallout a ra sinkronekaat ar podkast enporzhiet #\{id\}. |
| manage-persons | Gallout a ra merañ koumanantoù ar podkast #\{id\}. |
| manage-subscriptions | Gallout a ra merañ koumanantoù ar podkast #\{id\}. |
| manage-contributors | Gallout a ra merañ perzhidi ha perzhiadezed ar podkast #\{id\}. |
| manage-platforms | Gallout a ra ouzhpennañ pe lemel liammoù etrezek savennoù diavaez evit ar podkast #\{id\}. |
| manage-publications | Gallout a ra embann ar podkast #\{id\}. |
| manage-notifications | Gallout a ra gwelet kemennoù ar podkast #\{id\} ha lakaat anezho evel lennet. |
| interact-as | Gallout a ra ober traoù gant identelezh ar podkast #\{id\}: ouzhpennañ ur gemennadenn d'ar re garetañ, rannañ anezhi pe respont dezhi. |
| episodes.view | Gallout a ra gwelet taolennoù-stur ha muzulioù heklev rannoù ar podkast #\{id\}. |
| episodes.create | Gallout a ra krouiñ rannoù evit podkast #\{id\}. |
| episodes.edit | Gallout a ra kemmañ rannoù ar podkast #\{id\}. |
| episodes.delete | Gallout a ra lemel rannoù ar podkast #\{id\}. |
| episodes.manage-persons | Gallout a ra merañ emellerien·ezed ar podkast #\{id\}. |
| episodes.manage-clips | Gallout a ra merañ klipoù video pe tennadoù son ar podkast #\{id\}. |
| episodes.manage-publications | Gallout a ra embann pe diembann rannoù ha kemennadennoù ar podkast #\{id\}. |
| episodes.manage-comments | Gallout a ra krouiñ/lemel evezhiadennoù evit rannoù ar podkast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Official Docker images
sidebarDepth: 3
---
# Official Docker images
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:

View file

@ -1,21 +1,20 @@
---
title: Staliañ
sidebarDepth: 3
title: Penaos staliañ Castopod?
---
# Penaos staliañ Castopod?
import { Aside } from "@astrojs/starlight/components";
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.
::: tip Note
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
:::
</Aside>
## Requirements
@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP:
> We recommend using [MariaDB](https://mariadb.org).
::: warning 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.
@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed:
2. Follow the instructions on your screen.
3. Kregiñ da bodkastiñ!
::: info Note
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
:::
</Aside>
### Using CLI
@ -226,13 +217,35 @@ 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
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>
<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>

View file

@ -1,9 +1,7 @@
---
title: Bezbednost
title: Bezbednosni interesi
---
# Bezbednosni interesi
Castopod je napravljen na [CodeIgniter4](https://codeigniter.com/), PHP okviru
koji podstiče
[dobre bezbednosne prakse](https://codeigniter.com/user_guide/concepts/security.html).

View file

@ -1,9 +1,8 @@
---
title: Update
sidebarDepth: 3
title: How to update Castopod?
---
# How to update Castopod?
import { Aside } from "@astrojs/starlight/components";
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
@ -36,12 +35,12 @@ improvements ⚡.
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
@ -54,7 +53,7 @@ improvements ⚡.
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
@ -62,7 +61,7 @@ Releases may come with additional update instructions (see
- 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)
:::
</Aside>
## Fully Automated updates

View file

@ -0,0 +1,1381 @@
---
title: Welcome 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Install" href="./getting-started/install" />
## 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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## Motivácia
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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,84 @@
---
title: Autenticació i Autorització
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------ |
| Super administrador | Té control complet sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Administrador | Administra el contingut de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | Usos generals de Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | -------------------------------------------------------------------- |
| admin.access | Pot accedir a l'àrea d'administració de Castopod. |
| admin.settings | Pot accedir a la configuració de Castopod. |
| users.manage | Pot administrar els usuaris de Castopod. |
| persons.manage | Pot administrar persones. |
| pages.manage | Pot administrar pàgines. |
| podcasts.view | Pot veure els pòdcasts. |
| podcasts.create | Pot crear nous pòdcasts. |
| podcasts.import | Pot importar pòdcasts. |
| fediverse.manage-blocks | Pot evitar que actors/dominis del fedivers interactuen amb Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Administrador | Té control complet del pòdcast #\{id\}. | \* |
| Editor | Administra els continguts i la publicació del pòdcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Autor | Administra el contingut del podcast #\{id\} però no el pot publicar. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Convidat | Col·laborador general del podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| view | Pot veure el tauler i les estadístiques del podcast #\{id\}. |
| edit | Pot editar el podcast #\{id\}. |
| delete | Pot suprimir el podcast #\{id\}. |
| manage-import | Pot sincronitzar el podcast importat #\{id\}. |
| manage-persons | Pot gestionar les subscripcions del podcast #\{id\}. |
| manage-subscriptions | Pot gestionar les subscripcions del podcast #\{id\}. |
| manage-contributors | Pot gestionar els col·laboradors del podcast #\{id\}. |
| manage-platforms | Pot establir/eliminar enllaços de plataforma del podcast #\{id\}. |
| manage-publications | Pot publicar el podcast #\{id\}. |
| manage-notifications | Pot veure i marcar les notificacions com a llegides per al podcast #\{id\}. |
| interact-as | Pot interactuar en nom del podcast #\{id\} per marcar les publicacions com a preferides, compartir-les o respondre-hi. |
| episodes.view | Pot veure taulers i estadístiques dels episodis del podcast #\{id\}. |
| episodes.create | Pot crear episodis per al podcast #\{id\}. |
| episodes.edit | Pot editar episodis del podcast #\{id\}. |
| episodes.delete | Pot suprimir episodis del podcast #\{id\}. |
| episodes.manage-persons | Pot gestionar persones d'episodi del podcast #\{id\}. |
| episodes.manage-clips | Pot gestionar clips de vídeo o fragments de so del pòdcast #\{id\}. |
| episodes.manage-publications | Pot publicar/anul·lar la publicació d'episodis i publicacions del pòdcast #\{id\}. |
| episodes.manage-comments | Pot crear/eliminar comentaris d'episodi del pòdcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,16 +1,13 @@
---
title: Imatges Docker oficials
sidebarDepth: 3
---
# Imatges Docker oficials
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all
in one castopod image using nginx unit
- [** code>castopod/app</code>**](https://hub.docker.com/r/castopod/app): el
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): el
paquet incloent Castopod i totes les dependències
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una
configuració de Nginx per a Castopod

View file

@ -1,22 +1,21 @@
---
title: Instal·lació
sidebarDepth: 3
title: Com instal·lar Castopod?
---
# Com instal·lar Castopod?
import { Aside } from "@astrojs/starlight/components";
Castopod va ser pensat per ser fàcil d'instal·lar. Ja sigui utilitzant un
allotjament dedicat o un compartit, podeu instal·lar-lo a la majoria de
servidors web compatibles amb PHP-MySQL.
::: tip Nota
<Aside>
Hem publicat imatges oficials de Docker per a Castopod!
Si preferiu utilitzar Docker, podeu ometre això i anar directament a la
[documentació de Docker](./docker.md) per a Castopod.
:::
</Aside>
## Requisits
@ -48,14 +47,6 @@ PHP:
> Us recomanem que utilitzeu [MariaDB](https://mariadb.org).
::: warning Avís
Castopod només funciona amb bases de dades compatibles amb MySQL 5.7 o superior.
No funcionarà amb l'anterior MySQL v5.6, per exemple, ja que el seu final de
vida va ser el 5 de febrer de 2021.
:::
Necessitareu el nom d'amfitrió del servidor (hostname), el nom de la base de
dades, el nom d'usuari i la contrasenya per completar el procés d'instal·lació.
Si no els teniu, poseu-vos en contacte amb l'administrador del vostre servidor.
@ -118,13 +109,13 @@ o superior. Cal instal·lar les següents extensions:
2. Seguiu les instruccions a la vostra pantalla.
3. Comenceu a fer podcasts!
::: info Nota
<Aside>
L'script d'instal·lació escriu un fitxer `.env` a l'arrel del paquet. If you
cannot go through the install wizard, you can create and edit the `.env` file
manually based on the `.env.example` file.
:::
</Aside>
### Using CLI
@ -229,13 +220,35 @@ 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="Instal·lar Castopod amb YunoHost" class="align-middle" />
<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="Instal·lar Castopod amb 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>Repositori
a Github</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>
Repositori a Github
</a>
</div>

View file

@ -1,9 +1,7 @@
---
title: Seguretat
title: Detalls de seguretat
---
# Detalls de seguretat
Castopod està fet amb [CodeIgniter4](https://codeigniter.com/), un framework PHP
que fomenta les
[bones pràctiques de seguretat](https://codeigniter.com/user_guide/concepts/security.html).

View file

@ -1,9 +1,8 @@
---
title: Actualitzar
sidebarDepth: 3
title: Com actualitzar Castopod?
---
# Com actualitzar Castopod?
import { Aside } from "@astrojs/starlight/components";
Després d'instal·lar Castopod, és possible que vulgueu actualitzar la vostra
instància a la darrera versió per gaudir de les últimes funcions ✨, correccions
@ -36,12 +35,12 @@ d'errors 🐛 i millores de rendiment ⚡.
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
@ -54,7 +53,7 @@ d'errors 🐛 i millores de rendiment ⚡.
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
@ -62,7 +61,7 @@ Releases may come with additional update instructions (see
- 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)
:::
</Aside>
## Fully Automated updates

View file

@ -0,0 +1,1383 @@
---
title: Benvinguts 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod és una plataforma d'allotjament gratuïta i de codi obert creada per a
podcasters que volen involucrar i interactuar amb el seu públic.
Castopod és fàcil d'instal·lar i s'ha creat amb
[CodeIgniter4](https://codeigniter.com/), un marc PHP potent amb una empremta
molt petita.
<LinkCard title="Instal·lar" href="./getting-started/install" />
## Característiques
- 🌱 &nbsp;Gratis i de codi obert (llicència AGPL v3)
- 🔐 &nbsp;Centrat en la sobirania de les dades: el vostre contingut, audiència
i estadístiques us pertanyen, i només a vosaltres
- 🪄 &nbsp;Funcions de podcasting 2.0: GUID, bloqueigos, transcripcions,
finançament, capítols, geo-localització, persones, fragments d'àudio, …
- 💬 &nbsp;Xarxa social integrada:
- 🚀 &nbsp;Castopod forma part de Fediverse, una xarxa social descentralitzada
- ❤️ &nbsp;Creeu publicacions, compartiu-les, afegiu-hi com a preferits i
comenteu episodis
- 📈 &nbsp;Estadístiques integrades:
- ⚖️ &nbsp;Complint amb GDPR / CCPA / LGPD
- 🪙 &nbsp;Mesura d'audiència segons l'estàndard IABv2
- 🏡 &nbsp;Estadístiques locals, sense cap tercer implicat
- 📢 &nbsp;Eines de màrqueting integrades:
- ✅ &nbsp;Preparada per a SEO (metaetiquetes de gràfics oberts, JSON-LD, …)
- 📱 &nbsp;PWA: instal·lable pels oients com a aplicació autònoma
- 🎨 &nbsp;Colors del tema personalitzables
- 🎬 &nbsp;Genereu videoclips d'episodis preparats per compartir
- 🔉 &nbsp;Genera fragments d'àudio de cada episodi
- ▶️ &nbsp;Reproductor incrustable, per incrustar els episodis a qualsevol
lloc web
- 💸 &nbsp;Monetització:
- 🔗 &nbsp;Enllaços de finançament
- 📲 &nbsp;Anuncis per escoltar-fent-clic
- 🤝 &nbsp;Integració amb value4value i WebMonetization
- 💎 &nbsp;Premium podcasts
- 📡 &nbsp;Publiqueu els vostres episodis a tot arreu amb RSS:
- 📱 &nbsp;A tots els directoris i aplicacions: Podcast Index, Apple Podcasts,
Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Emeteu els vostres episodis a l'instant amb WebSub
- 📥 &nbsp;Importació de podcasts: moveu el vostre podcast existent a Castopod
- 📤 &nbsp;Traieu el vostre podcast fora de Castopod
- 🔀 &nbsp;Multi-podcast: allotgeu tants programes com vulgueu en un mateix lloc
- 👥 &nbsp;Multi-usuari: afegiu col·laboradors i definiu rols
- 🌎 &nbsp;Suport i18n: traduït a l'anglès, català, espanyol, xinès, francès,
polonès, alemany, portuguès brasiler ... i
[més per venir](https://translate.castopod.org)!
## Motivació
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.
## Comparació amb altres solucions
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 altres plataformes de podcast
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 other podcasting solutions:
- Castopod es pot auto-allotjar i és la única solució que us permet mantenir el
control total sobre el que produïu. A més, com que és de codi obert, fins i
tot podeu personalitzar-lo com vulgueu.
- Castopod és l'única solució que actualment integra tant una xarxa social
descentralitzada amb ActivityPub com moltes de les funcions de podcasting 2.0,
amb l'esperança de salvar la bretxa entre les dues.
## Col·laborar
Love Castopod and would like to help? Take a look at the following documentation
to get you started.
### Codi de conducta
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/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be tolerated.
### Guia de col·laboració
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.
## Col·laboradors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## Contacte
You may reach us for help or ask any question you have on:
- [Discord](https://castopod.org/discord) (per a la interacció directa amb
desenvolupadors i la comunitat)
- [Seguiment d'incidències](https://code.castopod.org/adaures/castopod/-/issues)
(per a sol·licituds de noves funcionalitats i informes d'errors)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (instància de Mastodon)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Patrocinadors
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## Llicència
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,84 @@
---
title: Authentication & Authorization
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Rolloù an istañs
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Aotreoù war an istañs
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Zvanične Docker slike
sidebarDepth: 3
---
# Zvanične Docker slike
Castopod gura 3 Docker slike u Docker Hub tokom njegovog automatizovanog procesa
izrade:

View file

@ -1,21 +1,20 @@
---
title: Installation
sidebarDepth: 3
title: How to install Castopod?
---
# How to install Castopod?
import { Aside } from "@astrojs/starlight/components";
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.
::: tip Note
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
:::
</Aside>
## Requirements
@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP:
> We recommend using [MariaDB](https://mariadb.org).
::: warning 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.
@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed:
2. Follow the instructions on your screen.
3. Start podcasting!
::: info Note
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
:::
</Aside>
### Using CLI
@ -226,13 +217,35 @@ 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
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>
<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>

View file

@ -1,9 +1,7 @@
---
title: Security
title: Security concerns
---
# Ar surentez
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).

View file

@ -0,0 +1,108 @@
---
title: Ako aktualizovať Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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 ⚡.
## Update instructions
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
- cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the
[releases page](https://code.castopod.org/adaures/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
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. On your server:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
- 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)
</Aside>
## Fully Automated updates
> Coming soon... 👀
## 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…

View file

@ -0,0 +1,1383 @@
---
title: Dobrodošli 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod je besplatna platforma otvorenog koda napravljena za podkastere koji
žele interakciju sa svojom publikom.
Castopod se lako instalira i napravljen je na
[CodeIgniter4](https://codeigniter.com/), moćnom PHP okviru sa jako malim
otiskom (footprint).
<LinkCard title="Instaliraj" href="./getting-started/install" />
## Funkcionalnosti
- 🌱 Besplatan i otvorenog koda (AGPL v3 License)
- 🔐 Fokusiran an suverenitet podataka: vaš sadržaj, publika i analitika pripada
vama i samo vama
- 🪄 &nbsp;Podkasting 2.0 funkcionalnosti: GUID, zaključan, transkripti,
podrška, poglavlja, lokacija, posobe, zvučni isečci, …
- 💬 &nbsp;Ugrađena društvena mreža:
- 🚀 &nbsp;Castopod je deo Fediversa, decentralizovane društvene mreže
- ❤️ &nbsp;Napravite objave, delite, dodajte u omiljene i komentarišite
epizode
- 📈 &nbsp;Ugrađena analitika:
- ⚖️ &nbsp;U skladu sa GDPR / CCPA / LGPD
- 🪙 &nbsp;Merenje publike putem IABv2 standarda
- 🏡 &nbsp;Analitika na licu mesta, bez uključenosti trećih strana
- 📢 &nbsp;Ugrađeni marketinški alati:
- ✅ &nbsp;SEO spremno (open-graph meta-tags, JSON-LD, …)
- 📱 &nbsp;PWA: instalirajte kao samostojeću aplikaciju
- 🎨 &nbsp;Prilagodljive boje teme
- 🎬 &nbsp;Napravite video isečke iz epizoda koji su spremni za deljenje
- 🔉 &nbsp;Napravite audio isečke
- ▶️ &nbsp;Plejer koji možete koristiti na svom sajtu (embed)
- 💸 &nbsp;Monetizacija:
- 🔗 &nbsp;Linkovi za podršku publike
- 📲 &nbsp;Slušaj i klikni reklame
- 🤝 &nbsp;value4value / Veb Monetizacija
- 💎 &nbsp;Premijum podkasti
- 📡 &nbsp;Objavite svoje epizode svugde uz RSS:
- 📱 &nbsp;Na svim agregatorima i aplikacijama: Podcast Index, Apple Podcasts,
Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Emitujte svoje epizode instant uz WebSub
- 📥 &nbsp;Uvoz podkasta: prebacite svoj postojeći podkast na Castopod
- 📤 &nbsp;Prebacite svoj podkast sa Castopod-a
- 🔀 &nbsp;Mreža: hostujte koliko god želite podkasta
- 👥 &nbsp;Više korisnika: dodajte saradnike i odredite njihove uloge
- 🌎 &nbsp;i18n podrška: prevedeno na engleski, francuski, poljski, nemački,
brazilski portugalski, španski…
[još jezika uskoro](https://translate.castopod.org)!
## Motivacija
Ekosistem podcasta je po prirodi decentralizovan: možete kreirati svoj podkast
kao RSS datoteku, objavite je na vebu i deliti svuda na mreži.
To je zapravo jedan od retkih medija koji je ostao decentralizovan ovako dugo.
Kako se upotreba razvija, sve više ljudi ulazi u podkaste: ili kao kreatori koji
pronalaze nove načine da podele svoje ideje ili kao slušaoci u potrazi za boljim
sadržajem.
Kako podkasting postaje sve više korišćen, neke kompanije pokušavaju da ga
promene ka kontrolisanijem i centralizovanijem mediju.
Castopod je stvoren u nastojanju da pruži otvorenu i održivu alternativu za
hostovanje vaših podkasta, promovišući decentralizaciju kako bi se osiguralo da
podkasterska kreativnost može da se izrazi.
Ovaj projekat gura zajednica otvorenog koda, ponajviše
[Fedivers](https://fediverse.party/en/fediverse/) i
[Podcasting 2.0](https://podcastindex.org/) pokreti.
## Poređenje sa drugim rešenjima
Verujemo da jedno rešenje nije dobro za sve, već da sve zavisi od vaših potreba.
Tako da evo poređenja sa drugim alatima kako bi ste mogli da procenite da li je
Castopod prava stvar za vas.
### Castopod protiv Wordpress-a
Castopod je često nazivan "Wordpress-om za podkaste" zbog sličnosti koje deli sa
ovom ploatformom. U neku ruku ovo je tačno. I zapravo, Castopod bio je u velikoj
meri inspirisan Wordpress ekosistemom, videvši lakoću usvajanja od zajednice i
broja veb lokacija koje rade na njemu.
Isto kao i Wordpress, Castopod je besplatan i otvorenog koda, napravljen
koristeći PHP i MySQL baze podataka i spakovan na način koji vam omogućava
jednostavnu instalaciju na većini veb servera.
Wordpress je odličan način na napravite veb stranicu i upotpunite je dodatcima
kako bi dobili ono što želite. To je potpuno razvijen CMS koji vam pomaže da
dobijete bilo koju vrstu veb stranica na mreži.
S druge strane, Castopod treba da odgovori na posebne potrebe podkastera,
fokusirajući se na podkasting, i ništa drugo. Nisu vam potrebni nikakvi dodatci
kako bi ste krenuli na svoje podkastersko putovanje.
Ovo omogućava optimizaciju procesa specifičnih za podcasting: u rasponu od
kreiranja vaših podkasta i objavljivanja novih epizoda sve do emitovanja,
marketinga i analitike.
Konačno, u zavisnosti od vaših potreba, Wordpress i Castopod mogu čak i da
funkcionišu zajedno jer dele iste zahteve!
### Castopod protiv Funkwhale-a
Funkwhale je moderan besplatni muzički server otvorenog koda koji se samostalno
hostuje. Kao i Castopod, Funkwhale je deo Fedivers-a, decentralizovane društvene
mreže što omogućava kompatibilnost između njih.
Funkwhale je u početku napravljen oko muzike. Kasnije, kako je projekat
napredovao, dodata je opcija hostovanja podkasta.
Za razliku od Funkwhale-a, Castopod je dizajniran i napravljen isključivo oko
podkasta. Ovo omogućava lakšu implementaciju funkcionalnosti koje se odnose na
podkast ekosistem, kao što su podkasting 2.0 alati (transkripti, poglavlja,
lokacije, osobe, ...).
Tako da bi ste verovatno trebali da koristite Funkwhale ukoliko želite da
hostujete svoju muziku a Castopod ukoliko želite da hostujete svoje podkaste.
### Castopod protiv drugih podkast hosting-a
Postoji mnogo različitih rešenja za hostovanje vaših podkasta, neka od njih su
stvarno fantastična i [ dosta njih](https://podcastindex.org/apps) se
priključuje Podcasting 2.0 trendu, isto kao i Castopod!
Svako od ovih rešenja se razlikuje jedno od drugog, možete ih uporediti sa
[listom funkcionalnosti](#features).
Imajući to u vidu, postoje dve glavne razlike u odnosu na druga rešenja za
podkasting:
- Castopod može biti samostalno hostovan i jedino je rešenje koje vam omogućava
da zadržite punu kontrolu nad onim što proizvodite. Takođe, pošto je otvorenog
koda, možete ga čak prilagoditi kako želite.
- Castopod je jedino rešenje koje trenutno uklapa decentralizovanu društvenu
mrežu sa ActivityPub-om kao i mnoge funkcionalnosti podkasting-a 2.0, nadajući
se da će ih tako približiti.
## Doprinos
Volite Catsopod i voleli bi ste da pomognete? Pogledajte dokumentaciju koja
sledi kako bi ste počeli.
### Kodeks ponašanja
Castopod je usvojio Kodeks ponašanja kojeg očekujemo da se učesnici u projektu
pridržavaju. Molimo da pročitate
[Uputstvo Kodeksa ponašanja](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
kako bi ste razumeli šta hoće a šta neće biti tolerisano.
### Vodič za doprinos
Pročitajte naše [uputstvo za doprinos](../contributing/guidelines.md) kako bi
ste bolje razumeli naš proces razvoja, kako da predložite popravke bagova i
unapređenja i kako da napravite i testirate svoje promene na Castopod-u.
## Saradnici ✨
Veliko hvala ovim divnim ljudima
([ključ emotikona](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
Ovaj projekat prati specifikaciju
[svih saradnika](https://github.com/all-contributors/all-contributors).
Doprinosi bilo koje vrste su dobrodošli!
## Kontakt
Možete nas kontaktirati za pomoć ili postaviti bilo koje pitanje koje imate na:
- [Discord-u](https://castopod.org/discord) (za direktnu interakciju sa
programerima i zajednicom)
- [Listi pitanja](https://code.castopod.org/adaures/castopod/-/issues) (za
zahteve za funkcionalnostima i prijavu bagova)
Takođe, možete nas pratiti na društvenim mrežama kako bi ste dobili najnovije
vesti o Castopod-u:
- [podlibre.social](https://podlibre.social/@Castopod) (instanca Mastodon-a)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Sponzori
Tekući razvoj Castopod-a je omogućen uz podršku vas koji nas podržavate. Ukoliko
želite da pomognete, razmislite o
[sponzorisanju razvoja Castopod-a](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## Licenca
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Autorska prava © 2020-danas, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,85 @@
---
title: Authentifizierung & Autorisierung
---
Castopod behandelt Authentifizierung und Autorisierung mit `codeigniter/shield`
kombiniert mit eigenen Regeln. Rollen und Berechtigungen sind auf zwei Ebenen
definiert:
1. [instanzweit](#1-instance-wide-roles-and-permissions)
2. [je Podcast](#2-per-podcast-roles-and-permissions)
## 1. Instanzweite Rollen und Berechtigungen
### Instanz Rollen
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------ |
| Super-Administrator | Hat die vollständige Kontrolle über Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Verwaltet Castopods Inhalte. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | Allgemeine Benutzer von Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instanz Berechtigungen
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ---------------------------------------------------------------------------- |
| admin.access | Kann auf den Admin-Bereich von Castopod zugreifen. |
| admin.settings | Kann auf die Einstellungen von Castopod zugreifen. |
| users.manage | Kann Castopod-Benutzer verwalten. |
| persons.manage | Kann Mitwirkende verwalten. |
| pages.manage | Kann Seiten verwalten. |
| podcasts.view | Kann alle Podcasts einsehen. |
| podcasts.create | Kann neue Podcasts erstellen. |
| podcasts.import | Kann Podcasts importieren. |
| fediverse.manage-blocks | Kann föderierte Nutzer/Domains davon abhalten, mit Castopod zu interagieren. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Pro Podcast Rollen und Berechtigungen
### Pro Podcast Rollen
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Administrator | Hat die vollständige Kontrolle über Podcast #\{id\}. | \* |
| Editor | Verwaltet Inhalte und Veröffentlichungen von Podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Autor | Verwaltet Inhalte von Podcast #\{id\}, kann diese aber nicht veröffentlichen. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Gast | Allgemeiner Mitwirkender des Podcasts #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Pro Podcast Berechtigung
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------------------------------------- |
| view | Kann das Dashboard und Analysen des Podcasts #\{id\} einsehen. |
| edit | Kann Podcast #\{id\} bearbeiten. |
| delete | Kann Podcast #\{id\} löschen. |
| manage-import | Kann den importierten Podcast #\{id\} synchronisieren. |
| manage-persons | Kann Abonnements des Podcasts #\{id\} verwalten. |
| manage-subscriptions | Kann Abonnements des Podcasts #\{id\} verwalten. |
| manage-contributors | Kann Mitwirkende des Podcasts #\{id\} verwalten. |
| manage-platforms | Kann Plattform-Links des Podcasts #\{id\} verwalten. |
| manage-publications | Kann Podcast #\{id\} veröffentlichen. |
| manage-notifications | Kann Benachrichtigungen des Podcasts #\{id\} einsehen und als gelesen markieren. |
| interact-as | Kann als Podcast #\{id\} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten. |
| episodes.view | Kann Dashboards und Analysen von Episoden des Podcasts #\{id\} einsehen. |
| episodes.create | Kann Folgen für Podcast #\{id\} erstellen. |
| episodes.edit | Kann Folgen von Podcast #\{id\} bearbeiten. |
| episodes.delete | Kann Folgen von Podcast #\{id\} löschen. |
| episodes.manage-persons | Kann Personen von Episoden des Podcasts #\{id\} verwalten. |
| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #\{id\} verwalten. |
| episodes.manage-publications | Kann Episoden und Posts von Podcast #\{id\} veröffentlichen/zurückziehen. |
| episodes.manage-comments | Kann Kommentare von Folgen des Podcasts #\{id\} erstellen und löschen. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Offizielle Docker Images
sidebarDepth: 3
---
# Offizielle Docker Images
Castopod erstellt während des automatischen Build-Prozesses 3 Docker-Images auf
Docker Hub:

View file

@ -1,22 +1,21 @@
---
title: Installation
sidebarDepth: 3
title: Wie installiere ich Castopod?
---
# Wie installiere ich Castopod?
import { Aside } from "@astrojs/starlight/components";
Castopod ist für eine einfache Installation konzipiert. Ob dediziertes oder
Shared-Hosting, du kannst es auf den meisten PHP-MySQL-kompatiblen Webservern
installieren.
::: tip Note
<Aside>
Wir haben offizielle Docker Images für Castopod veröffentlicht!
Wenn du Docker bevorzugst, kannst du die manuelle Anleitung überspringen und
direkt zur [Docker-Dokumentation](./docker.md) für Castopod gehen.
:::
</Aside>
## Voraussetzungen
@ -49,14 +48,6 @@ sind:
> Wir empfehlen [MariaDB](https://mariadb.org).
::: warning Warning
Castopod funktioniert nur mit unterstützten MySQL 5.7 oder höher kompatiblen
Datenbanken. Es wird zum Beispiel mit dem vorherigen MySQL v5.6 nicht mehr
funktionieren, dessen Lebensende am 5. Februar 2021 war.
:::
Du benötigst den Servernamen, den Datenbanknamen, den Benutzernamen und das
Passwort, um den Installationsvorgang abzuschließen. Kontaktiere bitte den
Administrator, falls du keinen Benutzeraccount hast.
@ -120,13 +111,13 @@ nicht installiert: %s:
2. Folge der Anleitung auf dem Bildschirm.
3. Podcasting starten!
::: info Note
<Aside>
Das Installationsskript schreibt eine `.env` Datei im Paket-Root. Wenn Sie nicht
durch den Installations-Assistenten kommen, können Sie die `.env` Datei manuell
erstellen und bearbeiten basierend auf der `.env.example` Datei.
:::
</Aside>
### Using CLI
@ -234,13 +225,35 @@ kümmert sich um den Aufwand von self-hosting für dich.
<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="Installiere Castopod mit YunoHost" class="align-middle" />
<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="Installiere Castopod mit 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>
<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>

View file

@ -1,9 +1,7 @@
---
title: Sicherheit
title: Sicherheitsbedenken
---
# Sicherheitsbedenken
Castopod wurde mittels [CodeIgniter4](https://codeigniter.com/) (einem PHP
Framework) gebaut, welches
[gute Sicherheitspraktiken](https://codeigniter.com/user_guide/concepts/security.html)

View file

@ -1,9 +1,8 @@
---
title: Ažuriranje
sidebarDepth: 3
title: Kako da ažurirate Castopod?
---
# Kako da ažurirate Castopod?
import { Aside } from "@astrojs/starlight/components";
Nakon instalacije Castopod-a, možete poželeti da ažurirate svoju instancu na
najnoviju verziju kako bi ste uživali u najnovijim opcijama ✨, sređenim
@ -36,12 +35,12 @@ bagovima 🐛 i unapređenim performansama ⚡.
- Uklonite sve datoteke sem `.env` i `public/media`
- Kopirajte nove datoteke iz preuzetog paketa na vaš server
::: info Napomena
<Aside>
Možda ćete morati da resetujete dozvole za datoteke kao tokom procesa
instalacije. Proverite [Bezbednosne interese](./security.md).
:::
</Aside>
4. Ažurirajte svoju šemu baze podataka iz vaše `Castopod Admin` > `About`
stranice ili tako što ćete pokrenuti:
@ -53,7 +52,7 @@ bagovima 🐛 i unapređenim performansama ⚡.
5. Očistite keš iz `Castopod Admin` > `Settings` > `general` > `Housekeeping`
6. ✨ Uživajte u svežoj instanci, završili ste!
::: info Napomena
<Aside>
Izdanja mogu doći sa dodatnim uputstvima za ažuriranje (pogledajte
[stranicu izdanja](https://code.castopod.org/adaures/castopod/-/releases)).
@ -61,7 +60,7 @@ Izdanja mogu doći sa dodatnim uputstvima za ažuriranje (pogledajte
- cf.
[Nisam ažurirao/la svoju instancu jako dugo… Šta treba da uradim?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
:::
</Aside>
## Potpuno automatsko ažuriranje

View file

@ -0,0 +1,1382 @@
---
title: Willkommen 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod ist eine freie & Open-Source-Hosting-Plattform für Podcastende, die ihr
Publikum einbinden und mit ihnen interagieren möchten.
Castopod ist einfach zu installieren und wurde auf
[CodeIgniter4](https://codeigniter.com/) aufgebaut, ein mächtiges PHP Framework,
mit einem sehr kleinen Fußabdruck.
<LinkCard title="Installieren" href="./getting-started/install" />
## Merkmale
- 🌱 Kostenlos & Open-Source (AGPL v3 Lizenz)
- 🔐 &nbsp;Fokussiert auf die Datensouveränität: Ihre Inhalte, Ihr Publikum und
Analysen gehören zu Ihnen, und&nbsp;nur Ihnen&nbsp;
- 🪄 &nbsp;Podcasting 2.0 Features: GUID, gesperrt, Transkripte, Finanzierung,
Kapitel, Standort, Personen, Soundbites, …
- 💬 &nbsp;Integriertes soziales Netzwerk:
- 🚀 &nbsp;Castopod ist Teil des Fediversums, einem dezentralen sozialen
Netzwerk
- ❤️ &nbsp;Erstelle Beiträge, teile, favorisiere und kommentiere Episoden
- 📈 &nbsp;Integrierte Analyse:
- ⚖️ &nbsp;GDPR / CCPA / LGPD konform
- 🪙 &nbsp;Standard IABv2 Zuschauermessung
- 🏡 &nbsp;On-premises Analytik, kein Dritter beteiligt
- 📢 &nbsp;Integrierte Marketing-Tools:
- ✅ &nbsp;SEO bereit (open-graph Meta-Tags, JSON-LD, …)
- 📱 &nbsp;PWA: als eigenständige App installieren
- 🎨 &nbsp;Anpassbare Theme-Farben
- 🎬 &nbsp;Generiere Videoclips aus Episoden fertig zum Teilen
- 🔉 &nbsp;Soundbites erstellen
- ▶️ &nbsp;Embeddable Player, binde deine Episoden auf jeder Webseite ein
- 💸 &nbsp;Monetarisierung:
- 🔗 &nbsp;Funding links
- 📲 &nbsp;listen-to-click ads
- 🤝 &nbsp;value4value / WebMonetization
- 💎 &nbsp;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## 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.
## Vergleiche mit anderen Lösungen
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 Funkwale
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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,85 @@
---
title: Ταυτοποίηση & εξουσιοδότηση
---
Ο Castopod χειρίζεται τον έλεγχο ταυτότητας και την έγκριση χρησιμοποιώντας
`codeigniter/shield` σε συνδυασμό με προσαρμοσμένους κανόνες. Οι ρόλοι και τα
δικαιώματα καθορίζονται σε δύο επίπεδα:
1. [ευρεία παρουσία](#1-instance-wide-roles-and-permissions)
2. [ανά podcast](#2-per-podcast-roles-and-permissions)
## 1. Διαχείριση ρόλων και δικαιωμάτων
### Ρόλοι εμφάνισης
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ---------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ |
| Υπερδιαχειριστής | Έχει πλήρη έλεγχο του Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Διαχειριστής | Διαχείριση περιεχομένου του Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | Γενικοί χρήστες του Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | -------------------------------------------------------------------------------------- |
| admin.access | Μπορεί να έχει πρόσβαση στην περιοχή διαχείρισης Castopod. |
| admin.settings | Μπορεί να έχει πρόσβαση στις ρυθμίσεις Castopod. |
| users.manage | Μπορεί να διαχειριστεί τους χρήστες Castopod. |
| persons.manage | Μπορεί να διαχειριστεί τα άτομα. |
| pages.manage | Μπορεί να διαχειριστεί τις σελίδες. |
| podcasts.view | Μπορεί να δει όλα τα podcasts. |
| podcasts.create | Μπορεί να δημιουργήσει νέα podcasts. |
| podcasts.import | Μπορεί να εισάγει podcasts. |
| fediverse.manage-blocks | Μπορεί να εμποδίσει τους ψευτογενείς ηθοποιούς/τομείς να αλληλεπιδρούν με το Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------------ | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Διαχειριστής | Έχει πλήρη έλεγχο του podcast #\{id\}. | \* |
| Εκδότης | Διαχειρίζεται περιεχόμενο και δημοσιεύσεις του podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Συντάκτης | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Επισκέπτης | Γενικός συντελεστής του podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Official Docker images
sidebarDepth: 3
---
# Official Docker images
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:

View file

@ -1,21 +1,20 @@
---
title: Installatie
sidebarDepth: 3
title: Hoe installeer je Castopod?
---
# Hoe installeer je Castopod?
import { Aside } from "@astrojs/starlight/components";
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.
::: tip Note
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
:::
</Aside>
## Vereisten
@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP:
> We recommend using [MariaDB](https://mariadb.org).
::: warning 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.
@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed:
2. Follow the instructions on your screen.
3. Begin met podcasting!
::: info Note
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
:::
</Aside>
### Using CLI
@ -226,13 +217,35 @@ 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
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>
<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>

View file

@ -1,9 +1,7 @@
---
title: Security
title: Veiligheidszorgen
---
# 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).

View file

@ -1,9 +1,8 @@
---
title: Bijwerken
sidebarDepth: 3
title: How to update Castopod?
---
# How to update Castopod?
import { Aside } from "@astrojs/starlight/components";
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
@ -36,12 +35,12 @@ improvements ⚡.
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
@ -54,7 +53,7 @@ improvements ⚡.
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
@ -62,7 +61,7 @@ Releases may come with additional update instructions (see
- 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)
:::
</Aside>
## Volledig geautomatiseerde updates

View file

@ -0,0 +1,1382 @@
---
title: Καλώς Ήλθατε 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Το Castopod είναι μια δωρεάν & ανοικτού κώδικα πλατφόρμα φιλοξενίας podcast που
κατασκευάζεται για podcasters που θέλουν να συμμετάσχουν και να αλληλεπιδράσουν
με το κοινό τους.
Το Castopod είναι εύκολο στην εγκατάσταση και χτίστηκε με το
[CodeIgniter4](https://codeigniter.com/), ένα ισχυρό PHP framework με ένα πολύ
μικρό αποτύπωμα.
<LinkCard title="Εγκατάσταση" href="./getting-started/install" />
## Χαρακτηριστικά
- 🌱 &nbsp;Δωρεάν & open-source (AGPL v3 License)
- 🔐 &nbsp;Εστιάζει στην κυριαρχία των δεδομένων: το περιεχόμενο, το κοινό και
τα αναλυτικά στοιχεία ανήκουν σε εσάς μόνο
- 🪄 &nbsp;Podcasting 2.0 features: GUID, locked, transcripts, funding,
chapters, location, persons, soundbites, …
- 💬 &nbsp;Ενσωματωμένο κοινωνικό δίκτυο:
- 🚀 &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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## Κίνητρα
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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -1,10 +1,7 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
@ -15,7 +12,7 @@ coupled with custom rules. Roles and permissions are defined at two levels:
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
@ -23,11 +20,11 @@ coupled with custom rules. Roles and permissions are defined at two levels:
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
@ -41,47 +38,47 @@ coupled with custom rules. Roles and permissions are defined at two levels:
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Official Docker images
sidebarDepth: 3
---
# Official Docker images
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
@ -35,9 +32,9 @@ can be added as a cache handler.
version: "3.7"
services:
app:
castopod:
image: castopod/castopod:latest
container_name: "castopod-app"
container_name: "castopod"
volumes:
- castopod-media:/var/www/castopod/public/media
environment:
@ -50,14 +47,14 @@ can be added as a cache handler.
CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks:
- castopod-app
- castopod
- castopod-db
ports:
- 8000:8000
restart: unless-stopped
mariadb:
image: mariadb:10.5
image: mariadb:11.2
container_name: "castopod-mariadb"
networks:
- castopod-db
@ -71,13 +68,13 @@ can be added as a cache handler.
restart: unless-stopped
redis:
image: redis:7.0-alpine
image: redis:7.2-alpine
container_name: "castopod-redis"
command: --requirepass changeme
volumes:
- castopod-cache:/data
networks:
- castopod-app
- castopod
volumes:
castopod-media:
@ -85,7 +82,7 @@ can be added as a cache handler.
castopod-cache:
networks:
castopod-app:
castopod:
castopod-db:
```

View file

@ -0,0 +1,242 @@
---
title: How to install Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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.1 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.1 or higher
PHP version 8.1 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.
- [exif](https://www.php.net/manual/en/exif.installation.php)
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).
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`,
`REFERENCES`, `CREATE VIEW`.
### (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):
```bash
* * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
```
**Note** - If you do not add this cron task, the following Castopod features
will not work:
- Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using
[WebSub](https://en.wikipedia.org/wiki/WebSub)
- Generating video clips -
[requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (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!
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
</Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### Email/SMTP setup
Email configuration is required for some features to work properly (eg.
retrieving your forgotten password, sending instructions to premium subscribers,
…)
You may add your email configuration in your instance's `.env` like so:
```ini
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email config options
| Variable name | Type | Default |
| ---------------- | -------------------- | ------------ |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
By default, files are saved to the `public/media` folder using the file system.
If you need to relocate the `media` folder to a different location, you can
specify it in your `.env` file as shown below:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In this example, the files will be saved to the /mnt/storage/media folder. Make
sure to also update your web server configuration to reflect this change.
### S3
If you prefer storing your media files on an S3 compatible storage, you may
specify it in your `.env`:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 config options
| Variable name | Type | Default |
| ----------------------- | ------- | ----------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## 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>

View file

@ -1,9 +1,7 @@
---
title: Security
title: Security concerns
---
# 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).

View file

@ -1,9 +1,8 @@
---
title: Update
sidebarDepth: 3
title: How to update Castopod?
---
# How to update Castopod?
import { Aside } from "@astrojs/starlight/components";
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
@ -36,12 +35,12 @@ improvements ⚡.
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
@ -54,7 +53,7 @@ improvements ⚡.
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
@ -62,7 +61,7 @@ Releases may come with additional update instructions (see
- 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)
:::
</Aside>
## Fully Automated updates

View file

@ -0,0 +1,194 @@
---
title: Welcome 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Install" href="./getting-started/install" />
## 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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese, Spanish, simplified Chinese… and
[many more](https://translate.castopod.org)!
## 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 other podcasting solutions:
- 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/adaures/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](https://code.castopod.org/adaures/castopod/-/blob/develop/CONTRIBUTING.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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -1,10 +1,7 @@
---
title: Autenticación & Autenticación
sidebarDepth: 3
---
# Autenticación & Autenticación
Castopod gestiona la autenticación y autorización usando `codeignitor/escudo`
emparejado con reglas personalizadas. Los roles y permisos se definen en dos
niveles:
@ -16,21 +13,21 @@ niveles:
### Roles de instancia
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| roles | descripción | permisos |
| role | description | permissions |
| ------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------ |
| Super administrador | Tiene control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Administrador | Gestiona el contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Administrador | Administrar contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | Usuarios generales de Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Permisos de instancia
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permisos | descripción |
| permission | description |
| ----------------------- | ------------------------------------------------------------------------------ |
| admin.access | Puedes acceder al área de administración de Castopod. |
| admin.settings | Puede acceder a la configuración de Castopod. |
@ -42,47 +39,47 @@ niveles:
| podcasts.import | Puede importar podcasts. |
| fediverse.manage-blocks | Puedes bloquear la interacción de actores/dominios del fediverso con Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Permisos y roles por podcast
### Roles por podcast
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| roles | descripción | permisos |
| ------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Administrador | Tiene el control completo del podcast #{id}. | \* |
| Editor | Gestiona el contenido y las publicaciones del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Autor | Gestiona el contenido del podcast #{id} pero no puede publicarlo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Invitado | Colaborador general del podcast #{id}. | view, episodes.view |
| role | description | permissions |
| ------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Administrador | Tiene el control completo del podcast #\{id\}. | \* |
| Editor | Gestiona el contenido y las publicaciones del podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Autor | Gestiona el contenido del podcast #\{id\} pero no puede publicarlo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Invitado | Colaborador general del podcast #\{id\}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Permisos por podcast
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permisos | descripción |
| ---------------------------- | -------------------------------------------------------------------------------------------------- |
| view | Puede ver el panel de control y análisis del podcast #{id}. |
| edit | Puede editar podcast #{id}. |
| delete | Puede borrar el podcast #{id}. |
| manage-import | Puede sincronizar el podcast importado #{id}. |
| manage-persons | Puede administrar las suscripciones del podcast #{id}. |
| manage-subscriptions | Puede administrar las suscripciones del podcast #{id}. |
| manage-contributors | Puede administrar colaboradores del podcast #{id}. |
| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #{id}. |
| manage-publications | Puede publicar el podcast #{id}. |
| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #{id}. |
| interact-as | Puede interactuar como el podcast #{id} para favoritar, compartir o responder a las publicaciones. |
| episodes.view | Puede ver el panel de control y analíticas del episodio #{id}. |
| episodes.create | Puede crear episodios para el podcast #{id}. |
| episodes.edit | Puede editar episodios #{id}. |
| episodes.delete | Puede borrar el podcast #{id}. |
| episodes.manage-persons | Puede administrar las suscripciones del podcast #{id}. |
| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #{id}. |
| episodes.manage-publications | Puede publicar el podcast #{id}. |
| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #{id}. |
| permission | description |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| view | Puede ver el panel de control y analíticas del episodio #\{id\}. |
| edit | Puede editar el podcast #\{id\}. |
| delete | Puede borrar el podcast #\{id\}. |
| manage-import | Puede sincronizar el podcast importado #\{id\}. |
| manage-persons | Puede administrar las suscripciones del podcast #\{id\}. |
| manage-subscriptions | Puede administrar las suscripciones del podcast #\{id\}. |
| manage-contributors | Puede administrar colaboradores del podcast #\{id\}. |
| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #\{id\}. |
| manage-publications | Puede publicar el podcast #\{id\}. |
| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #\{id\}. |
| interact-as | Puede interactuar como el podcast #\{id\} para marcar como favarito, compartir o responder a las publicaciones. |
| episodes.view | Puede ver el panel de control y analíticas del episodio #\{id\}. |
| episodes.create | Puede crear episodios para el podcast #\{id\}. |
| episodes.edit | Puede editar episodios del podcast #\{id\}. |
| episodes.delete | Puede borrar episodios del podcast #\{id\}. |
| episodes.manage-persons | Puede administrar las personas de los episodios del podcast #\{id\}. |
| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #\{id\}. |
| episodes.manage-publications | Puede publicar/despublicar episodios y publicaciones del podcast #\{id\}. |
| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #\{id\}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Imágenes oficiales de Docker
sidebarDepth: 3
---
# Imágenes oficiales de Docker
Castopod lanza 3 imágenes Docker al Docker Hub durante su proceso de
construcción automatizada:

View file

@ -1,22 +1,21 @@
---
title: Instalación
sidebarDepth: 3
title: ¿Cómo instalar Castopod?
---
# ¿Cómo instalar Castopod?
import { Aside } from "@astrojs/starlight/components";
Castopod está pensado para ser fácil de instalar. Ya sea usando un alojamiento
dedicado o compartido, puedes instalarlo en la mayoría de servidores web
compatibles con PHP-MySQL.
::: tip Nota
<Aside>
¡Hemos publicado imágenes oficiales de Docker para Castopod!
Si prefieres usar Docker, puedes saltarte esto e ir directamente a la
[documentación sobre docker](./docker.md) para Castopod.
:::
</Aside>
## Requisitos
@ -47,14 +46,6 @@ Además, asegúrate de que las siguientes extensiones están habilitadas en tu P
> Se recomienda usar [MariaDB](https://mariadb.org).
::: warning Alerta
Castopod solo funciona con base de datos compatibles con MySQL 5.7 o superior.
No funcionará por ejemplo con la version previa MySQL v5.6, ya que su vida útil
terminó el 5 de febrero de 2021.
:::
Necesitarás la dirección/nombre del servidor (hostname), el nombre de la base de
datos, el usuario y la contraseña para completar el proceso de instalación. Si
no cuentas con esta información, contacta con el administrador de tu servidor.
@ -118,13 +109,13 @@ extensiones:
2. Sigue las instrucciones en pantalla.
3. ¡Empieza a hacer podcasting!
::: info Nota
<Aside>
El script de instalación crea un archivo `.env` en la raíz de castopod. If you
cannot go through the install wizard, you can create and edit the `.env` file
manually based on the `.env.example` file.
:::
</Aside>
### Using CLI
@ -230,13 +221,35 @@ 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="Instalar Castopod con YunoHost." class="align-middle" />
<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="Instalar Castopod con 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>
<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>

View file

@ -1,9 +1,7 @@
---
title: Seguridad
title: Problemas de seguridad
---
# Problemas de seguridad
Castopod está construido sobre [CodeIgniter4](https://codeigniter.com/), un
framework de PHP que alienta
[buenas prácticas de seguridad](https://codeigniter.com/user_guide/concepts/security.html).

View file

@ -1,9 +1,8 @@
---
title: Actualización
sidebarDepth: 3
title: ¿Cómo actualizar Castopod?
---
# ¿Cómo actualizar Castopod?
import { Aside } from "@astrojs/starlight/components";
Después de instalar Castopod, es posible que quieras actualizar tu instancia a
la última versión para disfrutar de las últimas características ✨, correcciones
@ -36,13 +35,13 @@ de errores 🐛 y mejoras de rendimiento ⚡.
- Eliminar todos los archivos excepto `.env` y la carpeta `public/media`
- Copie los nuevos archivos del paquete descargado en su servidor
::: Nota informativa
<Aside>
Es posible que necesite restablecer los permisos de los archivos después el
proceso de instalación. Compruebe
[preocupaciones de seguridad](./security.md).
:::
</Aside>
4. Actualice su esquema de base de datos desde su `Administrador de Castopod` >
`Acerca de` página o ejecutando:
@ -55,7 +54,7 @@ de errores 🐛 y mejoras de rendimiento ⚡.
`Housekeeping`
6. ✨ ¡Disfruta de tu instancia recién instalada, todo listo!
::: Nota informativa
<Aside>
Las versiones pueden venir con instrucciones de actualización adicionales (véase
la página de
@ -63,7 +62,7 @@ la página de
- cf. No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer?
:::
</Aside>
## Actualizaciones totalmente automatizadas

View file

@ -0,0 +1,1402 @@
---
title: Bienvenido 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod es una plataforma gratuita y de código abierto para hospedar podcasts
hecha para podcasters que quieren involucrar e interactuar más con su audiencia.
Castopod es fácil de instalar y se ha desarrollado sobre
[CodeIgniter4](https://codeigniter.com/), un potente y muy ligero framework PHP.
<LinkCard title="Instalación" href="./getting-started/install" />
## Características
- 🌱 &nbsp;Gratis & de código abierto (licencia AGPL v3).
- 🔐 &nbsp;Centrado en la soberanía de los datos: tu contenido, tu audiencia, y
tus estadísticas te pertenecen a ti y solo a ti.
- 🪄 &nbsp;Funciones de Podcasting 2.0: GUID (interfaz gráfica de usuario),
protección y bloqueo del podcast, transcripciones, monetización, episodios,
geo-localización, personas, fragmentos de audio, …
- 💬 &nbsp;Integración con redes sociales:
- 🚀 &nbsp;Castopod es parte del Fediverso, una red social descentralizada
- ❤️ &nbsp;Se puede crear mensajes, compartir, agregar a favoritos y comentar
en episodios
- 📈 &nbsp;Análisis estadísticos integrados:
- ⚖️ &nbsp;Compatible con GDPR / CCPA / LGPD
- 🪙 &nbsp;Medida de audiencia con el estándar IABv2
- 🏡 &nbsp;Estadísticas sin terceras partes involucradas
- 📢 &nbsp;Herramientas de marketing incorporadas:
- ✅ &nbsp;Listo para SEO (meta-etiquetas de open-graph, JSON-LD, …)
- 📱 &nbsp;PWA: instalable como una aplicación independiente
- 🎨 &nbsp;Personalizar los colores del tema
- 🎬 &nbsp;Generar recortes de vídeo listos para compartir, a partir de tus
episodios
- 🔉 &nbsp;Generar fragmentos de audio (Soundbites) para la promoción de tus
episodios.
- ▶️ &nbsp;Reproductor incrustable, con el que insertar tus episodios en
cualquier sitio web!
- 💸 &nbsp;Monetización:
- 🔗 &nbsp;Enlaces de financiación
- 📲 &nbsp;Anuncios publicitarios del tipo click-para-escuchar
- 🤝 &nbsp;value4value / WebMonetization (criptomonedas para creadores de
contenido).
- 💎 &nbsp;Premium podcasts
- 📡 &nbsp;Publica tus episodios en todas partes con RSS:
- 📱 &nbsp;En todos los directorios y aplicaciones: Podcast Index, Apple
Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Emite tus episodios al instante con WebSub.
- 📥 &nbsp;Importación de podcasts: mueve tu podcast existente en otro servicio
a tu servidor Castopod.
- 📤 &nbsp;Mueve tu podcast fuera de Castopod.
- 🔀 &nbsp;Multi-podcast: aloja tantos podcasts como quieras en una misma
instancia/panel de CASTOPOD.
- 👥 &nbsp;Multi-usuario: añade colaboradores y define roles.
- 🌎 &nbsp;Soporte multilingüe i18n: traducido al Inglés, Francés, Polaco,
Alemán, Portugués brasileño, Español, Noruego, … ¡y
[más por venir](https://translate.castopod.org)!
## Motivación
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.
## Comparación con otras soluciones
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. otras plataformas de podcast
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 other podcasting solutions:
- Castopod puede ser auto-hospedado en tu propio servidor y es la única solución
que te permite mantener un control completo sobre los contenidos que produces.
También, como es de código abierto, puedes incluso personalizarlo como desees
y necesites.
- Castopod es la única solución que hasta el momento integra tanto una red
social descentralizada con ActivityPub así como muchas de las características
del podcasting 2.0, con la esperanza de cerrar la brecha entre ambos.
## Cómo colaborar
Love Castopod and would like to help? Take a look at the following documentation
to get you started.
### Código de conducta
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/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be tolerated.
### Guía para colaborar
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.
## Colaboradores ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## Contacto
You may reach us for help or ask any question you have on:
- [Discord](https://castopod.org/discord) (para interacción directa con
desarrolladores y la comunidad)
- [Seguimiento de incidencias](https://code.castopod.org/adaures/castopod/-/issues)
(para informar de errores y solicitar nuevas funcionalidades)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@castopod) (instancia de Mastodon)
- [[Twitter](https://twitter.com/castopod)](https://twitter.com/castopod)
- [[LinkedIn](https://linkedin.com/company/ad-aures)](https://linkedin.com/company/castopod)
- [Facebook (próximamente?)](https://www.facebook.com/castopod)
## Patrocinadores
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
<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="Logo de Ad Aures"
class="h-16"
/>
</a>
<a
href="https://nlnet.nl/project/Castopod/"
target="_blank"
rel="noopener noreferrer"
>
<img src="/images/sponsors/nlnet.svg" alt="Logo de NLnet" class="h-16" />
</a>
</div>
## Licencia
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -1,10 +1,7 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
@ -15,7 +12,7 @@ coupled with custom rules. Roles and permissions are defined at two levels:
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
@ -23,11 +20,11 @@ coupled with custom rules. Roles and permissions are defined at two levels:
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
@ -41,47 +38,47 @@ coupled with custom rules. Roles and permissions are defined at two levels:
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Official Docker images
sidebarDepth: 3
---
# Official Docker images
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:

View file

@ -1,21 +1,20 @@
---
title: Installation
sidebarDepth: 3
title: How to install Castopod?
---
# How to install Castopod?
import { Aside } from "@astrojs/starlight/components";
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.
::: tip Note
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
:::
</Aside>
## Requirements
@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP:
> We recommend using [MariaDB](https://mariadb.org).
::: warning 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.
@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed:
2. Follow the instructions on your screen.
3. Start podcasting!
::: info Note
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
:::
</Aside>
### Using CLI
@ -226,13 +217,35 @@ 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
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>
<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>

View file

@ -1,9 +1,7 @@
---
title: Security
title: Security concerns
---
# 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).

View file

@ -1,9 +1,8 @@
---
title: Update
sidebarDepth: 3
title: How to update Castopod?
---
# How to update Castopod?
import { Aside } from "@astrojs/starlight/components";
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
@ -36,12 +35,12 @@ improvements ⚡.
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
@ -54,7 +53,7 @@ improvements ⚡.
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
@ -62,7 +61,7 @@ Releases may come with additional update instructions (see
- 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)
:::
</Aside>
## Fully Automated updates

View file

@ -0,0 +1,1381 @@
---
title: Welcome 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Install" href="./getting-started/install" />
## 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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## 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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -1,10 +1,7 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
@ -15,7 +12,7 @@ coupled with custom rules. Roles and permissions are defined at two levels:
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
@ -23,11 +20,11 @@ coupled with custom rules. Roles and permissions are defined at two levels:
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
@ -41,47 +38,47 @@ coupled with custom rules. Roles and permissions are defined at two levels:
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Official Docker images
sidebarDepth: 3
---
# Official Docker images
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:

View file

@ -1,21 +1,20 @@
---
title: Installation
sidebarDepth: 3
title: How to install Castopod?
---
# How to install Castopod?
import { Aside } from "@astrojs/starlight/components";
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.
::: tip Note
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
:::
</Aside>
## Requirements
@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP:
> We recommend using [MariaDB](https://mariadb.org).
::: warning 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.
@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed:
2. Follow the instructions on your screen.
3. Start podcasting!
::: info Note
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
:::
</Aside>
### Using CLI
@ -226,13 +217,35 @@ 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
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>
<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>

View file

@ -0,0 +1,24 @@
---
title: Ar surentez
---
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

@ -1,9 +1,8 @@
---
title: Update
sidebarDepth: 3
title: How to update Castopod?
---
# How to update Castopod?
import { Aside } from "@astrojs/starlight/components";
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
@ -36,12 +35,12 @@ improvements ⚡.
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
@ -54,7 +53,7 @@ improvements ⚡.
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
@ -62,7 +61,7 @@ Releases may come with additional update instructions (see
- 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)
:::
</Aside>
## Fully Automated updates

View file

@ -0,0 +1,1381 @@
---
title: Welcome 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Install" href="./getting-started/install" />
## 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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## 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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,85 @@
---
title: Authentification et Autorisation
---
Castopod gère l'authentification et l'autorisation à l'aide de
`codeigniter/shield` associés à des règles personnalisées. Les rôles et les
autorisations sont définis sur deux niveaux :
1. [à l'échelle de l'instance](#1-instance-wide-roles-and-permissions)
2. [par podcast](#2-per-podcast-roles-and-permissions)
## 1. Rôles et autorisations à l'échelle de l'instance
### Rôles dans linstance
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| -------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super administrat·rice·eur | A un contrôle complet sur Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Gestionnaire | Gère le contenu de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcast·rice·eur | Utilisateurs généraux de Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Autorisations dans l'instance
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | -------------------------------------------------------------------- |
| admin.access | Peut accéder à la zone d'administration Castopod. |
| admin.settings | Peut accéder aux paramètres de Castopod. |
| users.manage | Peut gérer les utilisateurs de Castopod. |
| persons.manage | Permet de gérer les personnes. |
| pages.manage | Permet de gérer les pages. |
| podcasts.view | Peut voir tous les podcasts. |
| podcasts.create | Peut créer de nouveaux podcasts. |
| podcasts.import | Peut importer des podcasts. |
| fediverse.manage-blocks | Peut empêcher des act·rice·eur·s/domaines d'interagir avec Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Rôles et autorisations par podcast
### Rôles par podcast
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ---------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Administrateur | A un contrôle total sur le podcast #\{id\}. | \* |
| Éditeur | Gère le contenu et les publications du podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Auteur / Autrice | Gère le contenu du podcast #\{id\} , mais ne peut pas le publier. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Invité | Contributeur général du podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Permissions par podcast
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | ---------------------------------------------------------------------------------------------------- |
| view | Peut voir le tableau de bord et les analyses du podcast #\{id\}. |
| edit | Peut éditer le podcast #\{id\}. |
| delete | Peut supprimer le podcast #\{id\}. |
| manage-import | Peut synchroniser le podcast importé #\{id\}. |
| manage-persons | Permet de gérer les abonnements au podcast #\{id\}. |
| manage-subscriptions | Permet de gérer les abonnements au podcast #\{id\}. |
| manage-contributors | Permet de gérer les contributeurs du podcast #\{id\}. |
| manage-platforms | Peut configurer/supprimer les liens de la plateforme du podcast #\{id\}. |
| manage-publications | Peut publier le podcast #\{id\}. |
| manage-notifications | Peut afficher et marquer les notifications comme lues pour le podcast #\{id\}. |
| interact-as | Peut interagir en tant que podcast #\{id\} pour mettre en favori, partager ou répondre aux messages. |
| episodes.view | Peut voir le tableau de bord et les statistiques du podcast #\{id\}. |
| episodes.create | Peut créer des épisodes pour le podcast #\{id\}. |
| episodes.edit | Peut modifier les épisodes du podcast #\{id\}. |
| episodes.delete | Peut supprimer les épisodes du podcast #\{id\}. |
| episodes.manage-persons | Peut gérer les intervenants des épisodes du podcast #\{id\}. |
| episodes.manage-clips | Permet de gérer les clips vidéo ou les parties sonores du podcast #\{id\}. |
| episodes.manage-publications | Peut publier/dépublier des épisodes et des messages de podcast #\{id\}. |
| episodes.manage-comments | Peut créer/supprimer les commentaires de l'épisode du podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Images officielles Docker
sidebarDepth: 3
title: Images officielles de Docker
---
# Images officielles de Docker
Castopod envoie 3 images Docker au Hub Docker pendant son processus de
construction automatisée :

View file

@ -1,22 +1,21 @@
---
title: Installation
sidebarDepth: 3
title: Comment installer Castopod?
---
# Comment installer Castopod?
import { Aside } from "@astrojs/starlight/components";
Castopod a été pensé pour être facile à installer. Que vous utilisiez un
hébergement dédié ou mutualisé, vous pouvez l'installer sur la plupart des
serveurs web compatibles avec PHP-MySQL.
::: Note d'astuce
<Aside>
Nous avons publié des images officielles Docker pour Castopod!
Si vous préférez utiliser Docker, vous pouvez sauter cette partie et aller
directement à la [documentation Docker](./docker.md) pour Castopod.
:::
</Aside>
## Prérequis
@ -49,14 +48,6 @@ De plus, assurez-vous que les extensions suivantes sont activées dans votre PHP
> Nous vous recommandons d'utiliser [MariaDB](https://mariadb.org).
::: warning Attention
Castopod ne fonctionne qu'avec les bases de données MySQL 5.7 ou plus récentes.
Les versions 5.6 (dont le support a cessé le 5 février 2021) ou précédentes de
MySQL ne fonctionneront pas.
:::
Vous aurez besoin du nom d'hôte du serveur, du nom de la base de données, du nom
d'utilisateur et du mot de passe pour terminer le processus d'installation. Si
vous ne disposez pas de ces informations, veuillez contacter votre
@ -121,13 +112,13 @@ installées :
2. Suivez les instructions affichée.
3. Commencer à baladodiffuser!
:::info Note
<Aside>
Le script d'installation crée un fichier `.env` à la racine du paquet. Si vous
ne pouvez pas passer par l'assistant d'installation, vous pouvez créer et éditer
le fichier `.env` manuellement en vous appuyant sur le fichier `.env.example`.
:::
</Aside>
### Utilisation du CLI
@ -234,13 +225,35 @@ simplifier l'auto-hébergement.
<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="Installer avec YunoHost" class="align-middle" />
<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="Installer avec 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>Dépôt
Github</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>
Dépôt Github
</a>
</div>

View file

@ -1,9 +1,7 @@
---
title: Sécurité
title: Questions de sécurité
---
# Questions de sécurité
Castopod est développé sur [CodeIgniter4](https://codeigniter.com/), un
framework PHP qui encourage
[de bonnes pratiques de sécurité](https://codeigniter.com/user_guide/concepts/security.html).

View file

@ -1,9 +1,8 @@
---
title: Mise à jour
sidebarDepth: 3
title: Comment installer Castopod?
---
# Comment installer Castopod?
import { Aside } from "@astrojs/starlight/components";
Après avoir installé Castopod, vous pouvez mettre à jour votre instance vers la
dernière version afin de profiter des dernières fonctionnalités ✨, des
@ -37,13 +36,13 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
- Supprimer tous les fichiers sauf `.env` et `public/media`
- Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur
::: info Note
<Aside>
Vous devrez peut-être re-définir les autorisations de fichiers comme
effectué durant le processus d'installation. Vérifiez les
[questions de sécurité](./security.md).
:::
</Aside>
4. Mettez à jour votre schéma de base de données depuis
`Administrateur Castopod` > `À propos` ou en exécutant :
@ -56,16 +55,16 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
`Général` > `Foyer`
6. ✨Profitez de votre nouvelle instance, vous avez terminé !
::: Note d'information
<Aside>
Les versions peuvent être accompagnées d'instructions de mise à jour
supplémentaires (cf. la
[page des notes de versions](https://code.castopod.org/adaures/castopod/-/releases)).
- Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire
?</a>
- cf. Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire
?
:::
</Aside>
## Mises à jour entièrement automatisées

View file

@ -0,0 +1,1416 @@
---
title: Bienvenue 👋
description:
Castopod est une plateforme dhébergement gratuite & open-source conçue pour
les podcasteurs qui veulent échanger et interagir avec leur public.
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod est une plateforme dhébergement gratuite & open-source conçue pour les
podcasteurs qui veulent échanger et interagir avec leur public.
Castopod est facile à installer et a été conçu avec
[CodeIgniter4](https://codeigniter.com/), un framework PHP puissant de très
petite taille.
<LinkCard title="Installer" href="./getting-started/install" />
## Fonctionnalités
- 🌱 &nbsp;Libre, gratuit & open-source (Licence AGPL v3)
- 🔐 &nbsp;focalisé sur la souveraineté des données: votre contenu, votre
audience et vos statiistiques vous appartiennent, et à vous seulement
- 🪄&nbsp;Fonctionnalités du Podcasting 2.0 : GUID, verrouillage,
transcriptions, financement, chapitres, géo-localisation, intervenants,
extraits sonores, …
- 💬 &nbsp;Réseau social intégré:
- 🚀 &nbsp;Castopod fait partie du Fédivers, un réseau social décentralisé
- ❤️ &nbsp;Créer des publications, partager, mettre en favori et commenter des
épisodes
- 📈 &nbsp;Statistiques intégrées:
- ⚖️ &nbsp;Conforme GDPR / CCPA / LGPD
- 🪙&nbsp;Mesure d'audience IABv2
- 🏡 &nbsp;Statistiques intégrées, aucune tierce partie intermédiaire
- 📢 &nbsp;Outils de marketing intégrés:
- ✅ &nbsp;Prêt pour le SEO (méta-tags open-graph, JSON-LD…)
- 📱 &nbsp;PWA: installez comme application autonome
- 🎨 &nbsp;Couleurs de thèmes personnalisables
- 🎬 &nbsp;Générez des clips vidéo prêts à partager à partir d'épisodes
- 🔉 &nbsp;Générez des extraits sonores
- ▶️ &nbsp;Intégrer vos épisodes dans n'importe quel site web
- 💸 &nbsp;Monétisation:
- 🔗 &nbsp;Liens de financement
- 📲 &nbsp;publicité “listen-to-click”
- 🤝 &nbsp;value4value / WebMonetization
- 💎 &nbsp;Podcasts premium
- 📡&nbsp;Publiez vos épisodes partout avec RSS:
- 📱 &nbsp;Sur tous les index et toutes les applications : Podcast Index,
Podcasts Apple, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend…
- ⚡&nbsp;Diffusez instantanément vos épisodes avec WebSub
- 📥 &nbsp;Importation de Podcast : déménagez votre podcast existant vers
Castopod
- 📤 &nbsp;Déplacez votre podcast chez un autre hébergeur
- 🔀 &nbsp;Multi-locataire: hébergez autant de podcasts que vous le souhaitez
- 👥 &nbsp;Multi-utilisateur : ajoutez des contributeurs et définissez leurs
rôles
- 🌎 &nbsp;support de i18n : traduit en anglais, français, polonais, allemand,
portugais, brésilien & espagnol… et
[plus à l'avenir](https://translate.castopod.org)!
## Pourquoi Castopod?
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.
## Comparaison avec d'autres 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 Autres hébergeurs de podcasts
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 other podcasting solutions:
- Castopod peut être auto-hébergé et est la seule solution qui vous permet de
garder le contrôle total sur ce que vous produisez. D'autre part, comme il est
open-source, vous avez le pouvoir de le modifier comme vous le souhaitez.
- Castopod est la seule solution qui intègre aujourd'hui à la fois un réseau
social décentralisé avec ActivityPub et des fonctionnalités de «Podcasting
2.0 », réduisant ainsi l'écart entre les deux.
## Contribuer
Love Castopod and would like to help? Take a look at the following documentation
to get you started.
### Code de conduite
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/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be tolerated.
### Guide de contribution
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.
## Contributeurs ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## Contact
You may reach us for help or ask any question you have on:
- [Discord](https://castopod.org/discord) (pour dialoguer en temps réel avec les
développeurs et la communauté)
- [Suivi de problèmes](https://code.castopod.org/adaures/castopod/-/issues)
(pour toute demande de nouvelle fonctionnalité ou rapport de bug)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (Instance Mastodon)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Sponsors
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
<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="Logo d'Ad Aures"
class="h-16"
/>
</a>
<a
href="https://nlnet.nl/project/Castopod/"
target="_blank"
rel="noopener noreferrer"
>
<img src="/images/sponsors/nlnet.svg" alt="Logo de NLnet" class="h-16" />
</a>
</div>
## Licence
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).
[release]: https://code.castopod.org/adaures/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/adaures/castopod/-/blob/beta/LICENSE.md
[license-badge]: https://img.shields.io/github/license/ad-aures/castopod?color=blue
[contributions]: https://code.castopod.org/adaures/castopod/-/issues
[contributions-badge]: https://img.shields.io/badge/contributions-welcome-brightgreen.svg
[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
[crowdin]: https://translate.castopod.org/project/castopod
[crowdin-badge]: https://badges.crowdin.net/castopod/localized.svg

View file

@ -0,0 +1,85 @@
---
title: Authentification et Autorisation
---
Castopod gère l'authentification et l'autorisation à l'aide de
`codeigniter/shield` associés à des règles personnalisées. Les rôles et les
autorisations sont définis sur deux niveaux :
1. [à l'échelle de l'instance](#1-instance-wide-roles-and-permissions)
2. [par podcast](#2-per-podcast-roles-and-permissions)
## 1. Rôles et autorisations à l'échelle de l'instance
### Rôles dans linstance
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Autorisations dans l'instance
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Rôles et autorisations par podcast
### Rôles par podcast
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Permissions par podcast
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -0,0 +1,158 @@
---
title: Images officielles de Docker
---
Castopod envoie 3 images Docker au Hub Docker pendant son processus de
construction automatisée :
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): une
image castopod tout-en-un sous nginx unit
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): le paquet
d'applications avec toutes les dépendances de Castopod
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): une
configuration Nginx pour Castopod
De plus, Castopod nécessite une base de données compatible avec MySQL. Une base
de données Redis peut être ajoutée en tant que gestionnaire de cache.
## Tags supportés
- `développer` [unstable], la dernière version de la branche de développement
- `beta` [stable], dernière version bêta
- `beta` [stable], dernière version bêta
- `1.x.x` [stable], version spécifique (depuis `1.0.0`)
## Exemple d'utilisation
1. Installez [docker](https://docs.docker.com/get-docker/) et
[docker-compose](https://docs.docker.com/compose/install/)
2. Créez un fichier `docker-compose.yml` avec les éléments suivants :
```yml
version: "3.7"
services:
app:
image: castopod/castopod:latest
container_name: "castopod-app"
volumes:
- castopod-media:/var/www/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
CP_BASEURL: "https://castopod.example.com"
CP_ANALYTICS_SALT: changeme
CP_CACHE_HANDLER: redis
CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks:
- castopod-app
- castopod-db
ports:
- 8000:8000
restart: unless-stopped
mariadb:
image: mariadb:10.5
container_name: "castopod-mariadb"
networks:
- castopod-db
volumes:
- castopod-db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
restart: unless-stopped
redis:
image: redis:7.0-alpine
container_name: "castopod-redis"
command: --requirepass changeme
volumes:
- castopod-cache:/data
networks:
- castopod-app
volumes:
castopod-media:
castopod-db:
castopod-cache:
networks:
castopod-app:
castopod-db:
```
Vous devez adapter certaines variables à vos besoins (p. ex. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` et `CP_ANALYTICS_SALT`).
3. Setup a reverse proxy for TLS (SSL/HTTPS)
TLS is mandatory for ActivityPub to work. This job can easily be handled by
a reverse proxy, for example with [Caddy](https://caddyserver.com/):
```
#castopod
castopod.example.com {
reverse_proxy localhost:8000
}
```
4. Exécutez `docker-compose up -d`, attendez qu'il s'initialise sur
`https://castopod.example.com/cp-install` pour terminer la configuration de
Castopod !
5. Vous êtes prêt, commencez à podcaster! 🎙️🚀
## Environment Variables
- **castopod/castopod** and **castopod/app**
| Nom de la variable | Type (`default`) | Par défaut |
| ------------------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` |
| **`CP_EMAIL_FROM`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` |
| **`CP_ENABLE_2FA`** | ?boolean | `undefined` |
| **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` |
| **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` |
| **`CP_MEDIA_S3_KEY`** | ?string | `undefined` |
| **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_REGION`** | ?string | `undefined` |
| **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` |
| **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` |
| **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` |
| **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
- **castopod/web-server**
| Variable name | Type | Par défaut |
| ---------------------- | --------------------- | ---------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |

View file

@ -0,0 +1,256 @@
---
title: Comment installer Castopod?
---
import { Aside } from "@astrojs/starlight/components";
Castopod a été pensé pour être facile à installer. Que vous utilisiez un
hébergement dédié ou mutualisé, vous pouvez l'installer sur la plupart des
serveurs web compatibles avec PHP-MySQL.
<Aside>
Nous avons publié des images officielles Docker pour Castopod!
Si vous préférez utiliser Docker, vous pouvez sauter cette partie et aller
directement à la [documentation Docker](./docker.md) pour Castopod.
</Aside>
## Prérequis
- PHP v8.1 or higher
- MySQL version 5.7 ou supérieure ou MariaDB version 10.2 ou supérieure
- Prise en charge HTTPS
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.1 or higher
PHP version 8.1 or higher is required, with the following extensions installed:
- [intl](https://www.php.net/manual/fr/intl.requirements.php)
- [libcurl](https://www.php.net/manual/fr/curl.requirements.php)
- [mbstring](https://www.php.net/manual/fr/mbstring.installation.php)
- [gd](https://www.php.net/manual/en/image.installation.php) avec **JPEG**,
**PNG** et bibliothèques **WEBP**.
- [exif](https://www.php.net/manual/fr/exif.installation.php)
De plus, assurez-vous que les extensions suivantes sont activées dans votre PHP
:
- json (activé par défaut - ne le désactivez pas)
- xml (activé par défaut - ne pas le désactiver)
- [mysqlnd](https://www.php.net/manual/fr/mysqlnd.install.php)
### Base de données compatible MySQL
> Nous vous recommandons d'utiliser [MariaDB](https://mariadb.org).
Vous aurez besoin du nom d'hôte du serveur, du nom de la base de données, du nom
d'utilisateur et du mot de passe pour terminer le processus d'installation. Si
vous ne disposez pas de ces informations, veuillez contacter votre
administrateur.
#### Droits d'accès
L'utilisateur doit avoir au moins ces droits d'accès sur la base de données pour
que Castopod fonctionne : `CREATE`, `ALTER`, `DELETE`, `EXECUTE`,
`INDEX`,`INSERT`, `SELECT`, `UPDATE`,`REFERENCES`, `CREATE VIEW`.
### (Facultatif) FFmpeg v4.1.8 ou supérieur pour les clips vidéo
[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 ou supérieure est requis si vous
souhaitez générer des Clips Vidéo. Les extensions suivantes doivent être
installées :
- bibliothèque **FreeType 2** pour
[gd](https://www.php.net/manual/en/image.installation.php).
### (Facultatif) Autres recommandations
- Redis pour de meilleures performances de cache.
- CDN pour la mise en cache de fichiers statiques et de meilleures performances.
- passerelle e-mail pour les mots de passe perdus.
## Instructions d'installation
### Pré-requis
0. Obtenez un serveur Web avec [les pré-requis](#requirements) installés
1. Créer une base de données MySQL pour Castopod avec un utilisateur ayant les
droits d'accès et les droits de modification (pour plus d'informations, cf.
[base de données compatible MySQL](#mysql-compatible-database)).
2. Activez HTTPS sur votre domaine avec un _certificat SSL_.
3. Téléchargez et dézippez le dernier [paquet Castopod](https://castopod.org/)
sur le serveur web si vous ne l'avez pas déjà fait.
- ⚠️ Faites pointer la racine du document du serveur web vers le sous-dossier
`public/` du dossier `castopod`.
4. Add **cron tasks** on your web server for various background processes
(replace the paths accordingly):
```bash
* * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
```
**Note** - If you do not add this cron task, the following Castopod features
will not work:
- Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using
[WebSub](https://en.wikipedia.org/wiki/WebSub)
- Generating video clips -
[requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (Méthode recommandée) Assistant d'installation
1. Exécutez le script d'installation de Castopod en vous rendant sur la page
d'assistant d'installation (`https://votre_domain_name.com/cp-install`) dans
votre navigateur Web favori.
2. Suivez les instructions affichée.
3. Commencer à baladodiffuser!
<Aside>
Le script d'installation crée un fichier `.env` à la racine du paquet. Si vous
ne pouvez pas passer par l'assistant d'installation, vous pouvez créer et éditer
le fichier `.env` manuellement en vous appuyant sur le fichier `.env.example`.
</Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### Email/SMTP setup
Email configuration is required for some features to work properly (eg.
retrieving your forgotten password, sending instructions to premium subscribers,
…)
You may add your email configuration in your instance's `.env` like so:
```ini
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email config options
| Variable name | Type | Default |
| ---------------- | -------------------- | ------------ |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
By default, files are saved to the `public/media` folder using the file system.
If you need to relocate the `media` folder to a different location, you can
specify it in your `.env` file as shown below:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In this example, the files will be saved to the /mnt/storage/media folder. Make
sure to also update your web server configuration to reflect this change.
### S3
If you prefer storing your media files on an S3 compatible storage, you may
specify it in your `.env`:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 config options
| Variable name | Type | Default |
| ----------------------- | ------- | ----------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## Paquets fournis par la communauté
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="Installer avec 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>
Dépôt Github
</a>
</div>

View file

@ -0,0 +1,26 @@
---
title: Questions de sécurité
---
Castopod est développé sur [CodeIgniter4](https://codeigniter.com/), un
framework PHP qui encourage
[de bonnes pratiques de sécurité](https://codeigniter.com/user_guide/concepts/security.html).
Pour garantir au mieux la sécurité de votre instance et éviter les attaques
malveillantes, nous vous recommandons de mettre à jour les permissions des
fichiers de Castopod après l'installation et chaque mise à jour (et éviter toute
erreur de droit d'accès aux fichiers) :
- Le dossier `writable/` doit être accessible en **lecture** et en **écriture**.
- Le dossier `public/media/` doit être accessible en **lecture** et en
**écriture**.
- tout autre fichier doit être accessible en **lecture seule**.
Par exemple, si vous utilisez Apache ou NGINX avec Ubuntu, vous pouvez exécuter
les commandes suivantes:
```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,110 @@
---
title: Comment installer Castopod?
---
import { Aside } from "@astrojs/starlight/components";
Après avoir installé Castopod, vous pouvez mettre à jour votre instance vers la
dernière version afin de profiter des dernières fonctionnalités ✨, des
corrections de bugs 🐛 et des améliorations de performance ⚡.
## Instructions de mise à jour
0. ⚠️ Avant toute mise à jour, nous vous recommandons fortement de sauvegarder
vos fichiers Castopod et la base de données .
- cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the
[releases page](https://code.castopod.org/adaures/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
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. Sur votre serveur:
- Supprimer tous les fichiers sauf `.env` et `public/media`
- Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur
<Aside>
Vous devrez peut-être re-définir les autorisations de fichiers comme
effectué durant le processus d'installation. Check
[Security Concerns](./security.md).
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨Profitez de votre nouvelle instance, vous avez terminé !
<Aside>
Les versions peuvent être accompagnées d'instructions de mise à jour
supplémentaires (cf. la
[page des notes de versions](https://code.castopod.org/adaures/castopod/-/releases)).
- Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?
</Aside>
## Mises à jour entièrement automatisées
> Prochainement... 👀
## Foire Aux Questions (FAQ)
### Où puis-je trouver ma version de Castopod ?
Allez dans votre panneau d'administration de Castopod, la version s'affiche en
bas à gauche.
Vous pouvez également trouver la version dans l'application
`> Configuration > Constantes.php` dossier.
### [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
Pas de problème ! Il suffit d'obtenir la dernière version comme décrit
ci-dessus. Lorsque vous exécutez les instructions de mise à jour (4), lancez-les
séquentiellement, de la plus ancienne à la plus récente.
> Vous devriez sauvegarder votre instance selon la date de votre dernière mise à
> jour de Castopod.
Par exemple, si vous êtes en `v1.0.0-alpha.42` et souhaitez mettre à jour vers
la `v1.0.0-beta.1`:
0. (fortement recommandé) Faites une sauvegarde de vos fichiers et de votre base
de données.
1. Téléchargez la dernière version, écrasez vos fichiers tout en conservant
`.env` et `public/media`.
2. Effectuez les instructions de mise à jour l'une après l'autre (de la plus
ancienne à la plus récente).
3. ✨ Votre nouvelle instance est prête !
### Dois-je faire une sauvegarde avant de mettre à jour ?
Nous vous conseillons de le faire, afin de ne pas tout perdre si quelque chose
se passait mal!
Plus généralement, nous vous conseillons de faire des sauvegardes régulières de
vos fichiers Castopod et de votre base de données afin d'éviter de tout perdre…

View file

@ -0,0 +1,1416 @@
---
title: Bienvenue 👋
description:
Castopod est une plateforme dhébergement gratuite & open-source conçue pour
les podcasteurs qui veulent échanger et interagir avec leur public.
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod est une plateforme dhébergement gratuite & open-source conçue pour les
podcasteurs qui veulent échanger et interagir avec leur public.
Castopod est facile à installer et a été conçu avec
[CodeIgniter4](https://codeigniter.com/), un framework PHP puissant de très
petite taille.
<LinkCard title="Installer" href="./getting-started/install" />
## Fonctionnalités
- 🌱 &nbsp;Libre, gratuit & open-source (Licence AGPL v3)
- 🔐 &nbsp;focalisé sur la souveraineté des données: votre contenu, votre
audience et vos statiistiques vous appartiennent, et à vous seulement
- 🪄&nbsp;Fonctionnalités du Podcasting 2.0 : GUID, verrouillage,
transcriptions, financement, chapitres, géo-localisation, intervenants,
extraits sonores, …
- 💬 &nbsp;Réseau social intégré:
- 🚀 &nbsp;Castopod fait partie du Fédivers, un réseau social décentralisé
- ❤️ &nbsp;Créer des publications, partager, mettre en favori et commenter des
épisodes
- 📈 &nbsp;Statistiques intégrées:
- ⚖️ &nbsp;Conforme GDPR / CCPA / LGPD
- 🪙&nbsp;Mesure d'audience IABv2
- 🏡 &nbsp;Statistiques intégrées, aucune tierce partie intermédiaire
- 📢 &nbsp;Outils de marketing intégrés:
- ✅ &nbsp;Prêt pour le SEO (méta-tags open-graph, JSON-LD…)
- 📱 &nbsp;PWA: installez comme application autonome
- 🎨 &nbsp;Couleurs de thèmes personnalisables
- 🎬 &nbsp;Générez des clips vidéo prêts à partager à partir d'épisodes
- 🔉 &nbsp;Générez des extraits sonores
- ▶️ &nbsp;Intégrer vos épisodes dans n'importe quel site web
- 💸 &nbsp;Monétisation:
- 🔗 &nbsp;Liens de financement
- 📲 &nbsp;publicité “listen-to-click”
- 🤝 &nbsp;value4value / WebMonetization
- 💎 &nbsp;Podcasts premium
- 📡&nbsp;Publiez vos épisodes partout avec RSS:
- 📱 &nbsp;Sur tous les index et toutes les applications : Podcast Index,
Podcasts Apple, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend…
- ⚡&nbsp;Diffusez instantanément vos épisodes avec WebSub
- 📥 &nbsp;Importation de Podcast : déménagez votre podcast existant vers
Castopod
- 📤 &nbsp;Déplacez votre podcast chez un autre hébergeur
- 🔀 &nbsp;Multi-locataire: hébergez autant de podcasts que vous le souhaitez
- 👥 &nbsp;Multi-utilisateur : ajoutez des contributeurs et définissez leurs
rôles
- 🌎 &nbsp;support de i18n : traduit en anglais, français, polonais, allemand,
portugais, brésilien & espagnol… et
[plus à l'avenir](https://translate.castopod.org)!
## Pourquoi Castopod?
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.
## Comparaison avec d'autres 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 Autres hébergeurs de podcasts
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 other podcasting solutions:
- Castopod peut être auto-hébergé et est la seule solution qui vous permet de
garder le contrôle total sur ce que vous produisez. D'autre part, comme il est
open-source, vous avez le pouvoir de le modifier comme vous le souhaitez.
- Castopod est la seule solution qui intègre aujourd'hui à la fois un réseau
social décentralisé avec ActivityPub et des fonctionnalités de «Podcasting
2.0 », réduisant ainsi l'écart entre les deux.
## Contribuer
Love Castopod and would like to help? Take a look at the following documentation
to get you started.
### Code de conduite
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/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be tolerated.
### Guide de contribution
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.
## Contributeurs ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## Contact
You may reach us for help or ask any question you have on:
- [Discord](https://castopod.org/discord) (pour dialoguer en temps réel avec les
développeurs et la communauté)
- [Suivi de problèmes](https://code.castopod.org/adaures/castopod/-/issues)
(pour toute demande de nouvelle fonctionnalité ou rapport de bug)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (Instance Mastodon)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Sponsors
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
<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="Logo d'Ad Aures"
class="h-16"
/>
</a>
<a
href="https://nlnet.nl/project/Castopod/"
target="_blank"
rel="noopener noreferrer"
>
<img src="/images/sponsors/nlnet.svg" alt="Logo de NLnet" class="h-16" />
</a>
</div>
## Licence
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).
[release]: https://code.castopod.org/adaures/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/adaures/castopod/-/blob/beta/LICENSE.md
[license-badge]: https://img.shields.io/github/license/ad-aures/castopod?color=blue
[contributions]: https://code.castopod.org/adaures/castopod/-/issues
[contributions-badge]: https://img.shields.io/badge/contributions-welcome-brightgreen.svg
[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
[crowdin]: https://translate.castopod.org/project/castopod
[crowdin-badge]: https://badges.crowdin.net/castopod/localized.svg

View file

@ -0,0 +1,84 @@
---
title: Authentication & Authorization
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------ |
| Sàr-rianaire | Smachd gu lèir air Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manaidsear | Stiùireadh susbaint Chastopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Pod-chraoladair | Luchd-cleachdaidh coitcheann Chastopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | --------------------------------------------------------------------------------------------- |
| admin.access | S urrainn dhaibh raon rianachd Chastopod inntrigeadh. |
| admin.settings | S urrainn dhaibh roghainnean Chastopod inntrigeadh. |
| users.manage | S urrainn dhaibh luchdc-leachdaidh Chastopod a stiùireadh. |
| persons.manage | S urrainn dhaibh daoine a stiùireadh. |
| pages.manage | S urrainn dhaibh duilleagan a stiùireadh. |
| podcasts.view | Chì iad a h-uile pod-chraoladh. |
| podcasts.create | S urrainn dhaibh pod-chraolaidhean ùra a chruthachadh. |
| podcasts.import | S urrainn dhaibh pod-chraolaidhean ion-phortadh. |
| fediverse.manage-blocks | S urrainn dhaibh actairean/àrainnean a cho-shaoghail a bhacadh o eadar-ghabhail le Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| --------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Rianaire | Smachd gu lèir air air a phod-chraoladh #\{id\}. | \* |
| Deasaiche | A stiùireadh susbaint is foillseachaidhean a phod-chraoladh #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Ùghdar | A stiùireadh susbaint a phod-chraolaidh #\{id\} ach gun chomas foillseachaidh. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Aoigh | Neach-cuideachaidh a phod-chraolaidh #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| view | Cead an deas-bhòrd agus anailiseachd a phod-chraolaidh #\{id\} a shealltainn. |
| edit | S urrainn dhaibh am pod-chraoladh #\{id\} a dheasachadh. |
| delete | S urrainn dhaibh am pod-chraoladh #\{id\} a sguabadh às. |
| manage-import | S urrainn dhaibh am pod-chraoladh #\{id\} air ion-phortadh a shioncronachadh. |
| manage-persons | S urrainn dhaibh na fo-sgrìobhaidhean air a phod-chraoladh #\{id\} a stiùireadh. |
| manage-subscriptions | S urrainn dhaibh na fo-sgrìobhaidhean air a phod-chraoladh #\{id\} a stiùireadh. |
| manage-contributors | S urrainn dhaibh an luchd-cuideachaidh aig a phod-chraoladh #\{id\} a stiùireadh. |
| manage-platforms | S urrainn dhaibh ceanglaichean-ùrlair a phod-chraolaidh #\{id\} a shuidheachadh/a thoirt air falbh. |
| manage-publications | S urrainn dhaibh am pod-chraoladh #\{id\} fhoillseachadh. |
| manage-notifications | Chì iad brathan a phod-chraolaidh #\{id\} agus s urrainn dhaibh comharra a chur gun deach an leughadh. |
| interact-as | S urrainn dhaibh eadar-ghabhail na phod-chraoladh #\{id\} airson annsachdan, co-roinneadh is freagairtean do phostaichean. |
| episodes.view | Chì iad deas-bhùird is anailiseachd do dheapasodan a phod-chraolaidh #\{id\}. |
| episodes.create | S urrainn dhaibh eapasodan a chruthachadh dhan phod-chraoladh #\{id\}. |
| episodes.edit | S urrainn dhaibh eapasodan a phod-chraolaidh #\{id\} a dheasachadh. |
| episodes.delete | S urrainn dhaibh eapasodan a phod-chraolaidh #\{id\} a sguabadh às. |
| episodes.manage-persons | S urrainn dhaibh daoine nan eapasodan aig a phod-chraoladh #\{id\} a stiùireadh. |
| episodes.manage-clips | S urrainn dhaibh cliopaichean video no blasan-fuaime aig a phod-chraoladh #\{id\} a stiùireadh. |
| episodes.manage-publications | S urrainn dhaibh eapasodan is postaichean a phod-chraolaidh #\{id\} fhoillseachadh/neo-fhoillseachadh. |
| episodes.manage-comments | S urrainn dhaibh beachdan air eapasod a phod-chraolaidh #\{id\} a chruthachadh/a thoirt air falbh. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -1,10 +1,7 @@
---
title: Official Docker images
sidebarDepth: 3
---
# Official Docker images
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:

View file

@ -0,0 +1,251 @@
---
title: How to install Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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.
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
</Aside>
## Requirements
- PHP v8.1 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.1 or higher
PHP version 8.1 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.
- [exif](https://www.php.net/manual/en/exif.installation.php)
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).
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`,
`REFERENCES`, `CREATE VIEW`.
### (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):
```bash
* * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
```
**Note** - If you do not add this cron task, the following Castopod features
will not work:
- Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using
[WebSub](https://en.wikipedia.org/wiki/WebSub)
- Generating video clips -
[requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (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!
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
</Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### Email/SMTP setup
Email configuration is required for some features to work properly (eg.
retrieving your forgotten password, sending instructions to premium subscribers,
…)
You may add your email configuration in your instance's `.env` like so:
```ini
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email config options
| Variable name | Type | Default |
| ---------------- | -------------------- | ------------ |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
By default, files are saved to the `public/media` folder using the file system.
If you need to relocate the `media` folder to a different location, you can
specify it in your `.env` file as shown below:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In this example, the files will be saved to the /mnt/storage/media folder. Make
sure to also update your web server configuration to reflect this change.
### S3
If you prefer storing your media files on an S3 compatible storage, you may
specify it in your `.env`:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 config options
| Variable name | Type | Default |
| ----------------------- | ------- | ----------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## 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>

View file

@ -0,0 +1,24 @@
---
title: 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

@ -1,9 +1,8 @@
---
title: Update
sidebarDepth: 3
title: How to update Castopod?
---
# How to update Castopod?
import { Aside } from "@astrojs/starlight/components";
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
@ -36,12 +35,12 @@ improvements ⚡.
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
@ -54,7 +53,7 @@ improvements ⚡.
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
@ -62,7 +61,7 @@ Releases may come with additional update instructions (see
- 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)
:::
</Aside>
## Fully Automated updates

View file

@ -0,0 +1,1381 @@
---
title: Welcome 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Install" href="./getting-started/install" />
## 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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## 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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,84 @@
---
title: Authentication & Authorization
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ------------------------------------ | ------------------------------------------------------------------------------------------ |
| Super Admin | Ten control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Xestora | Quen xestiona o contido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | Usuaria común de Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------------------ |
| admin.access | Pode acceder á área de administración. |
| admin.settings | Pode acceder aos axustes de Castopod. |
| users.manage | Pode xestionar as usuarias de Castopod. |
| persons.manage | Pode xestionar persoas. |
| pages.manage | Pode xestionar páxinas. |
| podcasts.view | Pode ver tódolos podcast. |
| podcasts.create | Pode crear novos podcast. |
| podcasts.import | Pode importar podcasts. |
| fediverse.manage-blocks | Pode bloquear actores/dominios do fediverso evitando interactuar con Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| --------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Ten control total sobre o podcast #\{id\}. | \* |
| Editora | Persoa que xestiona o contido e publicacións do podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Autora | Persoa que xestiona o contido do podcast #\{id\} pero non pode publicalo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Convidada | Contribuínte básico ao podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | ----------------------------------------------------------------------------------------- |
| view | Pode ver o taboleiro e estatísticas do podcast #\{id\}. |
| edit | Pode editar o podcast #\{id\}. |
| delete | Pode eliminar o podcast #\{id\}. |
| manage-import | Pode sincronizar o podcast importado #\{id\}. |
| manage-persons | Pode xestionar as subscricións do podcast #\{id\}. |
| manage-subscriptions | Pode xestionar as subscricións do podcast #\{id\}. |
| manage-contributors | Pode xestionar as contribucións ao podcast #\{id\}. |
| manage-platforms | Pode establecer/eliminar ligazóns a plataformas do podcast #\{id\}. |
| manage-publications | Pode publicar o podcast #\{id\}. |
| manage-notifications | Pode ver e marcar as notificacións como lidas no podcast #\{id\}. |
| interact-as | Pode actuar como o podcast #\{id\} para compartir, favorecer ou responder a publicacións. |
| episodes.view | Pode ver os taboleiros e estatísticas dos episodios do podcast #\{id\}. |
| episodes.create | Pode crear episodios para o podcast #\{id\}. |
| episodes.edit | Pode editar os episodios do podcast #\{id\}. |
| episodes.delete | Pode eliminar episodios do podcast #\{id\}. |
| episodes.manage-persons | Pode xestionar as persoas do episodio do podcast #\{id\}. |
| episodes.manage-clips | Pode xestionar os clips de vídeo e extractos de audio do podcast #\{id\}. |
| episodes.manage-publications | Pode publicar/retirar episodios e publicacións do podcast #\{id\}. |
| episodes.manage-comments | Pode crear/eliminar comentarios dos episodios do podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -0,0 +1,157 @@
---
title: Official Docker images
---
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all
in one castopod image using nginx unit
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod
Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler.
## Supported tags
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage
1. Install [docker](https://docs.docker.com/get-docker/) and
[docker-compose](https://docs.docker.com/compose/install/)
2. Create a `docker-compose.yml` file with the following:
```yml
version: "3.7"
services:
app:
image: castopod/castopod:latest
container_name: "castopod-app"
volumes:
- castopod-media:/var/www/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
CP_BASEURL: "https://castopod.example.com"
CP_ANALYTICS_SALT: changeme
CP_CACHE_HANDLER: redis
CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks:
- castopod-app
- castopod-db
ports:
- 8000:8000
restart: unless-stopped
mariadb:
image: mariadb:10.5
container_name: "castopod-mariadb"
networks:
- castopod-db
volumes:
- castopod-db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
restart: unless-stopped
redis:
image: redis:7.0-alpine
container_name: "castopod-redis"
command: --requirepass changeme
volumes:
- castopod-cache:/data
networks:
- castopod-app
volumes:
castopod-media:
castopod-db:
castopod-cache:
networks:
castopod-app:
castopod-db:
```
You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
3. Setup a reverse proxy for TLS (SSL/HTTPS)
TLS is mandatory for ActivityPub to work. This job can easily be handled by
a reverse proxy, for example with [Caddy](https://caddyserver.com/):
```
#castopod
castopod.example.com {
reverse_proxy localhost:8000
}
```
4. Run `docker-compose up -d`, wait for it to initialize and head on to
`https://castopod.example.com/cp-install` to finish setting up Castopod!
5. You're all set, start podcasting! 🎙️🚀
## Environment Variables
- **castopod/castopod** and **castopod/app**
| Variable name | Type (`default`) | Default |
| ------------------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` |
| **`CP_EMAIL_FROM`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` |
| **`CP_ENABLE_2FA`** | ?boolean | `undefined` |
| **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` |
| **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` |
| **`CP_MEDIA_S3_KEY`** | ?string | `undefined` |
| **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_REGION`** | ?string | `undefined` |
| **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` |
| **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` |
| **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` |
| **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
- **castopod/web-server**
| Variable name | Type | Default |
| ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |

View file

@ -0,0 +1,251 @@
---
title: How to install Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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.
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
</Aside>
## Requirements
- PHP v8.1 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.1 or higher
PHP version 8.1 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.
- [exif](https://www.php.net/manual/en/exif.installation.php)
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).
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`,
`REFERENCES`, `CREATE VIEW`.
### (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):
```bash
* * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
```
**Note** - If you do not add this cron task, the following Castopod features
will not work:
- Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using
[WebSub](https://en.wikipedia.org/wiki/WebSub)
- Generating video clips -
[requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (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!
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
</Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### Email/SMTP setup
Email configuration is required for some features to work properly (eg.
retrieving your forgotten password, sending instructions to premium subscribers,
…)
You may add your email configuration in your instance's `.env` like so:
```ini
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email config options
| Variable name | Type | Default |
| ---------------- | -------------------- | ------------ |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
By default, files are saved to the `public/media` folder using the file system.
If you need to relocate the `media` folder to a different location, you can
specify it in your `.env` file as shown below:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In this example, the files will be saved to the /mnt/storage/media folder. Make
sure to also update your web server configuration to reflect this change.
### S3
If you prefer storing your media files on an S3 compatible storage, you may
specify it in your `.env`:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 config options
| Variable name | Type | Default |
| ----------------------- | ------- | ----------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## 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>

View file

@ -0,0 +1,24 @@
---
title: 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,108 @@
---
title: How to update Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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 ⚡.
## Update instructions
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
- cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the
[releases page](https://code.castopod.org/adaures/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
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. On your server:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
- 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)
</Aside>
## Fully Automated updates
> Coming soon... 👀
## 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…

View file

@ -0,0 +1,1381 @@
---
title: Welcome 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Install" href="./getting-started/install" />
## 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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## 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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -1,10 +1,7 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
@ -15,7 +12,7 @@ coupled with custom rules. Roles and permissions are defined at two levels:
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
@ -23,11 +20,11 @@ coupled with custom rules. Roles and permissions are defined at two levels:
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
@ -41,47 +38,47 @@ coupled with custom rules. Roles and permissions are defined at two levels:
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -0,0 +1,157 @@
---
title: Official Docker images
---
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all
in one castopod image using nginx unit
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod
Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler.
## Supported tags
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage
1. Install [docker](https://docs.docker.com/get-docker/) and
[docker-compose](https://docs.docker.com/compose/install/)
2. Create a `docker-compose.yml` file with the following:
```yml
version: "3.7"
services:
app:
image: castopod/castopod:latest
container_name: "castopod-app"
volumes:
- castopod-media:/var/www/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
CP_BASEURL: "https://castopod.example.com"
CP_ANALYTICS_SALT: changeme
CP_CACHE_HANDLER: redis
CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks:
- castopod-app
- castopod-db
ports:
- 8000:8000
restart: unless-stopped
mariadb:
image: mariadb:10.5
container_name: "castopod-mariadb"
networks:
- castopod-db
volumes:
- castopod-db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
restart: unless-stopped
redis:
image: redis:7.0-alpine
container_name: "castopod-redis"
command: --requirepass changeme
volumes:
- castopod-cache:/data
networks:
- castopod-app
volumes:
castopod-media:
castopod-db:
castopod-cache:
networks:
castopod-app:
castopod-db:
```
You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
3. Setup a reverse proxy for TLS (SSL/HTTPS)
TLS is mandatory for ActivityPub to work. This job can easily be handled by
a reverse proxy, for example with [Caddy](https://caddyserver.com/):
```
#castopod
castopod.example.com {
reverse_proxy localhost:8000
}
```
4. Run `docker-compose up -d`, wait for it to initialize and head on to
`https://castopod.example.com/cp-install` to finish setting up Castopod!
5. You're all set, start podcasting! 🎙️🚀
## Environment Variables
- **castopod/castopod** and **castopod/app**
| Variable name | Type (`default`) | Default |
| ------------------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` |
| **`CP_EMAIL_FROM`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` |
| **`CP_ENABLE_2FA`** | ?boolean | `undefined` |
| **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` |
| **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` |
| **`CP_MEDIA_S3_KEY`** | ?string | `undefined` |
| **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_REGION`** | ?string | `undefined` |
| **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` |
| **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` |
| **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` |
| **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
- **castopod/web-server**
| Variable name | Type | Default |
| ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |

View file

@ -0,0 +1,251 @@
---
title: How to install Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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.
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
</Aside>
## Requirements
- PHP v8.1 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.1 or higher
PHP version 8.1 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.
- [exif](https://www.php.net/manual/en/exif.installation.php)
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).
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`,
`REFERENCES`, `CREATE VIEW`.
### (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):
```bash
* * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
```
**Note** - If you do not add this cron task, the following Castopod features
will not work:
- Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using
[WebSub](https://en.wikipedia.org/wiki/WebSub)
- Generating video clips -
[requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (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!
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
</Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### Email/SMTP setup
Email configuration is required for some features to work properly (eg.
retrieving your forgotten password, sending instructions to premium subscribers,
…)
You may add your email configuration in your instance's `.env` like so:
```ini
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email config options
| Variable name | Type | Default |
| ---------------- | -------------------- | ------------ |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
By default, files are saved to the `public/media` folder using the file system.
If you need to relocate the `media` folder to a different location, you can
specify it in your `.env` file as shown below:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In this example, the files will be saved to the /mnt/storage/media folder. Make
sure to also update your web server configuration to reflect this change.
### S3
If you prefer storing your media files on an S3 compatible storage, you may
specify it in your `.env`:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 config options
| Variable name | Type | Default |
| ----------------------- | ------- | ----------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## 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>

View file

@ -0,0 +1,24 @@
---
title: 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,108 @@
---
title: How to update Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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 ⚡.
## Update instructions
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
- cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the
[releases page](https://code.castopod.org/adaures/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
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. On your server:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
- 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)
</Aside>
## Fully Automated updates
> Coming soon... 👀
## 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…

View file

@ -0,0 +1,1391 @@
---
title: Selamat Datang 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod adalah platform hosting yang gratis & sumber terbuka untuk pembuat
siniar yang ingin berinteraksi dengan pendengar mereka.
Castopod is easy to install and was built on top of
[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very
small footprint.
<LinkCard title="Pasang" href="./getting-started/install" />
## Fitur-fitur
- 🌱 &nbsp;Gratis & sumber terbuka (Lisensi AGPL v3)
- 🔐 &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;Jaringan sosial bawaan:
- 🚀 &nbsp;Castopod termasuk bagian dari Fediverse, jaringan sosial
terdesentralisasi
- ❤️ &nbsp;Create posts, share, favourite, and comment on episodes
- 📈 &nbsp;Analitik bawaan:
- ⚖️ &nbsp;Sesuai dengan GDPR / CCPA / LGPD
- 🪙 &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;Premium podcasts
- 📡 &nbsp;Terbitkan episode-episode Anda dimana pun dengan RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## Motivasi
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.
## Perbandingan dengan solusi lain
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 other podcasting solutions:
- 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.
## Berkontribusi
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/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be tolerated.
### Panduan berkontribusi
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.
## Kontributor-kontributor ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## Kontak
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/adaures/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)
## Sponsor-sponsor
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
<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="Logo Ad Aures" class="h-16" />
</a>
<a
href="https://nlnet.nl/project/Castopod/"
target="_blank"
rel="noopener noreferrer"
>
<img src="/images/sponsors/nlnet.svg" alt="Logo NLnet" class="h-16" />
</a>
</div>
## Lisensi
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,85 @@
---
title: Autenticazione & Autorizzazione
---
Castopod gestisce l'autenticazione e l'autorizzazione utilizzando
`codeigniter/shield` abbinato a regole personalizzate. Ruoli e permessi sono
definiti a due livelli:
1. [intera istanza](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Ruoli e permessi per l'intera istanza
### Ruoli dell'istanza
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Permessi istanza
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per i ruoli e le autorizzazioni del podcast
### Per i ruoli del podcast
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Autorizzazioni per podcast
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -0,0 +1,157 @@
---
title: Official Docker images
---
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all
in one castopod image using nginx unit
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod
Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler.
## Supported tags
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage
1. Install [docker](https://docs.docker.com/get-docker/) and
[docker-compose](https://docs.docker.com/compose/install/)
2. Create a `docker-compose.yml` file with the following:
```yml
version: "3.7"
services:
app:
image: castopod/castopod:latest
container_name: "castopod-app"
volumes:
- castopod-media:/var/www/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
CP_BASEURL: "https://castopod.example.com"
CP_ANALYTICS_SALT: changeme
CP_CACHE_HANDLER: redis
CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks:
- castopod-app
- castopod-db
ports:
- 8000:8000
restart: unless-stopped
mariadb:
image: mariadb:10.5
container_name: "castopod-mariadb"
networks:
- castopod-db
volumes:
- castopod-db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
restart: unless-stopped
redis:
image: redis:7.0-alpine
container_name: "castopod-redis"
command: --requirepass changeme
volumes:
- castopod-cache:/data
networks:
- castopod-app
volumes:
castopod-media:
castopod-db:
castopod-cache:
networks:
castopod-app:
castopod-db:
```
You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
3. Setup a reverse proxy for TLS (SSL/HTTPS)
TLS is mandatory for ActivityPub to work. This job can easily be handled by
a reverse proxy, for example with [Caddy](https://caddyserver.com/):
```
#castopod
castopod.example.com {
reverse_proxy localhost:8000
}
```
4. Run `docker-compose up -d`, wait for it to initialize and head on to
`https://castopod.example.com/cp-install` to finish setting up Castopod!
5. You're all set, start podcasting! 🎙️🚀
## Environment Variables
- **castopod/castopod** and **castopod/app**
| Variable name | Type (`default`) | Default |
| ------------------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` |
| **`CP_EMAIL_FROM`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` |
| **`CP_ENABLE_2FA`** | ?boolean | `undefined` |
| **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` |
| **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` |
| **`CP_MEDIA_S3_KEY`** | ?string | `undefined` |
| **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_REGION`** | ?string | `undefined` |
| **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` |
| **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` |
| **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` |
| **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
- **castopod/web-server**
| Variable name | Type | Default |
| ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |

View file

@ -0,0 +1,251 @@
---
title: How to install Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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.
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
</Aside>
## Requirements
- PHP v8.1 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.1 or higher
PHP version 8.1 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.
- [exif](https://www.php.net/manual/en/exif.installation.php)
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).
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`,
`REFERENCES`, `CREATE VIEW`.
### (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):
```bash
* * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
```
**Note** - If you do not add this cron task, the following Castopod features
will not work:
- Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using
[WebSub](https://en.wikipedia.org/wiki/WebSub)
- Generating video clips -
[requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (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!
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
</Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### Email/SMTP setup
Email configuration is required for some features to work properly (eg.
retrieving your forgotten password, sending instructions to premium subscribers,
…)
You may add your email configuration in your instance's `.env` like so:
```ini
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email config options
| Variable name | Type | Default |
| ---------------- | -------------------- | ------------ |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
By default, files are saved to the `public/media` folder using the file system.
If you need to relocate the `media` folder to a different location, you can
specify it in your `.env` file as shown below:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In this example, the files will be saved to the /mnt/storage/media folder. Make
sure to also update your web server configuration to reflect this change.
### S3
If you prefer storing your media files on an S3 compatible storage, you may
specify it in your `.env`:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 config options
| Variable name | Type | Default |
| ----------------------- | ------- | ----------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## 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>

View file

@ -0,0 +1,24 @@
---
title: 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

@ -1,9 +1,8 @@
---
title: Update
sidebarDepth: 3
title: How to update Castopod?
---
# How to update Castopod?
import { Aside } from "@astrojs/starlight/components";
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
@ -36,12 +35,12 @@ improvements ⚡.
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
@ -54,7 +53,7 @@ improvements ⚡.
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
@ -62,7 +61,7 @@ Releases may come with additional update instructions (see
- 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)
:::
</Aside>
## Fully Automated updates

View file

@ -0,0 +1,1349 @@
---
title: Welcome 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Install" href="./getting-started/install" />
## 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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## 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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,84 @@
---
title: Authentication & Authorization
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -0,0 +1,157 @@
---
title: Official Docker images
---
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all
in one castopod image using nginx unit
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod
Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler.
## Supported tags
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage
1. Install [docker](https://docs.docker.com/get-docker/) and
[docker-compose](https://docs.docker.com/compose/install/)
2. Create a `docker-compose.yml` file with the following:
```yml
version: "3.7"
services:
app:
image: castopod/castopod:latest
container_name: "castopod-app"
volumes:
- castopod-media:/var/www/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
CP_BASEURL: "https://castopod.example.com"
CP_ANALYTICS_SALT: changeme
CP_CACHE_HANDLER: redis
CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks:
- castopod-app
- castopod-db
ports:
- 8000:8000
restart: unless-stopped
mariadb:
image: mariadb:10.5
container_name: "castopod-mariadb"
networks:
- castopod-db
volumes:
- castopod-db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
restart: unless-stopped
redis:
image: redis:7.0-alpine
container_name: "castopod-redis"
command: --requirepass changeme
volumes:
- castopod-cache:/data
networks:
- castopod-app
volumes:
castopod-media:
castopod-db:
castopod-cache:
networks:
castopod-app:
castopod-db:
```
You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
3. Setup a reverse proxy for TLS (SSL/HTTPS)
TLS is mandatory for ActivityPub to work. This job can easily be handled by
a reverse proxy, for example with [Caddy](https://caddyserver.com/):
```
#castopod
castopod.example.com {
reverse_proxy localhost:8000
}
```
4. Run `docker-compose up -d`, wait for it to initialize and head on to
`https://castopod.example.com/cp-install` to finish setting up Castopod!
5. You're all set, start podcasting! 🎙️🚀
## Environment Variables
- **castopod/castopod** and **castopod/app**
| Variable name | Type (`default`) | Default |
| ------------------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` |
| **`CP_EMAIL_FROM`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` |
| **`CP_ENABLE_2FA`** | ?boolean | `undefined` |
| **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` |
| **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` |
| **`CP_MEDIA_S3_KEY`** | ?string | `undefined` |
| **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_REGION`** | ?string | `undefined` |
| **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` |
| **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` |
| **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` |
| **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
- **castopod/web-server**
| Variable name | Type | Default |
| ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |

View file

@ -1,21 +1,20 @@
---
title: Installation
sidebarDepth: 3
title: How to install Castopod?
---
# How to install Castopod?
import { Aside } from "@astrojs/starlight/components";
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.
::: tip Note
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
:::
</Aside>
## Requirements
@ -46,13 +45,13 @@ Additionally, make sure that the following extensions are enabled in your PHP:
> We recommend using [MariaDB](https://mariadb.org).
::: warning Warning
<Aside type="caution">
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.
:::
</Aside>
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
@ -115,13 +114,13 @@ want to generate Video Clips. The following extensions must be installed:
2. Follow the instructions on your screen.
3. Start podcasting!
::: info Note
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
:::
</Aside>
### Using CLI
@ -226,13 +225,35 @@ 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
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>
<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>

View file

@ -0,0 +1,24 @@
---
title: 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,108 @@
---
title: How to update Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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 ⚡.
## Update instructions
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
- cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the
[releases page](https://code.castopod.org/adaures/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
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. On your server:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
- 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)
</Aside>
## Fully Automated updates
> Coming soon... 👀
## 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…

View file

@ -0,0 +1,1349 @@
---
title: Welcome 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Install" href="./getting-started/install" />
## 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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## 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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,84 @@
---
title: Authentication & Authorization
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

View file

@ -0,0 +1,157 @@
---
title: Official Docker images
---
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all
in one castopod image using nginx unit
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod
Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler.
## Supported tags
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage
1. Install [docker](https://docs.docker.com/get-docker/) and
[docker-compose](https://docs.docker.com/compose/install/)
2. Create a `docker-compose.yml` file with the following:
```yml
version: "3.7"
services:
app:
image: castopod/castopod:latest
container_name: "castopod-app"
volumes:
- castopod-media:/var/www/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
CP_BASEURL: "https://castopod.example.com"
CP_ANALYTICS_SALT: changeme
CP_CACHE_HANDLER: redis
CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks:
- castopod-app
- castopod-db
ports:
- 8000:8000
restart: unless-stopped
mariadb:
image: mariadb:10.5
container_name: "castopod-mariadb"
networks:
- castopod-db
volumes:
- castopod-db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
restart: unless-stopped
redis:
image: redis:7.0-alpine
container_name: "castopod-redis"
command: --requirepass changeme
volumes:
- castopod-cache:/data
networks:
- castopod-app
volumes:
castopod-media:
castopod-db:
castopod-cache:
networks:
castopod-app:
castopod-db:
```
You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
3. Setup a reverse proxy for TLS (SSL/HTTPS)
TLS is mandatory for ActivityPub to work. This job can easily be handled by
a reverse proxy, for example with [Caddy](https://caddyserver.com/):
```
#castopod
castopod.example.com {
reverse_proxy localhost:8000
}
```
4. Run `docker-compose up -d`, wait for it to initialize and head on to
`https://castopod.example.com/cp-install` to finish setting up Castopod!
5. You're all set, start podcasting! 🎙️🚀
## Environment Variables
- **castopod/castopod** and **castopod/app**
| Variable name | Type (`default`) | Default |
| ------------------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` |
| **`CP_EMAIL_FROM`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` |
| **`CP_ENABLE_2FA`** | ?boolean | `undefined` |
| **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` |
| **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` |
| **`CP_MEDIA_S3_KEY`** | ?string | `undefined` |
| **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_REGION`** | ?string | `undefined` |
| **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` |
| **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` |
| **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` |
| **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
- **castopod/web-server**
| Variable name | Type | Default |
| ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |

View file

@ -0,0 +1,251 @@
---
title: How to install Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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.
<Aside>
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
</Aside>
## Requirements
- PHP v8.1 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.1 or higher
PHP version 8.1 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.
- [exif](https://www.php.net/manual/en/exif.installation.php)
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).
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`,
`REFERENCES`, `CREATE VIEW`.
### (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):
```bash
* * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
```
**Note** - If you do not add this cron task, the following Castopod features
will not work:
- Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using
[WebSub](https://en.wikipedia.org/wiki/WebSub)
- Generating video clips -
[requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (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!
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
</Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### Email/SMTP setup
Email configuration is required for some features to work properly (eg.
retrieving your forgotten password, sending instructions to premium subscribers,
…)
You may add your email configuration in your instance's `.env` like so:
```ini
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email config options
| Variable name | Type | Default |
| ---------------- | -------------------- | ------------ |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
By default, files are saved to the `public/media` folder using the file system.
If you need to relocate the `media` folder to a different location, you can
specify it in your `.env` file as shown below:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In this example, the files will be saved to the /mnt/storage/media folder. Make
sure to also update your web server configuration to reflect this change.
### S3
If you prefer storing your media files on an S3 compatible storage, you may
specify it in your `.env`:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 config options
| Variable name | Type | Default |
| ----------------------- | ------- | ----------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## 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>

View file

@ -0,0 +1,24 @@
---
title: 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,108 @@
---
title: How to update Castopod?
---
import { Aside } from "@astrojs/starlight/components";
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 ⚡.
## Update instructions
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
- cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the
[releases page](https://code.castopod.org/adaures/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
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. On your server:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
- 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)
</Aside>
## Fully Automated updates
> Coming soon... 👀
## 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…

View file

@ -0,0 +1,1381 @@
---
title: Welcome 👋
---
import { LinkCard } from "@astrojs/starlight/components";
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.
<LinkCard title="Install" href="./getting-started/install" />
## 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;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &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, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
## 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 other podcasting solutions:
- 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/adaures/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.
## Contributors ✨
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */}
{/* prettier-ignore-start */}
{/* markdownlint-disable */}
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/yassinedoghri">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100"
width="100px;"
alt="Yassine Doghri"
/>
<br />
<sub>
<b>Yassine Doghri</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#maintenance-yassinedoghri" title="Maintenance">
🚧
</a>{" "}
<a href="#content-yassinedoghri" title="Content">
🖋
</a>{" "}
<a href="#design-yassinedoghri" title="Design">
🎨
</a>{" "}
<a href="#a11y-yassinedoghri" title="Accessibility">
️️️️♿️
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-yassinedoghri" title="Answering Questions">
💬
</a>{" "}
<a href="#mentoring-yassinedoghri" title="Mentoring">
🧑‍🏫
</a>{" "}
<a
href="#infra-yassinedoghri"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a href="#projectManagement-yassinedoghri" title="Project Management">
📆
</a>{" "}
<a
href="https://blog.castopod.org/author/yassinedoghri/"
title="Blogposts"
>
📝
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/benjamin">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100"
width="100px;"
alt="Benjamin Bellamy"
/>
<br />
<sub>
<b>Benjamin Bellamy</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a href="#content-benjamin" title="Content">
🖋
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-benjamin" title="Answering Questions">
💬
</a>{" "}
<a
href="#infra-benjamin"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://blog.castopod.org/author/benjamin-bellamy/"
title="Blogposts"
>
📝
</a>{" "}
<a href="#projectManagement-benjamin" title="Project Management">
📆
</a>{" "}
<a href="#talk-benjamin" title="Talks">
📢
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ola-hn">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ola Hneini"
/>
<br />
<sub>
<b>Ola Hneini</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola"
title="Reviewed Pull Requests"
>
👀
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="#maintenance-ola" title="Maintenance">
🚧
</a>{" "}
<a href="#question-ola" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ola" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mamot.fr/@rdelaage">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Romain de Laage"
/>
<br />
<sub>
<b>Romain de Laage</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="#infra-rdelaage"
title="Infrastructure (Hosting, Build-Tools, etc)"
>
🚇
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Documentation"
>
📖
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/lyonelbernard">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Lyonel Bernard"
/>
<br />
<sub>
<b>Lyonel Bernard</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-Lyonel" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-Lyonel" title="Audio">
🔊
</a>{" "}
<a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.crypticchameleon.com/">
<img
src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100"
width="100px;"
alt="Christopher Lagonick-Weitzel"
/>
<br />
<sub>
<b>Christopher Lagonick-Weitzel</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#question-ctlw83" title="Answering Questions">
💬
</a>{" "}
<a href="#audio-ctlw83" title="Audio">
🔊
</a>{" "}
<a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://ernestoacosta.me/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Ernesto Acosta"
/>
<br />
<sub>
<b>Ernesto Acosta</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#audio-ernestoacostame" title="Audio">
🔊
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#question-ernestoacostame" title="Answering Questions">
💬
</a>{" "}
<a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fedi.bzh/@ewen">
<img
src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100"
width="100px;"
alt="Ewen"
/>
<br />
<sub>
<b>Ewen</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-3wen" title="Ideas, Planning, & Feedback">
🤔
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Behel">
<img
src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100"
width="100px;"
alt="Bastien Luneteau"
/>
<br />
<sub>
<b>Bastien Luneteau</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://www.cecillie.fr/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Cécile Ricordeau"
/>
<br />
<sub>
<b>Cécile Ricordeau</b>
</sub>
</a>
<br />
<a href="#design-cecillie" title="Design">
🎨
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/PatrykMis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Miś"
/>
<br />
<sub>
<b>Patryk Miś</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/mspanc">
<img
src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100"
width="100px;"
alt="Marcin Lewandowski"
/>
<br />
<sub>
<b>Marcin Lewandowski</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/SJanik">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sebastian Janik"
/>
<br />
<sub>
<b>Sebastian Janik</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/patryk">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Patryk Karczmarczyk"
/>
<br />
<sub>
<b>Patryk Karczmarczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/ddenis">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="denis d"
/>
<br />
<sub>
<b>denis d</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/douglaskastle">
<img
src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100"
width="100px;"
alt="Douglas Kastle"
/>
<br />
<sub>
<b>Douglas Kastle</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cExplorer">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="cExplorer"
/>
<br />
<sub>
<b>cExplorer</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer"
title="Bug reports"
>
🐛
</a>{" "}
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/imacrea">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="ImaCrea"
/>
<br />
<sub>
<b>ImaCrea</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/jonas">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Jonas S"
/>
<br />
<sub>
<b>Jonas S</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/yannL">
<img
src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100"
width="100px;"
alt="LEFEBVRE Yann"
/>
<br />
<sub>
<b>LEFEBVRE Yann</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/spaetz">
<img
src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100"
width="100px;"
alt="Sebastian Späth"
/>
<br />
<sub>
<b>Sebastian Späth</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/rocky">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="rocky III"
/>
<br />
<sub>
<b>rocky III</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/Regenpfeifer">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100"
width="100px;"
alt="Hermann Josef Eckl"
/>
<br />
<sub>
<b>Hermann Josef Eckl</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer"
title="Bug reports"
>
🐛
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/cyrilledel">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Delhaye Cyrille"
/>
<br />
<sub>
<b>Delhaye Cyrille</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel"
title="Bug reports"
>
🐛
</a>{" "}
<a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/otetranome">
<img
src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100"
width="100px;"
alt="João Leandro"
/>
<br />
<sub>
<b>João Leandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>{" "}
<a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://achouvardas.eu/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Angelos Chouvardas"
/>
<br />
<sub>
<b>Angelos Chouvardas</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mastodon.fjerland.no/@eivind">
<img
src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100"
width="100px;"
alt="Eivind"
/>
<br />
<sub>
<b>Eivind</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/forght">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100"
width="100px;"
alt="forght"
/>
<br />
<sub>
<b>forght</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/glottis0q">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100"
width="100px;"
alt="glottis0q"
/>
<br />
<sub>
<b>glottis0q</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://mstdn.fr/@ButterflyOfFire">
<img
src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100"
width="100px;"
alt="ButterflyOfFire"
/>
<br />
<sub>
<b>ButterflyOfFire</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/lil5">
<img
src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100"
width="100px;"
alt="Lucian I. Last"
/>
<br />
<sub>
<b>Lucian I. Last</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/luuzviir">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100"
width="100px;"
alt="LuuzViir"
/>
<br />
<sub>
<b>LuuzViir</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/cthtc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100"
width="100px;"
alt="CTHTC"
/>
<br />
<sub>
<b>CTHTC</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/retrograde">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100"
width="100px;"
alt="Russian Retro"
/>
<br />
<sub>
<b>Russian Retro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/mareklach">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100"
width="100px;"
alt="Marek L'ach"
/>
<br />
<sub>
<b>Marek L'ach</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gunchleoc">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100"
width="100px;"
alt="GunChleoc"
/>
<br />
<sub>
<b>GunChleoc</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/gabisnow">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100"
width="100px;"
alt="GabiSnow"
/>
<br />
<sub>
<b>GabiSnow</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/bendaha">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100"
width="100px;"
alt="bendaha"
/>
<br />
<sub>
<b>bendaha</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/samuelroland">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100"
width="100px;"
alt="Samuel Roland"
/>
<br />
<sub>
<b>Samuel Roland</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://dimitriregnier.net/">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Dimitri Regnier"
/>
<br />
<sub>
<b>Dimitri Regnier</b>
</sub>
</a>
<br />
<a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">
🤔
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://im.irithys.com/@thy">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100"
width="100px;"
alt="irithys"
/>
<br />
<sub>
<b>irithys</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://twitter.com/caos30">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Sergi"
/>
<br />
<sub>
<b>Sergi</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/xosem">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100"
width="100px;"
alt="ghose (XoseM)"
/>
<br />
<sub>
<b>ghose (XoseM)</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/basen1982">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="Andreas Olsson"
/>
<br />
<sub>
<b>Andreas Olsson</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/leonfrom">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="leonfrom"
/>
<br />
<sub>
<b>leonfrom</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/agentcobra57">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="agentcobra"
/>
<br />
<sub>
<b>agentcobra</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/alephoto85">
<img
src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100"
width="100px;"
alt="Alessandro"
/>
<br />
<sub>
<b>Alessandro</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://crowdin.com/profile/liimee">
<img
src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100"
width="100px;"
alt="liimee"
/>
<br />
<sub>
<b>liimee</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/ahmedsabouni">
<img
src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100"
width="100px;"
alt="Ahmed Sabouni"
/>
<br />
<sub>
<b>Ahmed Sabouni</b>
</sub>
</a>
<br />
<a href="https://translate.castopod.org" title="Translation">
🌍
</a>
</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%">
<a href="https://github.com/KrzysztofDomanczyk">
<img
src="https://avatars.githubusercontent.com/u/75178474?v=4?s=100"
width="100px;"
alt="KrzysztofDomanczyk"
/>
<br />
<sub>
<b>KrzysztofDomanczyk</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
<td align="center" valign="top" width="14.28%">
<a href="https://code.castopod.org/NeoluxConsulting">
<img
src="https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon?s=100"
width="100px;"
alt="Guy Martin"
/>
<br />
<sub>
<b>Guy Martin</b>
</sub>
</a>
<br />
<a
href="https://code.castopod.org/adaures/castopod/issues?author_username=NeoluxConsulting"
title="Bug reports"
>
🐛
</a>{" "}
<a
href="https://code.castopod.org/adaures/castopod/commits/master"
title="Code"
>
💻
</a>
</td>
</tr>
</tbody>
</table>
{/* markdownlint-restore */}
{/* prettier-ignore-end */}
{/* ALL-CONTRIBUTORS-LIST:END */}
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
## 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/adaures/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
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).

View file

@ -0,0 +1,84 @@
---
title: Authentication & Authorization
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}

Some files were not shown because too many files have changed in this diff Show more