This PR contains new source for antenna posts, which is a list of instance hostnames to process all posts from.
Using this mode, a user can filter for keywords on an instance wide basis.
This change includes a new antenna source called `instances` and a new database column in the `antenna` table called `instances` to store the instance names.
On the antenna editor, there's also an "Add an instance" finder dialog to allow users to search through the known instance hostnames.
Co-authored-by: Kaity A <supakaity@blahaj.zone>
Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9604
Co-authored-by: Kaity A <supakaity@noreply.codeberg.org>
Co-committed-by: Kaity A <supakaity@noreply.codeberg.org>
This PR establishes a new replied note stream update for subscribed notes, which gets fired off whenever a note receives a reply and the user is subscribed to the note for updates.
It specifically does not provide note details as part of the update, just the note id of the reply, so that they must go and retrieve the note and be subject to the proper permission and visibility checks.
The detailed note component has then been updated to watch for the replied notification so it can add new replies to the thread as they are created.
This allows both seeing new replies while on the page, and also to see your own replies appear after you post them without having to reload the page.
This PR relies on https://codeberg.org/calckey/calckey.js/pulls/2 to add the replied type to the calkey.js module.
Co-authored-by: Kaity A <supakaity@blahaj.zone>
Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9606
Co-authored-by: Kaity A <supakaity@noreply.codeberg.org>
Co-committed-by: Kaity A <supakaity@noreply.codeberg.org>
This PR should kill #9531 - Safeguarding against posts that are made before 2007 (Identica being made in 2008, the 'first ever activitypub software' according to wikipedia.)
Personally, if gone unnoticed, I believe that notes from the past can be used as an attack vector to silently flood a database.
Co-authored-by: Kio-td <kio.thedev@gmail.com>
Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9605
Co-authored-by: daikei <daikei@noreply.codeberg.org>
Co-committed-by: daikei <daikei@noreply.codeberg.org>
This commit adds (maybe unstable) support for Mastodons v1 api
also some v2 endpoints, maybe I miss stuff, I dont know.
We will need to test this but it should be kinda stable
and work like (old) butter.
Co-authored-by: Natty <natty.sh.git@gmail.com>
Co-authored-by: cutls <web-pro@cutls.com>
This change moves many of the dependencies into devDependencies, by analyzing what is used in the runtime files. Additionally, NPM and apk cache are eliminated with multi-stage builds
Reasons:
1. `pnpm` is now an industry standard, being faster and less buggy than `yarn`.
2. Faster build time as builds are concurrent: 63 seconds down to 35 seconds!!
3. Resolves#9412
Co-authored-by: ThatOneCalculator <kainoa@t1c.dev>
Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9461
I've added some issue templates, feel free to change them to your liking, but I think it's a good template :D
Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9455
Co-authored-by: via <via@noreply.codeberg.org>
Co-committed-by: via <via@noreply.codeberg.org>
Sorry for everyone who I have hurt with this, I had a really bad day, I promise this will
be the last time something like this happened. Please read my public statement.
It already fetches the moved to info on regular user fetches, now only the notification of a new "moved to" is missing.
Signed-off-by: cutestnekoaqua <waterdev@galaxycrow.de>
Co-authored-by: Mary Strodl <ipadlover8322@gmail.com>
Signed-off-by: cutestnekoaqua <waterdev@galaxycrow.de>
This should reduce the performance hit when adding large numbers of
instances to the deliver queue by making the check for suspended and
dead instances a bulk operation.
Changelog: Changed
Reviewed-on: https://akkoma.dev/FoundKeyGang/FoundKey/pulls/215
links is a deprecated docker feature which doesn't work in podman so i
changed it so it uses depends_on instead. you have to change your
configuration to point to the name of the docker container like db as
its hostname.
Since you are also allowed to react to your own notes, it seems sensible
that you should be allowed to like your own gallery posts.
Analogous to commit 4c5aa9e53887cca5561fcec6ab0754e018f589a5.
Changelog: Changed
I doubt itll work, but...
🙏
hail mairy
certified typeorm moment
im stuff
debug log
not a fan of js/ts
istg
missing parenthesis
postgres can kiss my ass
didnt need `::string[]` i think
hide caption button
Remove debug log
Clean up
no longer beta!
fix streaming
These joins are no longer necessary as of commit
c35372a20d22cddb75e93a0b407f2b652cd7faf0. It seems they are bad enough
for performance to break installs.
# Linked Data signatures are cryptographic signatures attached to each activity to provide proof of authenticity.
# When using authorized fetch, this is often undesired as any signed activity can be forwarded to a blocked instance by relays and other instances.
# This setting allows admins to disable LD signatures for increased privacy, at the expense of fewer relayed activities and additional inbound fetch (GET) requests.
attachLdSignatureForRelays:true
# check that inbound ActivityPub GET requests are signed ("authorized fetch")
checkActivityPubGetSignature:false
# For security reasons, uploading attachments from the intranet is prohibited,
# but exceptions can be made from the following settings. Default value is "undefined".
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
#allowedPrivateNetworks: [
# '127.0.0.1/32'
#]
#customMOTD: ['Hello World', 'The sharks rule all', 'Shonks']
# Upload or download file size limits (bytes)
#maxFileSize: 262144000
# Managed hosting settings
# !!!!!!!!!!
# >>>>>> NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
# >>>>>> YOU DON'T NEED THIS! <<<<<<
# !!!!!!!!!!
# Each category is optional, but if each item in each category is mandatory!
# If you mess this up, that's on you, you've been warned...
#maxUserSignups: 100
#isManagedHosting: true
#deepl:
# managed: true
# authKey: ''
# isPro: false
#
#email:
# managed: true
# address: 'example@email.com'
# host: 'email.com'
# port: 587
# user: 'example@email.com'
# pass: ''
# useImplicitSslTls: false
#
#objectStorage:
# managed: true
# baseUrl: ''
# bucket: ''
# prefix: ''
# endpoint: ''
# region: ''
# accessKey: ''
# secretKey: ''
# useSsl: true
# connnectOverProxy: false
# setPublicReadOnUpload: true
# s3ForcePathStyle: true
# !!!!!!!!!!
# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
# >>>>>> YOU DON'T NEED THIS, ABOVE SETTINGS ARE FOR MANAGED HOSTING ONLY! <<<<<<
# !!!!!!!!!!
# Seriously. Do NOT fill out the above settings if you're self-hosting.
# They're much better off being set from the control panel.
# Linked Data signatures are cryptographic signatures attached to each activity to provide proof of authenticity.
# When using authorized fetch, this is often undesired as any signed activity can be forwarded to a blocked instance by relays and other instances.
# This setting allows admins to disable LD signatures for increased privacy, at the expense of fewer relayed activities and additional inbound fetch (GET) requests.
attachLdSignatureForRelays:true
# check that inbound ActivityPub GET requests are signed ("authorized fetch")
checkActivityPubGetSignature:false
# For security reasons, uploading attachments from the intranet is prohibited,
# but exceptions can be made from the following settings. Default value is "undefined".
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
#allowedPrivateNetworks: [
# '127.0.0.1/32'
#]
#customMOTD: ['Hello World', 'The sharks rule all', 'Shonks']
# Linked Data signatures are cryptographic signatures attached to each activity to provide proof of authenticity.
# When using authorized fetch, this is often undesired as any signed activity can be forwarded to a blocked instance by relays and other instances.
# This setting allows admins to disable LD signatures for increased privacy, at the expense of fewer relayed activities and additional inbound fetch (GET) requests.
attachLdSignatureForRelays:true
# check that inbound ActivityPub GET requests are signed ("authorized fetch")
checkActivityPubGetSignature:false
# For security reasons, uploading attachments from the intranet is prohibited,
# but exceptions can be made from the following settings. Default value is "undefined".
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
#allowedPrivateNetworks: [
# '127.0.0.1/32'
#]
#customMOTD: ['Hello World', 'The sharks rule all', 'Shonks']
# TWA
#twa:
# nameSpace: android_app
# packageName: tld.domain.twa
# sha256CertFingerprints: ['AB:CD:EF']
# Upload or download file size limits (bytes)
#maxFileSize: 262144000
# timeout and maximum size for imports (e.g. note imports)
#import:
# downloadTimeout: 30
# maxFileSize: 262144000
# Managed hosting settings
# !!!!!!!!!!
# >>>>>> NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
# >>>>>> YOU DON'T NEED THIS! <<<<<<
# !!!!!!!!!!
# Each category is optional, but if each item in each category is mandatory!
# If you mess this up, that's on you, you've been warned...
# PID File of master process
#pidFile: /tmp/misskey.pid
#maxUserSignups: 100
#isManagedHosting: true
#deepl:
# managed: true
# authKey: ''
# isPro: false
#
#email:
# managed: true
# address: 'example@email.com'
# host: 'email.com'
# port: 587
# user: 'example@email.com'
# pass: ''
# useImplicitSslTls: false
#
#objectStorage:
# managed: true
# baseUrl: ''
# bucket: ''
# prefix: ''
# endpoint: ''
# region: ''
# accessKey: ''
# secretKey: ''
# useSsl: true
# connnectOverProxy: false
# setPublicReadOnUpload: true
# s3ForcePathStyle: true
# !!!!!!!!!!
# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
# >>>>>> YOU DON'T NEED THIS, ABOVE SETTINGS ARE FOR MANAGED HOSTING ONLY! <<<<<<
# !!!!!!!!!!
# Seriously. Do NOT fill out the above settings if you're self-hosting.
# They're much better off being set from the control panel.
<!-- 💖 Thanks for taking the time to fill out this bug report!
💁 Having trouble with deployment? [Ask the support chat.](https://discord.gg/4qUhaeeHmm)
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/SECURITY.md)
🤝 By submitting this feature request, you agree to follow our [Contribution Guidelines.](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md) -->
**What happened?** _(Please give us a brief description of what happened.)_
**What did you expect to happen?** _(Please give us a brief description of what you expected to happen.)_
**Version** _(What version of Sharkey is your instance running? You can find this by clicking your instance's logo at the top left and then clicking instance information.)_
**Instance** _(What instance of Sharkey are you using?)_
**What type of issue is this?** _(If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side.)_
**What browser are you using? (Client-side issues only)**
**What operating system are you using? (Client-side issues only)**
**How do you deploy Sharkey on your server? (Server-side issues only)**
**What operating system are you using? (Server-side issues only)**
**Relevant log output** _(Please copy and paste any relevant log output. You can find your log by inspecting the page, and going to the "console" tab. This will be automatically formatted into code, so no need for backticks.)_
**Contribution Guidelines**
By submitting this issue, you agree to follow our [Contribution Guidelines](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md)
- [ ] I agree to follow this project's Contribution Guidelines
- [ ] I have searched the issue tracker for similar issues, and this is not a duplicate.
<!-- 💖 Thanks for taking the time to fill out this bug report!
💁 Having trouble with deployment? [Ask the support chat.](https://discord.gg/4qUhaeeHmm)
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/SECURITY.md)
🤝 By submitting this feature request, you agree to follow our [Contribution Guidelines.](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md) -->
**What feature would you like implemented?** _(Please give us a brief description of what you'd like.)_
**Why should we add this feature?** _(Please give us a brief description of why your feature is important.)_
**Version** _(What version of Sharkey is your instance running? You can find this by clicking your instance's logo at the top left and then clicking instance information.)_
**Instance** _(What instance of Sharkey are you using?)_
**Contribution Guidelines**
By submitting this issue, you agree to follow our [Contribution Guidelines](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md)
- [ ] I agree to follow this project's Contribution Guidelines
- [ ] I have searched the issue tracker for similar requests, and this is not a duplicate.
<!-- Thanks for taking the time to make Sharkey better! -->
**What does this PR do?** _(Please give us a brief description of what this PR does.)_
**Contribution Guidelines**
By submitting this merge request, you agree to follow our [Contribution Guidelines](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md)
- [ ] I agree to follow this project's Contribution Guidelines
- [ ] I have made sure to test this pull request
<!-- Uncomment if your merge request has multiple authors -->
See [ROADMAP.md](./ROADMAP.md) for the upstream Misskey roadmap.
See [CALCKEY.md](./CALCKEY.md)
## Issues
Before creating an issue, please check the following:
- To avoid duplication, please search for similar issues before creating a new issue.
- Do not use Issues to ask questions or troubleshooting.
- Issues should only be used to feature requests, suggestions, and bug tracking.
- Please ask questions or troubleshooting in [Discord](https://discord.gg/6VgKmEqHNk).
- Please ask questions or troubleshooting in the [Matrix room](https://matrix.to/#/#calckey:matrix.fedibird.com).
> [!WARNING]
> **Warning**
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
### Recommended discussing before implementation
We welcome your proposal.
## Before implementation
When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented.
When you want to add a feature or fix a bug, *please open an issue*,
don't just start writing code. We may suggest different approaches, or
show that the "bug" is actually intended behaviour (and offer
work-arounds), or maybe we won't be able to merge your new feature
because it would make it too hard to incorporate future changes from
Misskey. Each of these examples have actually happened!
At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them.
PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review.
On the other hand, it's very likely that we'll tell you "go
ahead!". We try our best to incorporate improvements from our users!
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask Committer to assign you).
By expressing your intention to work on the Issue, you can prevent conflicts in the work.
To the Committers: you should not assign someone on it before the Final Decision.
### How issues are triaged
The Committers may:
* close an issue that is not reproducible on latest stable release,
* merge an issue into another issue,
* split an issue into multiple issues,
* or re-open that has been closed for some reason which is not applicable anymore.
@syuilo reserves the Final Decision rights including whether the project will implement feature and how to implement, these rights are not always exercised.
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work.
## Well-known branches
- **`stable`** branch is tracking the latest release and used for production purposes.
- **`develop`** branch is where we work for the next release.
- When you create a PR, basically target it to this branch.
- The **`main`** branch is tracking the latest release and used for production purposes.
- The **`develop`** branch is where we work for the next release.
- When you create a PR, basically target it to this branch. **But create a different branch**
- The **`l10n_develop`** branch is reserved for localization management.
- **`feature/*`** branches are reserved for the development of a specific feature
## Creating a PR
Thank you for your PR! Before creating a PR, please check the following:
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
- Please add the summary of the changes to [`CHANGELOG.md`](CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring.
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc. You are also welcome to use gitmoji. This is important as we use these to A) easier read the git history and B) generate our changelog. Without propper prefixing it is possible that your PR is rejected.
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text. Good examples include `Closing: #21` or `Resolves: #21`
- Check if there are any documents that need to be created or updated due to this change.
- If you have added a feature or fixed a bug, please add a test case if possible.
- Please make sure that tests and Lint are passed in advance.
- You can run it with `pnpm test` and `pnpm lint`. [See more info](#testing)
- You can run it with `pnpm run test` and `pnpm run lint`. [See more info](#testing)
- If this PR includes UI changes, please attach a screenshot in the text.
Thanks for your cooperation 🤗
@ -67,8 +59,8 @@ Be willing to comment on the good points and not just the things you want fixed
### Review perspective
- Scope
- Are the goals of the PR clear?
- Is the granularity of the PR appropriate?
- Are the goals of the PR clear?
- Is the granularity of the PR appropriate?
- Security
- Does merging this PR create a vulnerability?
- Performance
@ -79,142 +71,66 @@ Be willing to comment on the good points and not just the things you want fixed
- Are there any omissions or gaps?
- Does it check for anomalies?
## Deploy (SOON)
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
```
/deploy sha=<commithash>
```
An actual domain will be assigned so you can test the federation.
## Merge
## Release
### Release Instructions
1. Commit version changes in the `develop` branch ([package.json](package.json))
1. Commit version changes in the `develop` branch ([package.json](https://github.com/misskey-dev/misskey/blob/develop/package.json))
2. Create a release PR.
- Into `stable` from `develop` branch.
- Into `master` from `develop` branch.
- The title must be in the format `Release: x.y.z`.
- `x.y.z` is the new version you are trying to release.
3. Deploy and perform a simple QA check. Also verify that the tests passed.
4. Merge it. (Do not squash commit)
5. Create a [release](https://activitypub.software/TransFem-org/Sharkey/-/releases)
- The target branch must be `stable`
4. Merge it.
5. Create a [release of GitHub](https://github.com/misskey-dev/misskey/releases)
- The target branch must be `master`
- The tag name must be the version
> [!NOTE]
> Why this instruction is necessary:
> - To perform final QA checks
> - To distribute responsibility
> - To check direct commits to develop
> - To celebrate the release together 🎉
## Localization (l10n)
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
You can improve our translations with your Crowdin account.
Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository.
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
If your language is not listed in Crowdin, please open an issue.
Sharkey has its own Icon Font called Shark Font which can be found at https://activitypub.software/TransFem-org/shark-font
Build Instructions can all be found over there in the `README`.
If you have an Icon Suggestion or want to add an Icon please open an issue/merge request over at that repo.
When Updating the Font make sure to copy **all generated files** from the `dest` folder into `packages/backend/assets/fonts/sharkey-icons`
For the CSS simply copy the file content and replace the old content in `style.css` and for the WOFF, TTF and SVG simply replace them.
## Development
### Setup
Before developing, you have to set up environment. Misskey requires Redis, PostgreSQL, and FFmpeg.
During development, it is useful to use the `yarn dev` command.
This command monitors the server-side and client-side source files and automatically builds them if they are modified.
In addition, it will also automatically start the Misskey server process.
You would want to install Meilisearch to experiment related features. Technically, meilisearch is not strict requirement, but some features and tests require it.
There are a few ways to proceed.
#### Use system-wide software
You could install them in system-wide (such as from package manager).
#### Use `docker compose`
You could obtain middleware container by typing `docker compose -f $PROJECT_ROOT/compose.local-db.yml up -d`.
#### Use Devcontainer
Devcontainer also has necessary setting. This method can be done by connecting from VSCode.
Instead of running `pnpm` locally, you can use Dev Container to set up your development environment.
To use Dev Container, open the project directory on VSCode with Dev Containers installed.
**Note:** If you are using Windows, please clone the repository with WSL. Using Git for Windows will result in broken files due to the difference in how newlines are handled.
It will run the following command automatically inside the container.
- Server-side source files and automatically builds them if they are modified. Automatically start the server process(es).
- Vite HMR (just the `vite` command) is available. The behavior may be different from production.
- Service Worker is watched by esbuild.
- The front end can be viewed by accessing `http://localhost:5173`.
- The backend listens on the port configured with `port` in .config/default.yml.
If you have not changed it from the default, it will be "http://localhost:3000".
If "port" in .config/default.yml is set to something other than 3000, you need to change the proxy settings in packages/frontend/vite.config.local-dev.ts.
### `MK_DEV_PREFER=backend pnpm dev`
pnpm dev has another mode with `MK_DEV_PREFER=backend`.
```
MK_DEV_PREFER=backend pnpm dev
```
- This mode is closer to the production environment than the default mode.
- Vite runs behind the backend (the backend will proxy Vite at /vite).
- You can see Misskey by accessing `http://localhost:3000` (Replace `3000` with the port configured with `port` in .config/default.yml).
- To change the port of Vite, specify with `VITE_PORT` environment variable.
- HMR may not work in some environments such as Windows.
# THE FOLLOWING IS OUTDATED:
## Testing
- Test codes are located in [`/packages/backend/test`](packages/backend/test).
- Test codes are located in [`/test`](/test).
### Run test
Create a config file.
```
cp .github/misskey/test.yml .config/
cp test/test.yml .config/
```
Prepare DB/Redis for testing.
```
docker compose -f packages/backend/test/compose.yml up
docker-compose -f test/docker-compose.yml up
```
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
- `MISSKEY_CONFIG_YML`: Specify the file path of config.yml instead of default.yml (e.g. `2nd.yml`).
- `MISSKEY_WEBFINGER_USE_HTTP`: If it's set true, WebFinger requests will be http instead of https, useful for testing federation between servers in localhost. NEVER USE IN PRODUCTION.
## Continuous integration
Sharkey uses GitLab CI for executing automated tests.
Configuration files are located in [`/.gitlab-ci.yml`](.gitlab-ci.yml).
Misskey uses GitHub Actions for executing automated tests.
Configuration files are located in [`/.github/workflows`](/.github/workflows).
Misskey uses [Storybook](https://storybook.js.org/) for UI development.
### Setup & Run
#### Setup
```bash
pnpm --filter misskey-js build
```
#### Run
```bash
pnpm --filter frontend storybook-dev
```
### Usage
When you create a new component (in this example, `MyComponent.vue`), the story file (`MyComponent.stories.ts`) will be automatically generated by the `.storybook/generate.js` script.
You can override the default story by creating a impl story file (`MyComponent.stories.impl.ts`).
When using a service with Sharkey, there are several important points to keep in mind.
1. Because it is decentralized, there is no guarantee that data you upload will be deleted from all other servers even if you delete it once. (However, this applies to the internet in general.)
2. Even for posts made in private, there is no guarantee that the recipient's server will treat them as private in the same way. Please exercise caution when posting personal or confidential information. (Again, this applies to the internet in general.)
3. The "Drive" feature is NOT secure cloud storage. This feature exists for easier managing of your uploaded files.
Any data uploaded, whether shared via post or not, will be publicly accessible. Please use 3rd party cloud storage providers if you need to upload data with sensitive information of any kind.
4. Account deletion can be a resource-intensive process and may take a long time. In cases with a lot of uploaded data, it may even be impossible to delete an account.
5. Please disable ad blockers. Some servers may rely on advertising revenue to cover operating costs. Additionally, ad blockers can mistakenly block content and features unrelated to ads, potentially causing issues with the client's functionality and preventing normal use of Sharkey. Therefore, we recommend turning off ad blockers and similar features when using Sharkey.
Please understand these points and enjoy using the service.
<imgsrc="https://custom-icon-badges.herokuapp.com/badge/create_an-instance-FBD53C?logoColor=FBD53C&style=for-the-badge&logo=server&labelColor=363B40"alt="create an instance"/></a>
<ahref="./CONTRIBUTING.md">
<imgsrc="https://custom-icon-badges.herokuapp.com/badge/become_a-contributor-A371F7?logoColor=A371F7&style=for-the-badge&logo=git-merge&labelColor=363B40"alt="become a contributor"/></a>
<ahref="https://discord.gg/6VgKmEqHNk">
<imgsrc="https://custom-icon-badges.herokuapp.com/badge/join_the-community-5865F2?logoColor=5865F2&style=for-the-badge&logo=discord&labelColor=363B40"alt="join the community"/></a>
<imgsrc="https://pool.jortage.com/voringme/misskey/e7cd2a17-8b23-4e1e-b5cf-709480c623e2.png"align="right"height="320px"alt="Calc (the Calckey mascot) smoking a fat dart"/>
## ✨ Features
- **ActivityPub support**\
Not on Sharkey? No problem! Not only can Sharkey instances talk to each other, but you can make friends with people on other networks like Mastodon and Pixelfed!
- **Federated Backgrounds and Music status**\
You can add a background to your profile as well as a music status via ListenBrainz, show everyone what music you are currently listening to
- **Mastodon API**\
Sharkey implements the Mastodon API unlike normal Misskey
- **UI/UX Improvements**\
Sharkey makes some UI/UX improvements to make it easier to navigate
- **Sign-Up Approval**\
With Sharkey, you can enable sign-ups, subject to manual moderator approval and mandatory user-provided reasons for joining.
- **Rich Web UI**\
Sharkey has a rich and easy to use Web UI!
It is highly customizable, from changing the layout and adding widgets to making custom themes.
Furthermore, plugins can be created using AiScript, an original programming language.
- And much more...
# ✨ About Calckey
- Calckey is based off of Misskey, a powerful microblogging server on ActivityPub with features such as emoji reactions, a customizable web UI, rich chatting, and much more!
- Calckey adds many quality of life changes and bug fixes for users and instance admins alike.
- Read **[this document](./CALCKEY.md)** all for current and future differences.
- Notable differences:
- Improved UI/UX (especially on mobile)
- Improved notifications
- Fediverse account migration
- Improved instance security
- Improved accessibility
- Recommended Instances timeline
- OCR image captioning
- New and improved Groups
- Better intro tutorial
- Many more user and admin settings
- [So much more!](./CALCKEY.md)
</div>
<divstyle="clear: both;"></div>
## Documentation
# 🥂 Links
Sharkey Documentation can be found at [Sharkey Documentation](https://docs.joinsharkey.org/docs/install/fresh/)
This guide will work for both **starting from scratch** and **migrating from Misskey**.
## 🔰 Easy installers
If you have access to a server that supports one of the sources below, I recommend you use it! Note that these methods *won't* allow you to migrate from Misskey without manual intervention.
[![Install on Ubuntu](https://pool.jortage.com/voringme/misskey/3b62a443-1b44-45cf-8f9e-f1c588f803ed.png)](https://codeberg.org/calckey/ubuntu-bash-install)[![Install on the Arch User Repository](https://pool.jortage.com/voringme/misskey/ba2a5c07-f078-43f1-8483-2e01acca9c40.png)](https://aur.archlinux.org/packages/calckey)[![Install Calckey with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=calckey)
### 🐋 Docker
[How to run Calckey with Docker](./docker-README.md).
## 🧑💻 Dependencies
- 🐢 At least [NodeJS](https://nodejs.org/en/) v18.12.1 (v19 recommended)
- Install with [nvm](https://github.com/nvm-sh/nvm)
- 🐘 At least [PostgreSQL](https://www.postgresql.org/) v12
- 🍱 At least [Redis](https://redis.io/) v6 (v7 recommend)
### 😗 Optional dependencies
- [FFmpeg](https://ffmpeg.org/) for video transcoding
- [ElasticSearch](https://www.elastic.co/elasticsearch/) for full-text search
- OpenSearch/Sonic are not supported as of right now
By default, you're on the development branch. Run `git checkout beta` or `git checkout main` to switch to the Beta/Main branches.
## 📩 Install dependencies
```sh
# nvm install 19 && nvm use 19
corepack enable
corepack prepare pnpm@latest --activate
# To build without TensorFlow, append --no-optional
pnpm i # --no-optional
```
## 🐘 Create database
Assuming you set up PostgreSQL correctly, all you have to run is:
```sh
psql postgres -c "create database calckey with encoding = 'UTF8';"
```
## 💅 Customize
- To add custom CSS for all users, edit `./custom/assets/instance.css`.
- To add static assets (such as images for the splash screen), place them in the `./custom/assets/` directory. They'll then be available on `https://yourinstance.tld/static-assets/filename.ext`.
- To add custom locales, place them in the `./custom/locales/` directory. If you name your custom locale the same as an existing locale, it will overwrite it. If you give it a unique name, it will be added to the list. Also make sure that the first part of the filename matches the locale you're basing it on. (Example: `en-FOO.yml`)
- To add custom error images, place them in the `./custom/assets/badges` directory, replacing the files already there.
- To add custom sounds, place only mp3 files in the `./custom/assets/sounds` directory.
- To update custom assets without rebuilding, just run `pnpm run gulp`.
## 🧑🔬 Configuring a new instance
- Run `cp .config/example.yml .config/default.yml`
- Edit `.config/default.yml`, making sure to fill out required fields.
- Also copy and edit `.config/docker_example.env` to `.config/docker.env` if you're using Docker.
## 🚚 Migrating from Misskey to Calckey
> ⚠️ Because of their changes, migrating from Foundkey is not supported.
```sh
cp ../misskey/.config/default.yml ./.config/default.yml # replace `../misskey/` with misskey path, add `docker.env` if you use Docker
cp -r ../misskey/files .
```
## 🍀 NGINX
- Run `sudo cp ./calckey.nginx.conf /etc/nginx/sites-available/ && cd /etc/nginx/sites-available/`
- Edit `calckey.nginx.conf` to reflect your instance properly
- Run `sudo cp ./calckey.nginx.conf ../sites-enabled/`
- Run `sudo nginx -t` to validate that the config is valid, then restart the NGINX service.
</details>
## 🚀 Build and launch!
### 🐢 NodeJS + pm2
#### `git pull` and run these steps to update Calckey in the future!
```sh
# git pull
NODE_ENV=production pnpm install && pnpm run build && pnpm run migrate
pm2 start "NODE_ENV=production pnpm run start" --name Calckey
```
## 😉 Tips & Tricks
- When editing the config file, please don't fill out the settings at the bottom. They're designed *only* for managed hosting, not self hosting. Those settings are much better off being set in Calckey's control panel.
- Port 3000 (used in the default config) might be already used on your server for something else. To find an open port for Calckey, run `for p in {3000..4000}; do ss -tlnH | tr -s ' ' | cut -d" " -sf4 | grep -q "${p}$" || echo "${p}"; done | head -n 1`. Replace 3000 with the minimum port and 4000 with the maximum port if you need it.
- I'd recommend you use a S3 Bucket/CDN for Object Storage, especially if you use Docker.
- I'd ***strongly*** recommend against using CloudFlare, but if you do, make sure to turn code minification off.
- For push notifications, run `npx web-push generate-vapid-keys`, then put the public and private keys into Control Panel > General > ServiceWorker.
- For translations, make a [DeepL](https://deepl.com) account and generate an API key, then put it into Control Panel > General > DeepL Translation.
- To add another admin account:
- Go to the user's page > 3 Dots > About > Moderation > turn on "Moderator"
- Go back to Overview > click the clipboard icon next to the ID
- Run `psql -d calckey` (or whatever the database name is)
- Run `UPDATE "user" SET "isAdmin" = true WHERE id='999999';` (replace `999999` with the copied ID)
- Extract the logic of each endpoint definition into a service and just call it
## (2) Improve functionality
Once Phase 1 is complete and an environment conducive to the development of a stable system is in place, the implementation of new functions can begin gradually.
- Improve features for moderation
- ~~OAuth2 support https://github.com/misskey-dev/misskey/issues/8262~~ → Done ✔️
- GraphQL support?
## (3) Improve scalability
Once the development of the feature has settled down, this may be an opportunity to make larger modifications.
- Rewriting in Rust?
## (4) Change the world
It is time to promote Misskey and change the world.
- Become more major than services such as Twitter and become critical infrastructure for the world
- MiOS will be developed and integrated into various systems - What is MiOS?
- Letting Ai-chan interfere with the real world
- Make Misskey a member of GAFA; Misskey's office must be a reinforced concrete brutalist building with a courtyard.
If you discover a security issue in Sharkey, please report it by sending an
email to [admin@transfem.org](mailto:admin@transfem.org).
## Minor Security Issues
If you discover a minor security issue in Calckey, please report it by sending an
email to [kainoa@t1c.dev](mailto:kainoa@t1c.dev).
## High Security Issues
If you discover a security issue, which is so high risk, that too much is affected by it, please dont send it over unencrypted communication. You can share your PGP keys with us using kainoa@t1c.dev and after we established a secure communication, send it over E-Mail, or message us using matrix' encrypted private messages at @t1c:matrix.fedibird.com or @cleo:tchncs.de
This will allow us to assess the risk, and make a fix available before we add a
bug report to the GitLab repository.
bug report to the Codeberg repository.
Thanks for helping make Sharkey safe for everyone.
Thanks for helping make Calckey safe for everyone.
# Linked Data signatures are cryptographic signatures attached to each activity to provide proof of authenticity.
# When using authorized fetch, this is often undesired as any signed activity can be forwarded to a blocked instance by relays and other instances.
# This setting allows admins to disable LD signatures for increased privacy, at the expense of fewer relayed activities and additional inbound fetch (GET) requests.
attachLdSignatureForRelays:true
# check that inbound ActivityPub GET requests are signed ("authorized fetch")
You can configure `docker.env` with anything you like, but you will have to pay attention to the `default.yml` file:
- `url` should be set to the URL you will be hosting the web interface for the instance at.
- `host`, `db`, `user`, `pass` will have to be configured in the `PostgreSQL configuration` section - `host` is the name of the postgres container (eg: *calckey_db_1*), and the others should match your `docker.env`.
- `host`will need to be configured in the *Redis configuration* section - it is the name of the redis container (eg: *calckey_redis_1*)
Everything else can be left as-is.
## Running docker-compose
The [prebuilt container for calckey](https://hub.docker.com/r/thatonecalculator/calckey) is fairly large, and may take a few minutes to download and extract using docker.
Copy `docker-compose.yml` and the `config/` to a directory, then run the **docker-compose** command:
`docker-compose up -d`.
NOTE: This will take some time to come fully online, even after download and extracting the container images, and it may emit some error messages before completing successfully. Specifically, the `db` container needs to initialize and so isn't available to the `web` container right away. Only once the `db` container comes online does the `web` container start building and initializing the calckey tables.
Once the instance is up you can use a web browser to access the web interface at `http://serverip:3000` (where `serverip` is the IP of the server you are running the calckey instance on).
Thanks for taking the time to fill out this bug report!
- type:textarea
id:what-happened
attributes:
label:What happened?
description:Please give us a brief description of what happened.
placeholder:Tell us what you see!
value:"A bug happened!"
validations:
required:true
- type:textarea
id:what-is-expected
attributes:
label:What did you expect to happen?
description:Please give us a brief description of what you expected to happen.
placeholder:Tell us what you wish happened!
value:"Instead of x, y should happen instead!"
validations:
required:true
- type:input
id:version
attributes:
label:Version
description:What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information.
placeholder:Calckey Version 13.0.4
validations:
required:true
- type:input
id:instance
attributes:
label:Instance
description:What instance of calckey are you using?
placeholder:stop.voring.me
validations:
required:false
- type:dropdown
id:browsers
attributes:
label:What browser are you using?
multiple:false
options:
- Firefox
- Chrome
- Brave
- Librewolf
- Chromium
- Safari
- Microsoft Edge
- Other (Please Specify)
- type:textarea
id:logs
attributes:
label:Relevant log output
description:Please copy and paste any relevant log output. You can find your log by inspecting the page, and going to the "console" tab. This will be automatically formatted into code, so no need for backticks.
render:shell
- type:checkboxes
id:terms
attributes:
label:Contribution Guidelines
description:By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md)
options:
- label:I agree to follow this project's Contribution Guidelines
Thanks for taking the time to fill out this feature request!
- type:textarea
id:what-feature
attributes:
label:What feature would you like implemented?
description:Please give us a brief description of what you'd like.
placeholder:Tell us what you want!
value:"x feature would be great!"
validations:
required:true
- type:textarea
id:why-add-feature
attributes:
label:Why should we add this feature?
description:Please give us a brief description of why your feature is important.
placeholder:Tell us why you want this feature!
value:"x feature is super useful because y!"
validations:
required:true
- type:input
id:version
attributes:
label:Version
description:What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information.
placeholder:Calckey Version 13.0.4
validations:
required:true
- type:input
id:instance
attributes:
label:Instance
description:What instance of calckey are you using?
placeholder:stop.voring.me
validations:
required:false
- type:dropdown
id:browsers
attributes:
label:What browser are you using?
multiple:false
options:
- Firefox
- Chrome
- Brave
- Librewolf
- Chromium
- Safari
- Microsoft Edge
- Other (Please Specify)
- type:textarea
id:logs
attributes:
label:Relevant log output
description:Please copy and paste any relevant log output. You can find your log by inspecting the page, and going to the "console" tab. This will be automatically formatted into code, so no need for backticks.
render:shell
- type:checkboxes
id:terms
attributes:
label:Contribution Guidelines
description:By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md)
options:
- label:I agree to follow this project's Contribution Guidelines
headlineMisskey:"নোট ব্যাবহার করে সংযুক্ত নেটওয়ার্ক"
introMisskey:"স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা। \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন 📡\n\"রিঅ্যাকশন\" গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন 👍\nএকটি নতুন দুনিয়া ঘুরে দেখুন 🚀\n"
poweredByMisskeyDescription:"{name} হল ওপেন সোর্স প্ল্যাটফর্ম <b>Misskey</b>-এর সার্ভারগুলির একটি৷"
monthAndDay:"{day}/{month}"
search:"খুঁজুন"
notifications:"বিজ্ঞপ্তি"
username:"ব্যবহারকারীর নাম"
password:"পাসওয়ার্ড"
forgotPassword:"পাসওয়ার্ড ভুলে গেছেন"
fetchingAsApObject:"ফেডিভার্স থেকে খবর আনা হচ্ছে..."
fetchingAsApObject:"ফেডিভার্স থেকে খবর আনা হচ্ছে"
ok:"ঠিক"
gotIt:"বুঝেছি"
cancel:"বাতিল"
noThankYou:"না, ধন্যবাদ"
enterUsername:"ইউজারনেম লিখুন"
renotedBy:"{user} রিনোট করেছেন"
noNotes:"কোন নোট নেই"
noNotifications:"কোনো বিজ্ঞপ্তি নেই"
instance:"ইন্সট্যান্স"
settings:"সেটিংস"
notificationSettings:"বিজ্ঞপ্তির সেটিংস"
basicSettings:"সাধারণ সেটিংস"
otherSettings:"অন্যান্য সেটিংস"
openInWindow:"নতুন উইন্ডোতে খুলা"
@ -45,20 +42,12 @@ pin: "পিন করা"
unpin:"পিন সরান"
copyContent:"বিষয়বস্তু কপি করুন"
copyLink:"লিঙ্ক কপি করুন"
copyLinkRenote:"রিনোট লিঙ্ক কপি করুন"
delete:"মুছুন"
deleteAndEdit:"মুছুন এবং সম্পাদনা করুন"
deleteAndEditConfirm:"আপনি কি এই নোটটি মুছে এটি সম্পাদনা করার বিষয়ে নিশ্চিত? আপনি এটির সমস্ত রিঅ্যাকশন, রিনোট এবং জবাব হারাবেন।"
addToList:"লিস্ট এ যোগ করুন"
addToAntenna:"অ্যান্টেনা এ যোগ করুন"
sendMessage:"একটি বার্তা পাঠান"
copyRSS:"RSS কপি করুন"
copyUsername:"ব্যবহারকারীর নাম কপি করুন"
copyUserId:"ব্যবহারকারীর ID কপি করুন"
copyNoteId:"নোটের ID কপি করুন"
copyFileId:"ফাইল ID কপি করুন"
copyFolderId:"ফোল্ডার ID কপি করুন"
copyProfileUrl:"প্রোফাইল URL কপি করুন"
searchUser:"ব্যবহারকারী খুঁজুন..."
reply:"জবাব"
loadMore:"আরও দেখুন"
@ -111,8 +100,6 @@ renoted: "রিনোট করা হয়েছে"
cantRenote:"এই নোটটি রিনোট করা যাবে না।"
cantReRenote:"রিনোটকে রিনোট করা যাবে না।"
quote:"উদ্ধৃতি"
inChannelRenote:"চ্যানেলে রিনোট"
inChannelQuote:"চ্যানেলে উদ্ধৃতি"
pinnedNote:"পিন করা নোট"
pinned:"পিন করা"
you:"আপনি"
@ -120,11 +107,7 @@ clickToShow: "দেখার জন্য ক্লিক করুন"
sensitive:"সংবেদনশীল বিষয়বস্তু"
add:"যুক্ত করুন"
reaction:"প্রতিক্রিয়া"
reactions:"প্রতিক্রিয়া"
emojiPicker:"ইমোজি পিকার"
pinnedEmojisForReactionSettingDescription:"রিঅ্যাকশন দেয়ার সময় আপনি ইমোজিটিকে পিন করা এবং প্রদর্শিত হওয়ার জন্য সেট করতে পারেন।"
pinnedEmojisSettingDescription:"ইমোজি ইনপুট দেয়ার সময় আপনি ইমোজিটিকে পিন করা এবং প্রদর্শিত হওয়ার জন্য সেট করতে পারেন।"
@ -268,12 +252,12 @@ noMoreHistory: "আর কোন ইতিহাস নেই"
startMessaging:"চ্যাট শুরু করুন"
nUsersRead:"{n} জন পড়েছেন"
agreeTo:"{0} এর প্রতি আমি সম্মত"
tos:"পরিষেবার শর্তাদি"
start:"শুরু করুন"
home:"মূল পাতা"
remoteUserCaution:"এই ব্যাবহারকারী রিমোট ইন্সট্যান্সের, নিম্নক্ত তথ্য অসম্পূর্ণ হতে পারে।"
activity:"কার্যকলাপ"
images:"ছবি"
image:"ছবি"
birthday:"জন্মদিন"
yearsOld:"{age} বছর"
registeredDate:"যোগদানের তারিখ"
@ -310,6 +294,7 @@ copyUrl: "URL কপি করুন"
rename:"পুনঃনামকরণ"
avatar:"প্রোফাইল ছবি"
banner:"ব্যানার"
nsfw:"সংবেদনশীল বিষয়বস্তু"
whenServerDisconnected:"সার্ভারের সাথে সংযোগ বিচ্ছিন্ন হয়ে গেলে"
disconnectedFromServer:"সার্ভার থেকে সংযোগ বিচ্ছিন্ন হয়েছে"
reload:"আবার লোড করুন"
@ -344,6 +329,7 @@ invite: "আমন্ত্রণ"
driveCapacityPerLocalAccount:"প্রত্যেক স্থানীয় ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
driveCapacityPerRemoteAccount:"প্রত্যেক রিমোট ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
inMb:"মেগাবাইটে লিখুন"
iconUrl:"আইকনের URL (ফ্যাভিকন, ইত্যাদি)"
bannerUrl:"ব্যানার ছবির URL"
backgroundImageUrl:"পটভূমির চিত্রের URL"
basicInfo:"আপনার ব্যক্তিগত তথ্য"
@ -357,14 +343,10 @@ hcaptcha: "hCaptcha"
enableHcaptcha:"hCaptcha চালু করুন"
hcaptchaSiteKey:"সাইট কী"
hcaptchaSecretKey:"সিক্রেট কী"
mcaptchaSiteKey:"সাইট কী"
mcaptchaSecretKey:"সিক্রেট কী"
recaptcha:"reCAPTCHA"
enableRecaptcha:"reCAPTCHA চালু করুন"
recaptchaSiteKey:"সাইট কী"
recaptchaSecretKey:"সিক্রেট কী"
turnstileSiteKey:"সাইট কী"
turnstileSecretKey:"সিক্রেট কী"
avoidMultiCaptchaConfirm:"একাধিক Captcha ব্যবহার করলে তারা পরস্পরের কাজে বাধা দিতে পারে। আপনি কি অন্যান্য Captcha নিষ্ক্রিয় করতে চান? আপনি 'বাতিল' ক্লিক করার মাধ্যমে একাধিক Captcha চালু রাখতে পারেন।"
sparkleDescription:"বিষয়বস্তুকে একটি চিকচিকে কণা প্রভাব দেয়।"
rotate:"ঘুরান"
rotateDescription:"বিষয়বস্তুকে একটি নির্দিষ্ট কোনে ঘুরায়।"
_instanceTicker:
none:"দেখাবেন না"
remote:"রিমোট ব্যাবহারকারীদের জন্য দেখান"
@ -949,6 +1001,11 @@ _wordMute:
muteWords:"নিঃশব্দ করা শব্দগুলি"
muteWordsDescription:"স্পেস দিয়ে আলাদা করলে AND শর্ত তৈরি হবে এবং আলাদা লাইনে লিখলে OR শর্ত তৈরি হবে।"
muteWordsDescription2:"রেগুলার এক্সপ্রেশন ব্যবহার করতে স্ল্যাশ দিয়ে কীওয়ার্ডকে ঘিরে রাখুন।"
softDescription:"টাইমলাইন থেকে নির্দিষ্ট শর্তানুযায়ী নোট লুকিয়ে রাখে।"
hardDescription:"নির্দিষ্ট শর্তানুযায়ী নোটগুলিকে টাইমলাইন থেকে বাদ দেয়। আপনি শর্ত পরিবর্তন করলেও যে নোটগুলি যোগ করা হয়নি সেগুলি বাদ দেওয়া হবে।"
soft:"নমনীয়"
hard:"কঠোর"
mutedNotes:"মিউট করা নোটগুলি"
_instanceMute:
instanceMuteDescription:"কনফিগার করা ইন্সট্যান্সের সব নোট এবং রিনোট মিউট করুন, মিউট করা ইন্সট্যান্সের ব্যবহারকারীদের উত্তর সহ।"
instanceMuteDescription2:"প্রতিটিকে আলাদা লাইনে লিখুন"
@ -1012,11 +1069,15 @@ _theme:
infoFg:"তথ্যের পাঠ্য"
infoWarnBg:"ওয়ার্নিং এর পটভূমি"
infoWarnFg:"ওয়ার্নিং এর পাঠ্য"
cwBg:"CW বাটনের পটভূমি"
cwFg:"CW বাটনের পাঠ্য"
cwHoverBg:"CW বাটনের পটভূমি (হভার)"
toastBg:"বিজ্ঞপ্তির পটভূমি"
toastFg:"বিজ্ঞপ্তির পাঠ্য"
buttonBg:"বাটনের পটভূমি"
buttonHoverBg:"বাটনের পটভূমি (হভার)"
inputBorder:"ইনপুট ফিল্ডের বর্ডার"
listItemHoverBg:"লিস্ট আইটেমের পটভূমি (হোভার)"
driveFolderBg:"ড্রাইভ ফোল্ডারের পটভূমি"
wallpaperOverlay:"ওয়ালপেপার ওভারলে"
badge:"ব্যাজ"
@ -1028,6 +1089,10 @@ _sfx:
note:"নোটগুলি"
noteMy:"নোট (আপনার)"
notification:"বিজ্ঞপ্তি"
chat:"চ্যাট"
chatBg:"চ্যাট (ব্যাকগ্রাউন্ড)"
antenna:"অ্যান্টেনাগুলি"
channel:"চ্যানেলের বিজ্ঞপ্তি"
_ago:
future:"ভবিষ্যৎ"
justNow:"এইমাত্র"
@ -1038,20 +1103,42 @@ _ago:
weeksAgo:"{n} সপ্তাহ আগে"
monthsAgo:"{n} মাস আগে"
yearsAgo:"{n} বছর আগে"
invalid:"এখানে কিছুই নাই"
_time:
second:"সেকেন্ড"
minute:"মিনিট"
hour:"ঘণ্টা"
day:"দিন"
_tutorial:
title:"How to use Calckey"
step1_1:"Welcome!"
step1_2:"Let's get you set up. You'll be up and running in no time!"
step2_1:"First, please fill out your profile."
step2_2:"Providing some information about who you are will make it easier for others to tell if they want to see your notes or follow you."
step3_1:"Now time to follow some people!"
step3_2:"Your home and social timelines are based off of who you follow, so try following a couple accounts to get started.\nClick the plus circle on the top right of a profile to follow them."
step4_1:"Let's get you out there."
step4_2:"For your first post, some people like to made a {introduction} post or a simple \"Hello world!\""
step5_1:"Timelines, timelines everywhere!"
step5_2:"Your instance has {timelines} different timelines enabled."
step5_3:"The Home {icon} timeline is where you can see posts from your followers."
step5_4:"The Local {icon} timeline is where you can see posts from everyone else on this instance."
step5_5:"The Recommended {icon} timeline is where you can see posts from instances the admins recommend."
step5_6:"The Social {icon} timeline is where you can see posts from friends of your followers."
step5_7:"The Global {icon} timeline is where you can see posts from every other connected instance."
step6_1:"So, what is this place?"
step6_2:"Well, you didn't just join Calckey. You joined a portal to the Fediverse, an interconnected network of thousands of servers, called \"instances\"."
step6_3:"Each server works in different ways, and not all servers run Calckey. This one does though! It's a bit complicated, but you'll get the hang of it in no time."
step6_4:"Now go, explore, and have fun!"
_2fa:
alreadyRegistered:"আপনি ইতিমধ্যে একটি 2-ফ্যাক্টর অথেনটিকেশন ডিভাইস নিবন্ধন করেছেন৷"
registerDevice:"নতুন ডিভাইস নিবন্ধন করুন"
registerKey:"সিকিউরিটি কী নিবন্ধন করুন"
step1:"প্রথমে, আপনার ডিভাইসে {a} বা {b} এর মতো একটি অথেনটিকেশন অ্যাপ ইনস্টল করুন৷"
step2:"এরপরে, অ্যাপের সাহায্যে প্রদর্শিত QR কোডটি স্ক্যান করুন।"
step2Url:"ডেস্কটপ অ্যাপে, নিম্নলিখিত URL লিখুন:"
step3:"অ্যাপে প্রদর্শিত টোকেনটি লিখুন এবং আপনার কাজ শেষ।"
step4:"আপনাকে এখন থেকে লগ ইন করার সময়, এইভাবে টোকেন লিখতে হবে।"
securityKeyInfo:"আপনি একটি হার্ডওয়্যার সিকিউরিটি কী ব্যবহার করে লগ ইন করতে পারেন যা FIDO2 বা ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর বা পিন সমর্থন করে৷"
renewTOTPCancel:"না, ধন্যবাদ"
_permissions:
"read:account": "অ্যাকাউন্টের তথ্য দেখুন"
"write:account": "অ্যাকাউন্টের তথ্য সম্পাদন করুন"
@ -1097,6 +1184,7 @@ _antennaSources:
homeTimeline:"আপনি অনুসরণ করছেন, এমন ব্যবহারকারীদের নোট"
users:"এক বা একাধিক নির্দিষ্ট ব্যবহারকারীর নোট"
userList:"নির্দিষ্ট তালিকায় নাম থাকা ব্যবহারকারীদের নোট"
userGroup:"নির্দিষ্ট গ্রুপে থাকা ব্যবহারকারীদের নোট"
_weekday:
sunday:"রবিবার"
monday:"সোমবার"
@ -1106,8 +1194,6 @@ _weekday:
friday:"শুক্রবার"
saturday:"শনিবার"
_widgets:
profile:"প্রোফাইল"
instanceInfo:"ইন্সট্যান্সের তথ্য"
memo:"স্টিকি নোট"
notifications:"বিজ্ঞপ্তি"
timeline:"টাইমলাইন"
@ -1127,8 +1213,6 @@ _widgets:
serverMetric:"সার্ভার মেট্রিক্স"
aiscript:"AiScript কনসোল"
aichan:"আই চান"
_userList:
chooseList:"লিস্ট নির্বাচন করুন"
_cw:
hide:"লুকান"
show:"আরও দেখুন"
@ -1165,6 +1249,8 @@ _visibility:
followersDescription:"শুধুমাত্র আপনার অনুসরণকারীদের নিকট পোস্ট করুন"
specified:"ডাইরেক্ট নোট"
specifiedDescription:"শুধুমাত্র নির্দিষ্ট ব্যাবহারকারীর নিকট পাঠান"
localOnly:"শুধুমাত্র লোকাল"
localOnlyDescription:"রিমোট ব্যাবহারকারীদের নিকট দৃশ্যমান নয়"
_postForm:
replyPlaceholder:"নোটটির জবাব দিন..."
quotePlaceholder:"নোটটিকে উদ্ধৃত করুন..."
@ -1190,7 +1276,6 @@ _profile:
changeBanner:"ব্যানার পরিবর্তন করুন"
_exportOrImport:
allNotes:"সকল নোট"
clips:"ক্লিপ"
followingList:"অনুসরণ করা হচ্ছে"
muteList:"মিউট"
blockingList:"ব্লক"
@ -1228,12 +1313,6 @@ _timelines:
local:"স্থানীয়"
social:"সামাজিক"
global:"গ্লোবাল"
_play:
viewSource:"উৎস দেখুন"
featured:"জনপ্রিয়"
title:"শিরোনাম"
script:"স্ক্রিপ্ট"
summary:"বর্ণনা"
_pages:
newPage:"নতুন পৃষ্ঠা বানান"
editPage:"পৃষ্ঠাটি সম্পাদনা করুন"
@ -1269,6 +1348,8 @@ _pages:
eyeCatchingImageRemove:"থাম্বনেইল সরান"
chooseBlock:"ব্লক যোগ করুন"
selectType:"ধরন নির্বাচন করুন"
enterVariableName:"চলকের নাম লিখুন"
variableNameIsAlreadyUsed:"চলকের নামটি ইতিপূর্বে ব্যাবহৃত হয়েছে"
contentBlocks:"বিষয়বস্তু"
inputBlocks:"ইনপুট"
specialBlocks:"বিশেষ"
@ -1278,11 +1359,249 @@ _pages:
section:"বিভাগ"
image:"ছবি"
button:"বাটন"
if:"যদি"
_if:
variable:"চলকগুলি"
post:"নোট লিখুন"
_post:
text:"বিষয়বস্তু"
attachCanvasImage:"ক্যানভাস ছবিসহ পোস্ট করুন"
canvasId:"ক্যানভাস ID"
textInput:"টেক্সট ইনপুট"
_textInput:
name:"চলকের নাম"
text:"শিরোনাম"
default:"ডিফল্ট মান"
textareaInput:"একাধিক লাইনের টেক্সট ইনপুট"
_textareaInput:
name:"চলকের নাম"
text:"শিরোনাম"
default:"ডিফল্ট মান"
numberInput:"সংখ্যা ইনপুট"
_numberInput:
name:"চলকের নাম"
text:"শিরোনাম"
default:"ডিফল্ট মান"
canvas:"ক্যানভাস"
_canvas:
id:"ক্যানভাস ID"
width:"প্রস্থ"
height:"উচ্চতা"
note:"এম্বেড নোট"
_note:
id:"নোট ID"
idDescription:"আপনি এর বদলে নোটের URL পেস্ট করতে পারেন."
detailed:"বিস্তারিত দেখুন"
switch:"সুইচ"
_switch:
name:"চলকের নাম"
text:"শিরোনাম"
default:"ডিফল্ট মান"
counter:"কাউন্টার"
_counter:
name:"চলকের নাম"
text:"শিরোনাম"
inc:"এভাবে মান বাড়ান"
_button:
text:"শিরোনাম"
colored:"রঙ্গিন"
action:"বাটনে ক্লিক করলে যা হবে"
_action:
dialog:"ডায়ালগ দেখান "
_dialog:
content:"বিষয়বস্তু"
resetRandom:"র্যানডম সিড রিসেট করুন"
pushEvent:"ইভেন্ট পাঠান"
_pushEvent:
event:"ইভেন্টের নাম"
message:"চালু হলে প্রদর্শনের জন্য বার্তা"
variable:"পাঠানো চলক"
no-variable:"কিছুই না"
callAiScript:"AiScript চালান"
_callAiScript:
functionName:"ফাংশনের নাম"
radioButton:"বহুনির্বাচনী"
_radioButton:
name:"চলকের নাম"
title:"শিরোনাম"
values:"বিকল্পগুলিকে আলাদা লাইনে লিখুন"
default:"ডিফল্ট মান"
script:
categories:
flow:"নিয়ন্ত্রণ"
logical:"লজিক্যাল অপারেশন"
operation:"হিসাব-নিকাশ"
comparison:"তুলনা"
random:"র্যান্ডম"
value:"মান"
fn:"ফাংশন"
text:"টেক্সট ম্যানিপুলেশন"
convert:"রুপান্তর"
list:"লিস্ট"
blocks:
text:"লেখা"
multiLineText:"লেখা (একাধিক লাইন)"
textList:"লেখার লিস্ট"
_textList:
info:"প্রতিটি এন্ট্রিকে আলাদা লাইনে লিখুন"
strLen:"লেখার দৈর্ঘ্য"
_strLen:
arg1:"লেখা"
strPick:"অক্ষর বের করে আনুন"
_strPick:
arg1:"লেখা"
arg2:"অক্ষরের অবস্থান"
strReplace:"লেখা প্রতিস্থাপন"
_strReplace:
arg1:"লেখা"
arg2:"যে লেখা প্রতিস্থাপন করা হবে"
arg3:"যা দ্বারা প্রতিস্থাপন করা হবে"
strReverse:"লেখা উল্টান"
_strReverse:
arg1:"লেখা"
join:"লেখা যুক্ত করুন"
_join:
arg1:"লিস্ট"
arg2:"বিভাজক"
add:"যোগ"
_add:
arg1:"A"
arg2:"B"
subtract:"বিয়োগ"
_subtract:
arg1:"A"
arg2:"B"
multiply:"গুন"
_multiply:
arg1:"A"
arg2:"B"
divide:"ভাগ"
_divide:
arg1:"A"
arg2:"B"
mod:"ভাগশেষ"
_mod:
arg1:"A"
arg2:"B"
round:"দশমিক রাউন্ড করুন"
_round:
arg1:"সংখ্যা"
eq:"A ও B সমান"
_eq:
arg1:"A"
arg2:"B"
notEq:"A ও B সমান না"
_notEq:
arg1:"A"
arg2:"B"
and:"A এবং B"
_and:
arg1:"A"
arg2:"B"
or:"A অথবা B"
_or:
arg1:"A"
arg2:"B"
lt:"< A , B হতে কম"
_lt:
arg1:"A"
arg2:"B"
gt:"> A , B হতে বেশী"
_gt:
arg1:"A"
arg2:"B"
ltEq:"<= A , B হতে কম বা সমান"
_ltEq:
arg1:"A"
arg2:"B"
gtEq:">= A , B হতে বেশী বা সমান"
_gtEq:
arg1:"A"
arg2:"B"
if:"যদি"
_if:
arg1:"যদি"
arg2:"তাহলে"
arg3:"তাছাড়া"
not:"না"
_not:
arg1:"না"
random:"র্যান্ডম"
_random:
arg1:"সম্ভাব্যতা"
rannum:"র্যানডম সংখ্যা"
_rannum:
arg1:"ন্যূনতম মান"
arg2:"সর্বোচ্চ মান"
randomPick:"তালিকা থেকে দৈবচয়ন করুন"
_randomPick:
arg1:"লিস্ট"
dailyRandom:"র্যান্ডম সংখ্যা (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন পরিবর্তীত হয়)"
_dailyRandom:
arg1:"সম্ভাব্যতা"
dailyRannum:"র্যান্ডম সংখ্যা (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন পরিবর্তীত হয়)"
_dailyRannum:
arg1:"ন্যূনতম মান"
arg2:"সর্বোচ্চ মান"
dailyRandomPick:"তালিকা থেকে এলোমেলোভাবে নির্বাচন করুন (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন পরিবর্তীত হয়)"
_dailyRandomPick:
arg1:"লিস্ট"
seedRandom:"র্যানডম (সীড দ্বারা)"
_seedRandom:
arg1:"সীড"
arg2:"সম্ভাব্যতা"
seedRannum:"র্যানডম সংখ্যা (সীড দ্বারা)"
_seedRannum:
arg1:"সীড"
arg2:"ন্যূনতম মান"
arg3:"সর্বোচ্চ মান"
seedRandomPick:"তালিকা থেকে দৈবচয়ন করুন (সীড দ্বারা)"
_seedRandomPick:
arg1:"সীড"
arg2:"লিস্ট"
DRPWPM:"সম্ভাব্যতা সহ একটি তালিকা থেকে এলোমেলোভাবে নির্বাচন করুন (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন)"
_DRPWPM:
arg1:"লেখার লিস্ট"
pick:"তালিকা থেকে নির্বাচন করুন"
_pick:
arg1:"লিস্ট"
arg2:"অবস্থান"
listLen:"লিস্টের দৈর্ঘ্য পান"
_listLen:
arg1:"লিস্ট"
number:"সংখ্যা"
stringToNumber:"পাঠ্য থেকে সংখ্যা"
_stringToNumber:
arg1:"লেখা"
numberToString:"সংখ্যা থেকে পাঠ্য"
_numberToString:
arg1:"সংখ্যা"
splitStrByLine:"পাঠ্যকে লাইনে বিভক্ত করুন"
_splitStrByLine:
arg1:"লেখা"
ref:"চলক"
aiScriptVar:"AiScript চলক"
fn:"ফাংশন"
_fn:
slots:"স্লটগুলি"
slots-info:"প্রতিটি স্লটকে আলাদা লাইনে লিখুন"
arg1:"আউটপুট"
for:"for-লুপ"
_for:
arg1:"কতবার চলবে"
arg2:"অ্যাকশন"
typeError:"স্লট {slot}, {expect} ধরনের মান গ্রহণ করে, কিন্তু {actual} ধরনের মান দেওয়া হয়েছে!"