# Amethyst

## Nostr Client for Android

Join the social network you control.

[![GitHub downloads](https://img.shields.io/github/downloads/vitorpamplona/amethyst/total?label=Downloads&labelColor=27303D&color=0D1117&logo=github&logoColor=FFFFFF&style=flat)](https://github.com/vitorpamplona/amethyst/releases)
[![PlayStore downloads](https://img.shields.io/endpoint?color=green&logo=google-play&logoColor=green&url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dcom.vitorpamplona.amethyst%26gl%3DUS%26hl%3Den%26l%3DPlayStore%26m%3D%24shortinstalls)](https://play.google.com/store/apps/details?id=com.vitorpamplona.amethyst)

[![Last Version](https://img.shields.io/github/release/vitorpamplona/amethyst.svg?maxAge=3600&label=Stable&labelColor=06599d&color=043b69)](https://github.com/vitorpamplona/amethyst)
[![JitPack version](https://jitpack.io/v/vitorpamplona/amethyst.svg)](https://jitpack.io/#vitorpamplona/amethyst)
[![CI](https://img.shields.io/github/actions/workflow/status/vitorpamplona/amethyst/build.yml?labelColor=27303D)](https://github.com/vitorpamplona/amethyst/actions/workflows/build.yml)
[![License: Apache-2.0](https://img.shields.io/github/license/vitorpamplona/amethyst?labelColor=27303D&color=0877d2)](/LICENSE)

## Download and Install

[](https://github.com/ImranR98/Obtainium)
[](https://github.com/vitorpamplona/amethyst/releases)
[](https://f-droid.org/packages/com.vitorpamplona.amethyst/)
[](https://play.google.com/store/apps/details?id=com.vitorpamplona.amethyst)

## Supported Features

- [x] Events / Relay Subscriptions (NIP-01)
- [x] Follow List (NIP-02)
- [x] OpenTimestamps Attestations (NIP-03)
- [x] Private Messages (NIP-04)
- [x] DNS Address (NIP-05)
- [x] Mnemonic seed phrase (NIP-06)
- [ ] WebBrowser Signer (NIP-07, Not applicable)
- [x] Old-style mentions (NIP-08)
- [x] Event Deletion (NIP-09)
- [x] Replies, mentions, Threads, and Notifications (NIP-10)
- [x] Relay Information Document (NIP-11)
- [x] Generic Tag Queries (NIP-12)
- [x] Proof of Work Display (NIP-13)
- [ ] Proof of Work Calculations (NIP-13)
- [x] Events with a Subject (NIP-14)
- [ ] Marketplace (NIP-15)
- [x] Event Treatment (NIP-16)
- [x] Private Direct Messages (NIP-17)
- [x] Image/Video/Url/LnInvoice Previews
- [x] Reposts, Quotes, Generic Reposts (NIP-18)
- [x] Bech Encoding support (NIP-19)
- [x] Command Results (NIP-20)
- [x] URI Support (NIP-21)
- [x] Long-form Content (NIP-23)
- [x] User Profile Fields / Relay list (NIP-24)
- [x] Reactions (NIP-25)
- [ ] Delegated Event Signing (NIP-26, Will not implement)
- [x] Text Note References (NIP-27)
- [x] Public Chats (NIP-28)
- [ ] Relay-based Groups (NIP-29)
- [x] Custom Emoji (NIP-30)
- [x] Event kind summaries (NIP-31)
- [ ] Labeling (NIP-32)
- [x] Parameterized Replaceable Events (NIP-33)
- [x] Git Stuff (NIP-34)
- [ ] Torrents (NIP-35)
- [x] Sensitive Content (NIP-36)
- [x] Edits (NIP-37/Draft)
- [x] User Status Event (NIP-38)
- [x] External Identities (NIP-39)
- [x] Expiration Support (NIP-40)
- [x] Relay Authentication (NIP-42)
- [x] Versioned Encrypted Payloads (NIP-44)
- [ ] Event Counts (NIP-45, Will not implement)
- [ ] Nostr Connect (NIP-46)
- [x] Wallet Connect API (NIP-47)
- [ ] Proxy Tags (NIP-48, Not applicable)
- [x] Private key encryption for import/export (NIP-49)
- [x] Online Relay Search (NIP-50)
- [x] Lists (NIP-51)
- [ ] Calendar Events (NIP-52)
- [x] Live Activities & Live Chats (NIP-53)
- [x] Wiki (NIP-54)
- [x] Inline Metadata (NIP-55 - Draft)
- [x] Reporting (NIP-56)
- [x] Lightning Tips
- [x] Zaps (NIP-57)
- [x] Private Zaps
- [x] Zap Splits (NIP-57)
- [x] Badges (NIP-58)
- [x] Gift Wraps & Seals (NIP-59)
- [x] Zapraiser (NIP-TBD)
- [ ] Relay List Metadata (NIP-65)
- [x] Polls (NIP-69)
- [x] Video Events (NIP-71)
- [x] Moderated Communities (NIP-72)
- [ ] Zap Goals (NIP-75)
- [ ] Arbitrary Custom App Data (NIP-78)
- [x] Highlights (NIP-84)
- [x] Notify Request (NIP-88/Draft)
- [x] Recommended Application Handlers (NIP-89)
- [x] Data Vending Machine (NIP-90)
- [x] Inline Metadata (NIP-92)
- [x] Verifiable file URLs (NIP-94)
- [x] Binary Blobs (NIP-95/Draft)
- [x] HTTP File Storage Integration (NIP-96)
- [x] HTTP Auth (NIP-98)
- [x] Classifieds (NIP-99)
- [x] Audio Tracks (zapstr.live) (kind:31337)
- [x] Push Notifications (Google and Unified Push)
- [x] In-Device Automatic Translations
- [x] Hashtag Following and Custom Hashtags
- [x] Login with QR
- [x] Bounty support (nostrbounties.com)
- [x] De-googled F-Droid flavor
- [x] Multiple Accounts
- [x] Markdown Support
- [x] Medical Data (NIP-xx/Draft)
- [x] Embed events (NIP-xx/Draft)
- [x] Draft Events (NIP-xx/Draft)
- [ ] Event Sets (NIP-xx/Draft)
- [ ] Topical Notes  (NIP-xx/Draft)
- [ ] Relationship Status (NIP-xx/Draft)
- [ ] Signed Filters (NIP-xx/Draft)
- [ ] Key Migration (NIP-xx/Draft)
- [ ] Time-based Sync (NIP-xx/Draft)
- [ ] Image/Video Capture in the app
- [ ] Local Database
- [ ] Workspaces
- [ ] Infinity Scroll

## Privacy and Information Permanence

Relays know your IP address, your name, your location (guessed from IP), your pub key, all your contacts, and other relays, and can read every action you do (post, like, boost, quote, report, etc) except for Private Zaps and Private DMs. While the content of direct messages (DMs) is only visible to you and your DM counterparty, everyone can see when you and your counterparty DM each other.

If you want to improve your privacy, consider utilizing a service that masks your IP address (e.g. a VPN or Tor) from trackers online.

The relay also learns which public keys you are requesting, meaning your public key will be tied to your IP address.

Information shared on Nostr can be re-broadcasted to other servers and should be assumed permanent for privacy purposes. There is no way to guarantee the deletion of any content once posted.

# Development Overview

This repository is split between Amethyst and Quartz:
- Amethyst is a native Android app made with Kotlin and Jetpack Compose.
- Quartz is our own Nostr-commons library to host classes that are of interest to other Nostr Clients.

The app architecture consists of the UI, which uses the usual State/ViewModel/Composition, the service layer that connects with Nostr relays,
and the model/repository layer, which keeps all Nostr objects in memory, in a full OO graph.

The repository layer stores Nostr Events as Notes and Users separately. Those classes use LiveData and Flow objects to
allow the UI and other parts of the app to subscribe to each Note/User and receive updates when they happen.
They are also responsible for updating viewModels when needed. As the user scrolls through Events, the Datasource classes
are updated to receive more information about those particular Events.

Most of the UI is reactive to changes in the repository classes. The service layer assembles Nostr filters for each need of the app,
receives the data from the Relay, and sends it to the repository. Connection with relays is never closed during the use of the app.
The UI receives a notification that objects have been updated. Instances of User and Notes are mutable directly.
There will never be two Notes with the same ID or two User instances with the same pubkey.

Lastly, the user's account information (private key/pub key) is stored in the Android KeyStore for security.

## Setup

Make sure to have the following pre-requisites installed:
1. Java 17+
2. Android Studio
3. Android 8.0+ Phone or Emulation setup

Fork and clone this repository and import it into Android Studio
```bash
git clone https://github.com/vitorpamplona/amethyst.git
```

Use an Android Studio build action to install and run the app on your device or a simulator.

## Building
Build the app:
```bash
./gradlew assembleDebug
```

## Testing
```bash
./gradlew test
./gradlew connectedAndroidTest
```

## Linting
```bash
./gradlew spotlessCheck
./gradlew spotlessApply
```

## Installing on device

For the F-Droid build:
```bash
./gradlew installFdroidDebug
```

For the Play build:
```bash
./gradlew installPlayDebug
```

## Deploying

1. Generate a new signing key
```
keytool -genkey -v -keystore <my-release-key.keystore> -alias <alias_name> -keyalg RSA -keysize 2048 -validity 10000
openssl base64 < <my-release-key.keystore> | tr -d '\n' | tee some_signing_key.jks.base64.txt
```
2. Create four Secret Key variables on your GitHub repository and fill in the signing key information
    - `KEY_ALIAS` <- `<alias_name>`
    - `KEY_PASSWORD` <- `<your password>`
    - `KEY_STORE_PASSWORD` <- `<your key store password>`
    - `SIGNING_KEY` <- the data from `<my-release-key.keystore>`
3. Change the `versionCode` and `versionName` on `app/build.gradle`
4. Commit and push.
5. Tag the commit with `v{x.x.x}`
6. Let the [Create Release GitHub Action](https://github.com/vitorpamplona/amethyst/actions/workflows/create-release.yml) build a new `aab` file.
7. Add your CHANGE LOG to the description of the new release
8. Download the `aab` file and upload it to the PlayStore.

## Using the Quartz library

Setup [JitPack.io](https://jitpack.io/#vitorpamplona/amethyst/v0.84.3) to your build file

Add `maven { url 'https://jitpack.io' }` to settings.gradle at the end of repositories:

```gradle
dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    mavenCentral()
    maven { url 'https://jitpack.io' }
  }
}
```

Add the dependency

```gradle
implementation('com.github.vitorpamplona.amethyst:quartz:v0.85.1')
```

## Contributing

Issues can be logged on: [https://gitworkshop.dev/repo/amethyst](https://gitworkshop.dev/repo/amethyst)

[GitHub issues](https://github.com/vitorpamplona/amethyst/issues) and [pull requests](https://github.com/vitorpamplona/amethyst/pulls) here are also welcome. Translations can be provided via [Crowdin](https://crowdin.com/project/amethyst-social)

You can also send patches through Nostr using [GitStr](https://github.com/fiatjaf/gitstr) to [this nostr address](https://patch34.pages.dev/naddr1qqyxzmt9w358jum5qyg8v6t5daezumn0wd68yvfwvdhk6qg7waehxw309ahx7um5wgkhqatz9emk2mrvdaexgetj9ehx2ap0qy2hwumn8ghj7un9d3shjtnwdaehgu3wvfnj7q3qgcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqxpqqqpmej720gac)

By contributing to this repository, you agree to license your work under the MIT license. Any work contributed where you are not the original author must contain its license header with the original author(s) and source.

# Screenshots

| FollowFeeds                              | ChatsGroup                              | LiveStreams                                    | Notifications                                          |
|-------------------------------------------|----------------------------------------------|-------------------------------------------------|--------------------------------------------------------|
| ![Home Feed](./docs/screenshots/home.png) | ![Messages](./docs/screenshots/messages.png) | ![Live Streams](./docs/screenshots/replies.png) | ![Notifications](./docs/screenshots/notifications.png) |

# Contributors

# MIT License

Copyright (c) 2023 Vitor Pamplona

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


![Logo white](images/Logo-White.svg#gh-dark-mode-only)
![Logo white](images/Logo-Black.svg#gh-light-mode-only)

<!-- maven coordinates -->
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.typesafegithub/github-workflows-kt/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.github.typesafegithub/github-workflows-kt)
[![Awesome Kotlin Badge](https://kotlin.link/awesome-kotlin.svg)](https://github.com/KotlinBy/awesome-kotlin)
[![GitHub Repo stars](https://img.shields.io/github/stars/typesafegithub/github-workflows-kt)](https://star-history.com/#typesafegithub/github-workflows-kt&Date)
[![License](https://img.shields.io/github/license/typesafegithub/github-workflows-kt)](https://github.com/typesafegithub/github-workflows-kt/blob/main/LICENSE)
[![github-workflows-kt @ kotlinlang.slack.com](https://img.shields.io/static/v1?label=kotlinlang&message=github-workflows-kt&color=blue&logo=slack)](https://kotlinlang.slack.com/archives/C02UUATR7RC)

[github-workflows-kt](https://github.com/typesafegithub/github-workflows-kt/) is a tool for creating
[GitHub Actions workflows](https://docs.github.com/en/actions/using-workflows) in a **type-safe** script, helping you to
build **robust** workflows for your GitHub projects without mistakes, with **pleasure**, in
[Kotlin](https://kotlinlang.org/).

> _You won't go back to YAML!_

### 💡 Idea

We're often surrounded by YAML configuration. It's a powerful format that provides simple syntax for defining
hierarchical data, but it is sometimes used (abused?) to configure complicated scenarios which leads to complicated
files that are difficult to write and maintain.

Who among us hasn't accidentally used the wrong indentation, missed a possibility to extract a reusable piece of code,
or been confused by ambiguous types? The power of a generic-purpose would come in handy in these cases.

We're developing **github-workflows-kt** to solve these and other problems, so you can create GitHub Workflows with
confidence.

### ✨ Benefits

* **no indentation confusion** - Kotlin's syntax doesn't rely on it
* **immediate validation** - catch bugs early during development, not during runtime
* **strongly typed values** - no more confusion about what type is needed for a given parameter
* **superb IDE support** - author your workflows in any IDE that supports Kotlin, with auto-completion and documentation
  at your fingertips
* **no duplication** - don't repeat yourself! Share common configuration using constant values, or define your own
  functions to encapsulate logic
* **fully featured language** - use the full power of Kotlin to generate workflows dynamically, randomly generate data,
  or add custom validation. Defining workflow logic in Kotlin is currently experimental
* **built-in support for over 100 actions** - the most popular actions can be used in a type-safe manner thanks to the
  bundled bindings. For more information, see
  [Supported actions](https://typesafegithub.github.io/github-workflows-kt/supported-actions/)
* integrates with [github-actions-typing](https://github.com/typesafegithub/github-actions-typing) to use typings
  provided by action authors
* [and more!](https://typesafegithub.github.io/github-workflows-kt/)

## For more info please see [the documentation](https://typesafegithub.github.io/github-workflows-kt/)

* [getting started](https://typesafegithub.github.io/github-workflows-kt/user-guide/getting_started/)
* [API docs](https://typesafegithub.github.io/github-workflows-kt/api-docs/)
* [how to contribute](https://github.com/typesafegithub/github-workflows-kt/blob/main/CONTRIBUTING.md)

![teaser](https://github.com/typesafegithub/github-workflows-kt/blob/gh-pages/teaser-with-newest-version.svg)


[![license][license-badge]][isc] [![discord-badge]][discord] [![gitpod-badge]][gitpod]

# Game Server

This repository hosts the game server files which contain all of our relevant plugins, core, and data. The game server is derived from RSMod v1 and has been since converted to work with the RuneTek-5 engine, and targets revision 667.

# Community

- Discord: [2011Scape Discord](https://discord.gg/jDbBAKjhxh)
- Reddit: [r/2011Scape](https://www.reddit.com/r/2011scape/)

# Quick Links

2011Scape Related
- [Game Repository](https://github.com/2011Scape/game)
- [File Server Repository](https://github.com/2011Scape/file-server)
- [Client Repository](https://github.com/2011Scape/rs-client)
- [Installation Guide](https://github.com/2011Scape/installation-guide)

Extras
- [OpenRS2 Archive](https://archive.openrs2.org/)
- [Lost City, 2004 Emulator](https://discord.gg/hN3tHUmZEN)
- [2009Scape, 2009 Emulator](https://2009scape.org)

[isc]: https://opensource.org/license/apache-2-0
[license]: https://github.com/2011Scape/game/blob/main/LICENSE
[license-badge]: https://img.shields.io/badge/license-ISC-informational

[discord]: https://discord.gg/jDbBAKjhxh
[discord-badge]: https://img.shields.io/discord/1055304546521469019?color=%237289da&logo=discord

[gitpod]: https://gitpod.io/#https://github.com/2011Scape/game
[gitpod-badge]: https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod


# TelegramBotAPI [![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi) [![Supported version](https://img.shields.io/badge/Telegram%20Bot%20API-7.4-blue)](https://core.telegram.org/bots/api-changelog#may-28-2024)

|          Docs          |                                   [![KDocs](https://img.shields.io/static/v1?label=Dokka&message=KDocs&color=blue&logo=kotlin)](https://tgbotapi.inmo.dev/index.html) [![Mini tutorial](https://img.shields.io/static/v1?label=Mk&message=Docs&color=blue&logo=mkdocs)](https://docs.inmo.dev/tgbotapi/index.html)                                    |
|:----------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|      Useful repos      |                           [![Create bot](https://img.shields.io/static/v1?label=Github&message=Template&color=blue&logo=github)](https://github.com/InsanusMokrassar/TelegramBotAPI-bot_template/generate) [![Examples](https://img.shields.io/static/v1?label=Github&message=Examples&color=blue&logo=github)](https://github.com/InsanusMokrassar/TelegramBotAPI-examples/)                           |
|          Misc          |                              [![Awesome Kotlin Badge](https://kotlin.link/awesome-kotlin.svg)](https://github.com/KotlinBy/awesome-kotlin) [![Small survey](https://img.shields.io/static/v1?label=Google&message=Survey&color=blue&logo=google-sheets)](https://docs.google.com/forms/d/e/1FAIpQLSctdJHT_aEniyYT0-IUAEfo1hsIlezX2owlkEAYX4KPl2V2_A/viewform?usp=sf_link)                               |
|       Platforms        |                                                                                ![JVM](https://img.shields.io/badge/JVM-red?style=plastic&logo=openjdk&logoColor=white) ![Js](https://img.shields.io/badge/JavaScript-323330?style=plastic&logo=javascript&logoColor=F7DF1E)                                                                                |
| Experimental Platforms |                                                                                [![Linux x64](https://img.shields.io/badge/LinuxX64-FCC624?style=plastic&logo=linux&logoColor=black)](https://kotlinlang.org/docs/native-target-support.html#tier-1) [![MinGW x64](https://img.shields.io/badge/MinGWX64-black?style=plastic&logo=windows&logoColor=green)](https://kotlinlang.org/docs/native-target-support.html#tier-1)                                                                                |

Hello! This is a set of libraries for working with Telegram Bot API.

## Examples

There are several things you need to do to launch examples below:

* Add `mavenCentral()` to your project repositories
    * [Maven variant](https://github.com/InsanusMokrassar/TelegramBotAPI/wiki/Including-in-your-project#pomxml)
* Add dependency `implementation "dev.inmo:tgbotapi:$tgbotapi_version"`
    * Replace `tgbotapi_version` with exact version (see last one in the table above) or put variable with this name in project
    * Alternative variant for maven [here](https://github.com/InsanusMokrassar/TelegramBotAPI/wiki/Including-in-your-project#telegrambotapi)

More including instructions [available here](https://github.com/InsanusMokrassar/TelegramBotAPI/wiki/Including-in-your-project).
Other configuration examples:

* [For multiplatform](https://github.com/InsanusMokrassar/TelegramBotAPI-examples/tree/master/ResenderBot)
* [For JVM](https://github.com/InsanusMokrassar/TelegramBotAPI-examples/blob/master/GetMeBot/build.gradle)

### Most common example

```kotlin
suspend fun main() {
  val bot = telegramBot(TOKEN)

  bot.buildBehaviourWithLongPolling {
    println(getMe())

    onCommand("start") {
      reply(it, "Hi:)")
    }
  }.join()
}
```

In this example you will see information about this bot at the moment of starting and answer with `Hi:)` every time it
gets message `/start`

### Handling only last messages

```kotlin
suspend fun main() {
  val bot = telegramBot(TOKEN)

  val flowsUpdatesFilter = FlowsUpdatesFilter()
  bot.buildBehaviour(flowUpdatesFilter = flowsUpdatesFilter) {
    println(getMe())

    onCommand("start") {
      reply(it, "Hi:)")
    }

    retrieveAccumulatedUpdates(this).join()
  }
}
```

The main difference with the previous example is that bot will get only last updates (accumulated before bot launch
and maybe some updates it got after launch)

### Build a little bit more complex behaviour

```kotlin
suspend fun main() {
  val bot = telegramBot(TOKEN)

  bot.buildBehaviourWithLongPolling {
    println(getMe())

    val nameReplyMarkup = ReplyKeyboardMarkup(
      matrix {
        row {
          +SimpleKeyboardButton("nope")
        }
      }
    )
    onCommand("start") {
      val photo = waitPhoto(
        SendTextMessage(it.chat.id, "Send me your photo please")
      ).first()

      val name = waitText(
        SendTextMessage(
          it.chat.id,
          "Send me your name or choose \"nope\"",
          replyMarkup = nameReplyMarkup
        )
      ).first().text.takeIf { it != "nope" }

      sendPhoto(
        it.chat,
        photo.mediaCollection,
        entities = buildEntities {
          if (name != null) regular(name) // may be collapsed up to name ?.let(::regular)
        }
      )
    }
  }.join()
}
```

### More examples

You may find examples in [this project](https://github.com/InsanusMokrassar/TelegramBotAPI-examples). Besides, you are
always welcome in our [docs](https://docs.inmo.dev/tgbotapi/index.html) and
[chat](https://t.me/InMoTelegramBotAPIChat).


# Taxi

Welcome! 👋 Taxi is a language for documenting data - such as data models - and the contracts of APIs.

Specifically, Taxi aims to describe how data & APIs across an ecosystem relate with one another, and to allow consumers
to
compose services together, without being coupled to underlying APIs.

Taxi describes data *semantically* - using rich semantic types - ie., types that, which allows powerful tooling to
discover and map data based on it's meaning, rather than the name of a field.

![](https://img.shields.io/badge/dynamic/xml.svg?label=Taxi&url=http%3A%2F%2Frepo.orbitalhq.com%2Frelease%2Forg%2Ftaxilang%2Fparent%2Fmaven-metadata.xml&query=%2F%2Frelease&colorB=green&prefix=v&style=for-the-badge&logo=kotlin&logoColor=white)

## Quick links

* [Docs](https://taxilang.org)
* [Installing the CLI](https://taxilang.org/taxi-cli/intro/#install)
   * [Using a pre-release version of the cli](#trying-a-pre-release-version)
* [Developer Notes](#developer-notes)
   * [Releasing](#releasing)
   * [Maven co-ordinates](#maven-co-ordinates)

## Example

Taxi allows you to be really expressive about what the meaning is of data returned from an API. By describing the *
*meaning**  of our data, we can start to make data interchangeable.

For example:

```
model Customer {
   id : CustomerId inherits String
   firstName : FirstName inherits String
   lastName : LastName inherits String
}

model Invoice {
   invoiceId : InvoiceId inherits Int
   customerId : CustomerId
}
```

Those `String`s now have a little more meaning. And look - we now know that `Invoice.customerId` and `Customer.id`
describe the same piece of information - a `CustomerId`.

By building out this set of terms - we create a Taxonomy of interchangeable types. This allows us to better document how
data is intended to be used. Tooling such as [Orbital](https://orbitalhq.com)
can leverage this to link and discover data automatically, and automate API integration.

```
@HttpOperation(method = "GET", url = "http://myApp/customers/{id}")
operation getPerson(id: CustomerId):Customer
```

## Getting started

### Playground - Voyager

[Voyager](https://voyager.orbitalhq.com) is a playground for quickly writing Taxi, and generating diagrams. Read more about
why we built Voyager, and where it's going, [here](https://blog.vyne.co/introducing-voyager/)

## FAQ's

### Why do we need another schema language?

There's a much lengthier blog discussing why we built
Taxi [here](https://orbitalhq.com/blog/2023-05-12-why-we-created-taxi)

There's also an answer to this question in our [docs](https://docs.taxilang.org/#why-do-we-need-another-schema-language)

### How does Taxi relate to OpenAPI / RAML / AsyncApi etc.

Taxi has [strong interoperability with OpenApi](/language-reference/taxi-and-openapi/). While you can use
Taxi to fully describe REST-ish APIs in the same way you can use OpenAPI, most people prefer to combine the two.

It's more common to embed Taxi metadata inside your existing OpenAPI specs, to get the best of both worlds. This lets
you use
OpenAPI to describe the capabilities of an API, and Taxi metadata describes how the inputs and data returned relate to
other systems
in your ecosystem.

In comparing Taxi and OpenAPI, there's some areas where Taxi is stronger:

* Readability & Writability - you can easily sketch a Taxi spec by hand, because it's a dedicated DSL, rather than YAML
* Taxi's type system is much richer and more expressive. It has a full semantic type system, and compiler to validate
  that API contracts are correct.
* Taxi is better at describing how data relates **between** APIs - OpenAPI's goal is to describe a single API, not the
  relationship between multiple APIs
* Taxi's documentation goals are broader than just HTTP APIs, it includes Message queues, Serverless functions,
  Databases, etc.

But, in most other areas other OpenAPI is stronger:

* It's the defacto standard - pretty much everyone understands what OpenAPI is.
* The tooling ecosystem is awesome.
* It's more mature, having had the benefit of thousands of developers collaborating for years.

### Taxi vs Protobuf / Avro

In addition to the differences with OpenAPI / RAML, Protobuf and Avro are also an encoding specification - they
document how payloads are serialized to bytes.

Taxi does not attempt to be a serialization protocol.

### Taxi vs GraphQL

Taxi (and espeically the query language - TaxiQL) and GraphQL share similar goals - providing a single entrypoint for
composing multiple APIs together.

However, there are subtle, but key differences in their approach:

#### TaxiQL doesn't need resolvers

One of the goals of Taxi is to allow software to automate integration between systems, without engineers having
to write glue code. It's semantic types become the links between data sources.

In comparison, GraphQL relies on resolvers to code how to stitch together APIs. These resolvers need to be maintained,
such that breaking changes in upstream systems need to be propagated into resolver code.

#### TaxiQL is protocol agnostic

GraphQL federation requires "GraphQL everywhere". Taxi aims to work with the API specs you already have, and can bridge
between OpenAPI, RAML, JsonSchema and Protobuf without requiring exisitng schemas to be replaced.

Taxi can also bridge between Databases, but - like GraphQL - that *does* require a Taxi schema in addition to the
DDL.  (We haven't figured
out a neat way to embed taxi metadata in DDL scripts. If you have ideas, we'd love to hear them).

#### TaxiQL allows consumers to define their data contracts

GraphQL has a single schema, that consumers can cherry-pick fields from. This single schema can become difficult to
refactor it,
as all the consumers also need to change.

TaxiQL is designed to allow consumers to define the contract of data they want, and it's up to the query engine to
satisfy this
contract. This means that as publisher contracts change, consumers remain decoupled, keeping cost-of-change low.

## Language Goals

As a language, Taxi focuses on:

* **Readability**  - A familiar syntax that should be easy to write, and easy to understand.
* **Expressiveness** - Taxi should be able to describe the semantic meaning of your data, and rich quirky contracts of
  our APIs
* **Typesafe** - A strongly typed, expressive language, purpose-built for describing API operations & types
* **Tooling** - Taxi is intended to allow next-generation tooling integration - the syntax allows rich expression of
  what services can do \(rather than just where to find them\).
* **Extensibility** - Taxi allows you to refine and compose API schemas, adding context, annotations, and improving type
  signatures.

Taxi is used heavily to power [Orbital](https://orbitalhq.com) - and the projects have influenced each other & evolved
together. The expressiveness of Taxi allows Orbital to automate integration between services.

However, Taxi is intended to be a standalone tool, and is not coupled to Orbital. There's lots of amazing things you can
do with Taxi on it's own.

## New to Taxi or Orbital?

It's easy to adopt Taxi incrementally, meaning you can set it up alongside an existing solution (such as Swagger or XML
schemas) and migrate functionality at your convenience.

In fact, Taxi is designed to complement those tools, and you can happily use Swagger or XSDs are you base schema, and
then overlay semantic data using Taxi.

## Developer notes

### Maven Co-ordinates

Currently, we publish to the Orbital maven repo:

```xml

<repositories>
   <repository>
      <id>orbital-snapshots</id>
      <url>https://repo.orbitalhq.com/snapshot</url>
      <snapshots>
         <enabled>true</enabled>
      </snapshots>
   </repository>

   <repository>
      <id>orbital</id>
      <url>https://repo.orbitalhq.com/release</url>
      <snapshots>
         <enabled>false</enabled>
      </snapshots>
   </repository>
</repositories>
```

Generally, tooling will want to make use of the compiler, which is:

```xml

<dependency>
   <groupId>org.taxilang</groupId>
   <artifactId>compiler</artifactId>
   <version>${latest-version}</version>
</dependency>
```

Other artifacts are available using their appropriate modules artifactId.

We plan on publishing to maven central too. Track / Vote for [this issue](https://github.com/taxilang/taxilang/issues/3)
for updates.

### Releasing

To publish a release to the oribtal repo, you must first export your AWS credentials with appropriate access:

```bash
export AWS_ACCESS_KEY_ID=xxxx
export AWS_SECRET_ACCESS_KEY=xxxx
```

And, in your `~/.m2/settings.xml`, have the following:

```xml
<settings>
    <profiles>
        <profile>
            <id>sdkman</id>
            <properties>
                <sdkman.consumer.key>xxx</sdkman.consumer.key>
                <sdkman.consumer.token>xxx</sdkman.consumer.token>
            </properties>
        </profile>
    </profiles>
</settings>
```

```
# Can use mvn too, but it's slower.
mvnd clean install
# deploy doesn't work great with mvnd
#
mvn deploy -P orbital-repo,sdkman
```

This will publish all the jars, as well as the `taxi-cli` zip to the Orbital repo, and release on sdkman.

### Trying a pre-release version

The easiest way to use a prerelease version is with the `get-taxi-preview.sh` script in this repo.

It will download the latest snapshot of a given version. eg:

```bash
wget https://raw.githubusercontent.com/taxilang/taxilang/develop/get-taxi-preview.sh
chmod +x get-taxi-preview.sh
./get-taxi-preview 1.37.0
```

The above example will download the latest prerelease of version `1.37.0`.

It will be downloaded to `.taxi/1.37.0` relative to the current directory.

Example output:

```bash
./get-taxi-preview 1.37.0
Latest snapshot version: 1.37.0-20230518.071013-9
Downloading https://repo.orbitalhq.com/snapshot/org/taxilang/taxi-cli/1.37.0-SNAPSHOT/taxi-cli-1.37.0-20230518.071013-9.zip to .taxi/
# lots of downloady and unzippy stuff
Latest taxi 1.37.0 is now available at /home/some/path/.taxi/1.37.0/taxi/bin/taxi
You can run this version by using the following alias:
alias taxip=/home/some/path/.taxi/1.37.0/taxi/bin/taxi
```

#### Release vscode plugin

To get a personal access token, log in at [https://dev.azure.com/taxi-lang/taxi-vscode-plugin](Azure), and
follow the instructions [here](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) to create a token.

Then

```bash
cd language-server/vscode-extension

npm install
npm run sync-pom-version
npm run vsce:package
npm run vsce:publish
```


# Lavalink

A standalone audio sending node based on [Lavaplayer](https://github.com/lavalink-devs/lavaplayer) and [Koe](https://github.com/KyokoBot/koe).
Allows for sending audio without it ever reaching any of your shards.

Being used in production by FredBoat, Dyno, LewdBot, and more.

A [basic example bot](Testbot) is available.

[![Lavalink Guild](https://discordapp.com/api/guilds/1082302532421943407/embed.png?style=banner2)](https://discord.gg/ZW4s47Ppw4)

> [!NOTE]
> Lavalink v4 is now **out** of beta! See [the changelog](CHANGELOG.md) for more information.

## Getting started
* Pick one of the [up-to-date clients](https://lavalink.dev/clients). Advanced users can create their own using the [API documentation
](https://lavalink.dev/api/)
* See the [server configuration documentation](https://lavalink.dev/configuration/) for configuring your Lavalink server
* Explore [available plugins](https://lavalink.dev/plugins) for extra features
* See also our [FAQ](https://lavalink.dev/getting-started/faq)

Table of Contents

- [Features](#features)
- [Requirements](#requirements)
- [Hardware Support](#hardware-support)
- [Changelog](#changelog)
- [Versioning policy](#versioning-policy)

## Features
* Powered by Lavaplayer
* Minimal CPU/memory footprint
* Twitch/YouTube (via [this](https://github.com/lavalink-devs/youtube-source#plugin) plugin) stream support
* Event system
* Seeking
* Volume control
* REST API for resolving Lavaplayer tracks, controlling players, and more
* Statistics (good for load balancing)
* Basic authentication
* Prometheus metrics
* Docker images
* [Plugin support](https://lavalink.dev/plugins.html)

## Requirements

* Java 17 LTS or newer required. (we recommend running the latest LTS version or newer)
* OpenJDK or Zulu running on Linux AMD64 is officially supported.

Support for other JVMs is also best-effort. Periodic CPU utilization stats are prone not to work everywhere.

## Hardware Support

Lavalink also runs on other hardware, but support is best-effort.
Here is a list of known working hardware:

| Operating System | Architecture | Lavaplayer | JDA-NAS | Timescale | AVX2 |
|------------------|--------------|------------|---------|-----------|------|
| linux            | x86-64       | ✅          | ✅       | ✅         | ✅    |
| linux            | x86          | ✅          | ✅       | ✅         | ✅    |
| linux            | arm          | ✅          | ✅       | ✅         | ❌    |
| linux            | armhf        | ✅          | ❌       | ❌         | ❌    |
| linux            | aarch32      | ✅          | ❌       | ❌         | ❌    |
| linux            | aarch64      | ✅          | ✅       | ✅         | ❌    |
| linux-musl       | x86-64       | ✅          | ✅       | ✅         | ✅    |
| linux-musl       | aarch64      | ✅          | ✅       | ✅         | ❌    |
| windows          | x86-64       | ✅          | ✅       | ✅         | ✅    |
| Windows          | x86          | ✅          | ✅       | ✅         | ✅    |
| darwin           | x86-64       | ✅          | ✅       | ✅         | ✅    |
| darwin           | aarch64e     | ✅          | ✅       | ✅         | ❌    |

## Changelog

Please see [here](CHANGELOG.md)

## Versioning policy

Lavalink follows [Semantic Versioning](https://semver.org/).

The version number is composed of the following parts:

    MAJOR breaking API changes
    MINOR new backwards compatible features
    PATCH backwards compatible bug fixes
    PRERELEASE pre-release version
    BUILD additional build metadata

Version numbers can come in different combinations, depending on the release type:

    `MAJOR.MINOR.PATCH` - Stable release
    `MAJOR.MINOR.PATCH+BUILD` - Stable release with additional build metadata
    `MAJOR.MINOR.PATCH-PRERELEASE` - Pre-release
    `MAJOR.MINOR.PATCH-PRERELEASE+BUILD` - Pre-release additional build metadata


# ![Hammer Logo](readme/logo.png) Hammer: A story editor

A simple tool for building stories.

![MIT License](https://img.shields.io/github/license/Wavesonics/hammer-editor) [![CircleCI](https://img.shields.io/circleci/build/github/Wavesonics/hammer-editor/develop)](https://app.circleci.com/pipelines/github/Wavesonics/hammer-editor) [![codebeat badge](https://codebeat.co/badges/ff1a14c8-352e-495f-8b61-2d5d46061149)](https://codebeat.co/projects/github-com-wavesonics-hammer-editor-master) [![codecov](https://codecov.io/gh/Wavesonics/hammer-editor/branch/develop/graph/badge.svg)](https://codecov.io/gh/Wavesonics/hammer-editor)

![badge-platform-android] ![badge-platform-windows] ![badge-platform-linux] ![badge-platform-macos]

[![Discord badge](https://img.shields.io/discord/1100282852295327744?logo=discord)](https://discord.gg/GTmgjZcupk)
[![Localization badge](https://hosted.weblate.org/widgets/hammer/-/clients/svg-badge.svg)](https://hosted.weblate.org/engage/hammer/)

### Available on:

[![Google Play](https://img.shields.io/endpoint?color=green&logo=google-play&logoColor=green&url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dcom.darkrockstudios.apps.hammer.android%26l%3DGoogle%2520Play%26m%3D%24version)](https://play.google.com/store/apps/details?id=com.darkrockstudios.apps.hammer.android)
[![F-Droid](https://img.shields.io/f-droid/v/com.darkrockstudios.apps.hammer.android?logo=FDROID)](https://f-droid.org/en/packages/com.darkrockstudios.apps.hammer.android/)
[![GitHub](https://img.shields.io/github/v/release/Wavesonics/hammer-editor?include_prereleases&logo=github)](https://github.com/Wavesonics/hammer-editor/releases/latest)

### _**Note:** This is currently Alpha quality software, users beware!_

Take a look at the [Roadmap](docs/ROADMAP.md) to see whats coming.

### Community
Join our [Discord](https://discord.gg/GTmgjZcupk) and help us by reporting bugs, making feature requests, and discussing
the future of Hammer.

Or visit us on Reddit at [r/hammereditor](https://www.reddit.com/r/hammereditor/)

## Multi-platform

This app is where ever you are. Your phone, tablet, desktop, laptop, this program can be installed and run, not simply a
website-in-a-box, but instead using native client side technologies to provide the best experience possible.

### Will add support for more platforms in the future:

- ![badge-platform-ios]

## Multi-Screen

Whether you are on a phone, tablet, or desktop, Hammer will make the best use of your screen space.
Also supporting both light and dark modes.

![Screen Shots](readme/preview.png)

## Offline first

I was frustrated with most of the story writing software I was finding as they were using web technologies (_aka: Web
Page in a box_) which always seems to run into problems while being used offline for long periods of time. Hammer is
designed from the ground up to be entirely local, no internet connection required, ever.

## Transparent Data

Your data is yours. It's not stored in the cloud, or some opaque database. It is stored in simple, human readable files,
just using files and folders to define the project structure. You can open your OSes file browser and take a look for
your self. If this program went away today you would be able to easily interact with your data.

## Intelligent Syncing between devices

Your data can be synchronized between devices allowing you to work on your story from anywhere, and have no fear of a
change on one device, overwriting a change on another device.

## Optional and Self hosted Syncing

Syncing is entirely optional, you can install the client and use it on one device, or you can
install the server and
sync your data between devices. You could even use some other service to sync your data, like
Dropbox or Google Drive.
It's all up to you. Instructions can be found [here](docs/HOW-TO-RUN-A-SERVER.md).

If you don't know how, or just don't want to setup your own server, we're also running an official
syncing server.

### Official Server: [hammer.ink](https://hammer.ink/)
while we're still early in development here, the official server is invite only. but I'll approve anyone for now, just ask.

We're also running a test environment here: [test.hammer.ink](https://test.hammer.ink/) which is always running the latest commit.

_Do not use the test environment for real data! It will get cleared from time-to-time without notice!_

# Development

Want to contribute? Great! [Here are some instructions to get you started](DEVELOPMENT.md).

![badge-kotlin]

[![Redeploy](https://repology.org/badge/vertical-allrepos/hammer-editor.svg)](https://repology.org/project/hammer-editor/versions)

<!-- TAG_DEPENDENCIES -->

[badge-kotlin]: https://img.shields.io/badge/kotlin-1.9.0-blue.svg?logo=kotlin

<!-- PLATFORMS -->

[badge-platform-linux]: http://img.shields.io/badge/platform-linux-2D3F6C.svg?style=flat

[badge-platform-android]: http://img.shields.io/badge/platform-android-6EDB8D.svg?style=flat

[badge-platform-ios]: http://img.shields.io/badge/platform-ios-CDCDCD.svg?style=flat

[badge-platform-windows]: http://img.shields.io/badge/platform-windows-4D76CD.svg?style=flat

[badge-platform-macos]: http://img.shields.io/badge/platform-macos-111111.svg?style=flat


| Build | Preview Release | Codefactor | Stable | Translate Aniyomi                                                                                | Discord Server |
|-------|-----------|-------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------|---------|
| [![CI](https://github.com/aniyomiorg/aniyomi/actions/workflows/build_push.yml/badge.svg)](https://github.com/aniyomiorg/aniyomi/actions/workflows/build_push.yml) | [![latest preview build](https://img.shields.io/github/v/release/aniyomiorg/aniyomi-preview.svg?maxAge=3600&label=download)](https://github.com/aniyomiorg/aniyomi-preview/releases) | [![CodeFactor](https://www.codefactor.io/repository/github/aniyomiorg/aniyomi/badge)](https://www.codefactor.io/repository/github/aniyomiorg/aniyomi) | [![stable release](https://img.shields.io/github/release/aniyomiorg/aniyomi.svg?maxAge=3600&label=download)](https://github.com/aniyomiorg/aniyomi/releases) | [![Translation status](https://hosted.weblate.org/widgets/aniyomi/-/svg-badge.svg)](https://hosted.weblate.org/engage/aniyomi/?utm_source=widget) | [![Discord](https://img.shields.io/discord/841701076242530374?label=discord&labelColor=7289da&color=2c2f33&style=flat)](https://discord.gg/F32UjdJZrR) |

# ![app icon](.github/readme-images/app-icon.png)Aniyomi
Aniyomi is a video player and image viewer for Android 8.0 and above.

## Features

Features include:
* Watching videos
* View images
* Local reading/watching of downloaded content
* A configurable reader with multiple viewers, reading directions and other settings.
* A configurable player built on mpv-android with multiple options and settings
* Tracker support: [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), [Kitsu](https://kitsu.io/), [MangaUpdates](https://mangaupdates.com), [Shikimori](https://shikimori.one), and [Bangumi](https://bgm.tv/)
* Categories to organize your library
* Light and dark themes
* Create backups locally to read/watch offline or to your desired cloud service

## Download
Get the app from the [releases page](https://github.com/aniyomiorg/aniyomi/releases).

If you want to try new features before they get to the stable release, you can download the preview version [here](https://github.com/aniyomiorg/aniyomi-preview/releases).

## Issues, Feature Requests and Contributing

Please make sure to read the full guidelines. Your issue may be closed without warning if you do not.

Issues

1. **Before reporting a new issue, take a look at the already opened and closed [issues](https://github.com/aniyomiorg/aniyomi/issues), and [recent release version changes](https://aniyomi.org/changelogs/).**
2. If you are unsure, ask on Discord: [![Discord](https://img.shields.io/discord/841701076242530374?label=discord&labelColor=7289da&color=2c2f33&style=flat)](https://discord.gg/F32UjdJZrR)

Bugs

* Include version (More → About → Version)
  * If not latest, try updating, it may have already been solved
  * Preview version is equal to the number of commits as seen on the main page
* Include steps to reproduce (if not obvious from description)
* Include screenshot (if needed)
* If it could be device-dependent, try reproducing on another device (if possible)
* Don't group unrelated requests into one issue

Feature Requests

* Write a detailed issue, explaining what it should do or how. Avoid writing just "like X app does"
* Include screenshot (if needed)

Source requests should be created at https://github.com/aniyomiorg/aniyomi-extensions, they do not belong in this repository.

Contributing

See [CONTRIBUTING.md](./CONTRIBUTING.md).

Code of Conduct

See [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).

## License

    Copyright 2015 Javier Tomás

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

## Disclaimer

The developer of this application does not have any affiliation with the content providers available.


| Build | Support Server |
|-------|---------|
| ![CI](https://github.com/aniyomiorg/aniyomi-extensions/workflows/CI/badge.svg?event=push) | [![Discord](https://img.shields.io/discord/841701076242530374?label=discord&labelColor=7289da&color=2c2f33&style=flat)](https://discord.gg/F32UjdJZrR) |

# ![app icon](./.github/readme-images/app-icon.png)Aniyomi Extensions
Aniyomi is a free and open source manga reader for Android 6.0 and above.

This repository contains the available extension catalogues for the [Aniyomi](https://github.com/aniyomiorg/aniyomi) fork.

# Usage

Extension sources can be downloaded, installed, and uninstalled via the main Aniyomi app. They are installed and uninstalled like regular apps, in `.apk` format.

## Downloads

If you prefer to directly download the APK files, they are available via https://aniyomi.org/extensions/ or directly in this GitHub repository in the [`repo` branch](https://github.com/aniyomiorg/aniyomi-extensions/tree/repo/apk).

# Requests

Source requests here are meant as up-for-grabs for any developer, thus it's impossible to provide a time estimation for any of them. Furthermore, some sites are impossible to do, usually because of various technical reasons.

# Contributing

Contributions are welcome!

Check out the repo's [issue backlog](https://github.com/aniyomiorg/aniyomi-extensions/issues) for source requests and bug reports.

To get started with development, see [CONTRIBUTING.md](./CONTRIBUTING.md).

It might also be good to read our [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).

## License

    Copyright 2015 Javier Tomás

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

## Disclaimer

The developer of this application does not have any affiliation with the content providers available.


Image Toolbox

Image Toolbox is a powerful picture editor, which can crop,

  apply filters, add some drawing, erase background, edit EXIF or even create PDF file

# ✈ Telegram Links

  Join our chat where you can discuss anything you want and also look into the CI channel where I will post betas and announcements

# ☕ Buy me a coffee

This application is completely free, but if you want to support the project development, you can send a donation to the crypto wallets below

|
 ![Bitcoin](https://img.shields.io/badge/Bitcoin-EAB300?style=for-the-badge&logo=Bitcoin%20SV&logoColor=white)

 ->  ```17Pk1RurnkJxLV9V7mc6Y7dLyHFb9rvQDq```  <-

 |
 ![Tether](https://img.shields.io/badge/USDT-168363?style=for-the-badge&logo=tether&logoColor=white)

 ->  ```TMPAu7a54NvQNEKnNWh3naXu3oYijqP3U7```  <-

 |
| :----: | :----: |

# 📲 Download

Go to the [Releases](https://github.com/t8rin/imageresizer/releases/latest) and the download latest apk
or click one of the badges below.

# ✨ Features

- Batch processing
- Applying filter chains (More than 180 various filters)

  Available filters

  - [x] Saturation
  - [x] Contrast
  - [x] Brightness
  - [x] Exposure
  - [x] RGB
  - [x] Hue
  - [x] White Balance
  - [x] Monochrome
  - [x] Black and White
  - [x] False Color
  - [x] Sharpen
  - [x] Gamma
  - [x] Highlights and Shadows
  - [x] Haze
  - [x] Sepia Tone
  - [x] Color Inversion
  - [x] Solarize
  - [x] Vibrance
  - [x] Luminance Threshold
  - [x] Pixellate
  - [x] Halftone
  - [x] Crosshatch
  - [x] Sobel Edge Detection
  - [x] Sketch Filter
  - [x] Toon Filter
  - [x] SmoothToon Filter
  - [x] CGA Colorspace Filter
  - [x] Posterize
  - [x] Convolution 3x3
  - [x] Emboss Filter
  - [x] Laplacian
  - [x] Kuwahara Filter
  - [x] Vignette
  - [x] Gaussian Blur
  - [x] Box Blur
  - [x] Stack Blur
  - [x] Fast Blur
  - [x] Bilaterial Blur
  - [x] Zoom Blur
  - [x] Median Blur
  - [x] Pixelation
  - [x] Enhanced Pixelation
  - [x] Stroke Pixelation
  - [x] Circle Pixelation
  - [x] Enhanced Circle Pixelation
  - [x] Diamond Pixelation
  - [x] Enhanced Diamond Pixelation
  - [x] Swirl Distortion
  - [x] Bulge Distortion
  - [x] Sphere Refraction
  - [x] Glass Sphere Refraction
  - [x] Dilation
  - [x] Non Maximum Suppression
  - [x] Opacity
  - [x] Weak Pixel Inclusion Filter
  - [x] Color Matrix 4x4
  - [x] Lookup
  - [x] Color Replacement
  - [x] Color Removance
  - [x] Bayer Two Dithering
  - [x] Bayer Three Dithering
  - [x] Bayer Four Dithering
  - [x] Bayer Eight Dithering
  - [x] Floyd Steinberg Dithering
  - [x] Jarvis Judice Ninke Dithering
  - [x] Sierra Dithering
  - [x] Two Row Sierra Dithering
  - [x] Sierra Lite Dithering
  - [x] Atkinson Dithering
  - [x] Stucki Dithering
  - [x] Burkes Dithering
  - [x] False Floyd Steinberg Dithering
  - [x] Left To Right Dithering
  - [x] Random Dithering
  - [x] Simple Threshold Dithering
  - [x] Quantizier
  - [x] Glitch Effect
  - [x] Enhanced Glitch Effect
  - [x] Anaglyph
  - [x] Noise
  - [x] Tent Blur
  - [x] Side Fade
  - [x] Erode
  - [x] Anisotropic Diffusion
  - [x] Horizontal Wind Stagger
  - [x] Fast Bilaterial Blur
  - [x] Poisson Blur
  - [x] Logarithmic Tone Mapping
  - [x] Aces Filmic Tone Mapping
  - [x] Crystallize
  - [x] Fractal Glass
  - [x] Marble
  - [x] Oil
  - [x] Water Effect
  - [x] Hable Filmic Tone Mapping
  - [x] Aces Hill Tone Mapping
  - [x] Hejl Burgess Tone Mapping
  - [x] Perlin Distortion
  - [x] Grayscale
  - [x] Dehaze
  - [x] Color Matrix 3x3
  - [x] Achromatomaly
  - [x] Achromatopsia
  - [x] Browni
  - [x] CodaChrome
  - [x] Cool
  - [x] Deutaromaly
  - [x] Deutaronotopia
  - [x] Night Vision
  - [x] Polaroid
  - [x] Protanopia
  - [x] Protonomaly
  - [x] Tritanopia
  - [x] Tritonomaly
  - [x] Vintage
  - [x] Warm
  - [x] Grain
  - [x] Unsharp
  - [x] Pastel
  - [x] Orange Haze
  - [x] Pink Dream
  - [x] Golden Hour
  - [x] Hot Summer
  - [x] Purple Mist
  - [x] Sunrise
  - [x] Colorful Swirl
  - [x] Soft Spring Light
  - [x] Autumn Tones
  - [x] Lavender Dream
  - [x] Cyberpunk
  - [x] Lemonade Light
  - [x] Spectral Fire
  - [x] Night Magic
  - [x] Fantasy Landscape
  - [x] Color Explosion
  - [x] Electric Gradient
  - [x] Caramel Darkness
  - [x] Futuristic Gradient
  - [x] Green Sun
  - [x] Rainbow World
  - [x] Deep Purple
  - [x] Space Portal
  - [x] Red Swirl
  - [x] Digital Code
  - [x] Bokeh
  - [x] Neon
  - [x] Old Tv
  - [x] Shuffle Blur
  - [x] Mobius
  - [x] Uchimura
  - [x] Aldridge
  - [x] Drago
  - [x] Color Anomaly
  - [x] Quantizier
  - [x] Ring Blur
  - [x] Cross Blur
  - [x] Circle Blur
  - [x] Star Blur
  - [x] Motion Blur
  - [x] Fast Gaussian Blur 2D
  - [x] Fast Gaussian Blur 3D
  - [x] Fast Gaussian Blur 4D
  - [x] Equalize Histogram
  - [x] Equalize Histogram HSV
  - [x] Equalize Histogram Pixelation
  - [x] Equalize Histogram Adaptive
  - [x] Equalize Histogram Adaptive LUV
  - [x] Equalize Histogram Adaptive LAB
  - [x] Equalize Histogram Adaptive HSV
  - [x] Equalize Histogram Adaptive HSL
  - [x] Clahe
  - [x] Clahe LUV
  - [x] Clahe LAB
  - [x] Clahe HSL
  - [x] Clahe HSV
  - [x] Crop To Content

- Custom Filters Creation by Template filters
  - You can create filter from any filter chain
  - Share created filters by QR code
  - Scan filters from the app to get them on your device
- AES-256 GCM No Padding files encryption and decryption
- Extract Text From Images
  - 120+ languages
  - 3 Type of data: Fast, Standard, Best
  - Segmentation Mode Selection
  - Multiple languages at the same time
- EXIF metadata editing/deleting
- Loading images from internet
- Image Stitching
- Image Stacking
- Background Removal
  - By drawing
  - Automatically
- Watermarking
  - By Text
  - By Image
- Drawing on Image/Background
  - Pen
  - Neon
  - Highlighter
  - Privacy Blur
  - Pixelation Paint
  - Pointing Arrow
  - Line
  - Double Pointing Arrow
  - Line Pointing Arrow
  - Double Line Pointing Arrow
  - Outlined Rect
  - Outlined Oval
  - Outlined Triangle
  - Outlined Polygon
  - Outlined Star
  - Rect
  - Oval
  - Triangle
  - Polygon
  - Star
  - Lasso
  - Text
  - Image Brush
- Image Resizing
  - Width changing
  - Height changing
  - Adaptive resize
  - Resize retaining aspect ratio
  - Resize by given limits
  - Center Crop with
    - Background color changing
    - Background blur drawing
  - Different Scaling Algorithms
    - Bilinear
    - Nearest Neighbour
    - Cubic
    - Mitchell-Netravalli
    - Catmull-Rom
    - Hermite
    - B-Spline
    - Hann
    - Bicubic
    - Hamming
    - Hanning
    - Blackman
    - Welch
    - Quadric
    - Gaussian
    - Sphinx
    - Bartlett
    - Robidoux
    - Robidoux Sharp
    - Spline 16
    - Spline 36
    - Spline 64
    - Kaiser
    - Bartlett-Hann
    - Box
    - Bohman
    - Lanczos 2
    - Lanczos 3
    - Lanczos 4
    - Lanczos 2 Jinc
    - Lanczos 3 Jinc
    - Lanczos 4 Jinc
    - Ewa Hanning
    - Ewa Robidoux
    - Ewa Blackman
    - Ewa Quadric
    - Ewa Robidoux Sharp
    - Ewa Lanczos 3 Jinc
    - Ginseng
    - Ginseng EWA
    - Lanczos Sharp EWA
    - Lanczos 4 Sharpest EWA
    - Lanczos Soft EWA
    - Haasn Soft
    - Lagrange 2
    - Lagrange 3
    - Lanczos 6
    - Lanczos 6 Jinc
  - Different Scale Color Spaces
    - Linear
    - sRGB
    - LAB
    - LUV
    - Sigmoidal
    - XYZ
    - F32 Gamma 2.2
    - F32 Gamma 2.8
    - F32 Rec.709
    - F32 sRGB
    - LCH
- GIF conversion
  - GIF to images
  - Images to GIF
- APNG conversion
  - APNG to images
  - Images to APNG
- JXL transcoding
  - JXL to JPEG
  - JPEG to JXL
- Animated JXL conversion
  - Images to JXL
  - JXL to Images
  - APNG to JXL
  - GIF to JXL
- PDF tools
  - PDF to images
  - Images to PDF
  - PDF previewing
- Document Scanning
- QR Codes
  - Scanning
  - Creating
  - Sharing as images
- Image Shrinking
  - Quality compressing
  - Preset shrinking
  - Reducing size by given weight (in KB)
- Cropping
  - Regular crop
  - Crop by aspect ratio
  - Crop with shape mask
    - Rounded Corners
    - Cut Corners
    - Oval
    - Squircle
    - Octagon
    - Rounded Pentagon
    - Clover
    - Material Star
    - Kotlin Logo
    - Small Material Star
    - Heart
    - Enhanced Heart
    - Star
    - Image Mask
- Tracing raster images to SVG
- Format Conversion
  - HEIF
  - HEIC
  - AVIF
  - WEBP
  - JPEG
  - JPG
  - PNG Lossless
  - PNG Lossy
  - MozJpeg
  - Jpegli
  - JXL
  - SVG and GIF to WEBP, PNG, JPEG, JPG, HEIF, HEIC, AVIF, JXL
  - Telegram sticker PNG format
- Files to Zip
- Comparing images
  - Slide
  - Toggle Tap
  - Transparency
  - Side By Side
- Color Utils
  - Palette generation
    - Material You Scheme
    - Simple Colors
  - Picking color from image
  - Gradient creation
  - Overlaying image with gradient
- Image source selection
- Additional Features
  - Rotating
  - Flipping
  - Previewing SVG, GIF and almost all types of images
  - Saving to any specific folder
  - Long press on save to choose one time output folder
  - Randomizing output filename
  - Embedded media picker

**And More!**

#

# 🌟 UI tweaks

- Selecting Emoji for top app bar
- Ability to use Pixel like switch instead of Material You
- Secure Mode for app
- Maximum brightness for selected screens
- In app language changing
- Enabling or Disabling confetti
- Custom app color scheme
  - Different palette styles
  - Predefined schemes
  - Color inversion
  - Contrast adjusting
- Controlling borders thickness
- Enabling and disabling each existing shadow
- Haptics controls
- Light/Dark mode
- AMOLED mode
- Monet implementation (Dynamic colors) even for Android versions less than 12 by [Dynamic Theme](https://github.com/T8RIN/DynamicTheme)
- Image based color scheme
- Icons Background shape selection
  - Rounded Corners
  - Cut Corners
  - Oval
  - Squircle
  - Octagon
  - Rounded Pentagon
  - Clover
  - Material Star
  - Small Material Star
  - Heart
  - Enhanced Heart
- Custom fonts
  - Montserrat
  - Comfortaa
  - Caveat
  - Handjet
  - Jura
  - Podkova
  - Tektur
  - YsabeauSC
  - DejaVu
  - BadScript
  - RuslanDisplay
  - Catterdale
  - FRM32
  - Tokeely Brookings
  - Nunito
  - Nothing
  - WOPR Tweaked
  - Alegreya Sans
  - Minecraft Gnu
  - Granite Fixed
  - Nokia Pixel
  - Ztivalia
  - Axotrel
  - Lcd Octagon
  - Lcd Moving
  - Unisource
- In app font scale changing
- Changing between options list and grouped view
- Confetti Type selection
  - Default
  - Festive
  - Explode
  - Rain
  - Side
  - Corners
  - ImageToolbox
- Switch Type selection:
  - Material You
  - Compose
  - Pixel
  - Fluent
  - Cupertino

(Yes, the app supports dynamic coloring based on wallpapers for every android version)

# 📚 Tech stack & Open-source libraries

- Minimum SDK level 21

- [Kotlin](https://kotlinlang.org/) based

- [Image Toolbox Libs](https://github.com/T8RIN/ImageToolboxLibs) - set of essential libraries for Image Toolbox.

- [Dynamic Theme](https://github.com/T8RIN/DynamicTheme) - library, which allows you to easily
  implement custom color theming.

- [Modal Sheet](https://github.com/T8RIN/ModalSheet) - modal bottom sheet that follows M3
  guidelines.

- [Coroutines](https://github.com/Kotlin/kotlinx.coroutines) for asynchronous work.

- [Flow](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/)
  to emit values from data layer reactively.

- [Accompanist](https://github.com/google/accompanist) to expand jetpack compose opportunities.

- [Hilt](https://dagger.dev/hilt/) for dependency injection.

- [Coil](https://github.com/coil-kt/coil) for loading images.

- [Compose Navigation Reimagined](https://github.com/olshevski/compose-navigation-reimagined) - High
  intelligence navigation library for Jetpack Compose.

- [Konfetti](https://github.com/DanielMartinus/Konfetti) to establish beautiful particle system.

- Jetpack
  - [Compose](https://developer.android.com/jetpack/compose) - Modern Declarative UI style
    framework based on composable functions.

  - [Material You Kit](https://developer.android.com/jetpack/androidx/releases/compose-material3) -
    Material 3 powerful UI components.

  - [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel) - Manages
    UI-related data holder and lifecycle awareness. Allows data to survive configuration changes such
    as screen rotations.

  - [Data Store](https://developer.android.com/jetpack/androidx/releases/datastore) - Store data
    asynchronously, consistently, and transactionally.

  - [Lifecycle](https://developer.android.com/jetpack/androidx/releases/lifecycle) - Observe
    Android lifecycles and handle UI states upon the lifecycle changes.

  - [Exif Interface](https://developer.android.com/jetpack/androidx/releases/exifinterface) - Read
    and write image file EXIF tags.

- [GPU Image](https://github.com/cats-oss/android-gpuimage) for creating and applying filters to the
  images.

- [SmartToolFactory](https://github.com/SmartToolFactory) provides a bunch of helpful libraries.

- [AVIF Coder](https://github.com/awxkee/avif-coder) and [JXL Coder](https://github.com/awxkee/jxl-coder) libraries which provide avif, heic, heif and jxl support.

- [Aire](https://github.com/awxkee/aire) for creating and applying filters to the images on CPU using native cpp code.

#

# 🌐 Translation

You can help translate ImageResizer into your language
on [Hosted Weblate](https://hosted.weblate.org/engage/image-resizer/)

[![Состояние перевода](https://hosted.weblate.org/widgets/image-resizer/-/horizontal-auto.svg)](https://hosted.weblate.org/engage/image-resizer/)

[![Translation status](https://hosted.weblate.org/widgets/image-resizer/-/image-resizer/287x66-black.png)](https://hosted.weblate.org/engage/image-resizer/)

# ❤ Find this repository useful?

Support it by joining __[stargazers](https://github.com/t8rin/ImageResizer/stargazers)__ for this
repository. :star:

And __[follow](https://github.com/t8rin)__ me for my next creations! 🤩

# ⭐ Star History

  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=T8RIN/ImageToolbox&type=Date&theme=dark" />
    <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=T8RIN/ImageToolbox&type=Date" />

  </picture>

# 📢 Contributors

# ⚖ License

```xml
Designed and developed by 2023 T8RIN

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```

Photos by Pawel Czerwinski on Unsplash


# 8Vim

[![Project Dashboard](https://sourcespy.com/shield.svg)](https://sourcespy.com/github/flide8vim/)

The application was started essentially as a clone of 8pen, which for some reason they have stopped distributing. (I can no longer install it, even though I paid for it!)

To exactly understand this keyboard, please watch the [video](https://www.youtube.com/watch?v=q3OuCR0EpGo)

| Stable [![Stable](https://img.shields.io/github/v/release/8VIM/8VIM)](https://github.com/8VIM/8VIM/releases/latest) ![F-Droid](https://img.shields.io/f-droid/v/inc.flide.vi8) | Beta [![Beta](https://img.shields.io/github/v/release/8VIM/8VIM?include_prereleases)](https://github.com/8VIM/8VIM/releases) ![F-Droid](https://img.shields.io/badge/dynamic/yaml?url=https%3A%2F%2Fraw.githubusercontent.com%2F8VIM%2Ffdroid%2Fmain%2Fbadges.yaml&query=%24%5B'8vim_rc'%5D&label=Private%20F-droid%20RC&color=orange) | Debug ![F-Droid](https://img.shields.io/badge/dynamic/yaml?url=https%3A%2F%2Fraw.githubusercontent.com%2F8VIM%2Ffdroid%2Fmain%2Fbadges.yaml&query=%24%5B'8vim_debug'%5D&label=Private%20F-droid%20Debug&color=orange)
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:----:|
| [](https://f-droid.org/packages/inc.flide.vi8/) [](https://play.google.com/store/apps/details?id=inc.flide.vi8) | [](https://github.com/8vim/repo) [](https://play.google.com/store/apps/details?id=inc.flide.vi8) | [](https://github.com/8vim/repo) |

**Manual**: Download and install the APK from the release page.

## Become a Beta Tester

To become a beta tester please click [here](https://play.google.com/apps/testing/inc.flide.vi8)

## Usability Guide

So, what capablities does 8Vim have?

##### Basic Stuff

- right sector acts as a Backspace key.
- bottom sector acts as an Enter key.
- top sector acts as a combo of Shift and Caps Lock key (i.e., press once to activate Shift. Press again for Caps Lock. Press once more and everything is back to normal.)
- left sector acts as a button that takes you to the number pad.

##### Cursor Movements

If you move your finger from within the circle to any sector, the cursor will move one character in the direction of the sector. For example, if you swipe from the circle to the right sector and then raise your finger, the cursor will move to the right once. If you don't lift up your finger but instead keep pressing on the sector, the cursor will move as long as the sector is pressed.

##### Selection

There is a selection mode built into the keyboard. If you move your finger from the right sector to the circle and hold, the cursor will start moving left while selecting everything in its path, until you lift your finger. Once you release, the selection mode keyboard will open and show different actions that can then be applied to your selection. (i.e. right-sector->circle->hold->lift-finger)

##### Paste Functionality

Moving your finger from the left sector to the circle center will paste your clipboard content. (i.e. left-sector->circle->lift-finger)

###### Handwriting Reinvented

The 8vim draws inspiration from handwriting. By mimicking the way our hand moves when constrained to a square canvas, we are able to create a natural and fun writing experience, akin to doodling on a piece of paper.

###### Designed for Speed

The layout is optimised for fast writing, by allowing for the most common letter sequences to be produced with swift, fluid gestures. Once familiar with the layout, you can reach speeds of over 40 words per minute!

###### Typos, goodbye

The simplicity of the gestures used to enter words, allow for true blind typing and virtually eliminate typos. Regardless of whether you have small or big fingers. Word suggestions become an optimisation, not a dependency.

## Extended Idea

The thing that bugs me is that most editing done on mobile phones is within those quirky message boxes and there is JUST NO WAY to edit stuff there.
Also, it is beyond frustrating to try and create a document on a mobile phone with more characters than a tweet. I feel like 'text editors' for mobile phones are a joke. They have tons of toolbars and stuff which you rarely open up to "edit" something, but the problem remains: You just don't want to type on a mobile phone. It's tedious. It's time consuming. It's frustrating.

Then, there came along 8pen, the keyboard on which you actually can type without looking, and I thought to myself: Now, Now, NOW, FINALLY!! Editing and creating a document/text can be practical enough on a mobile device! In the frenzy, I turned to the plethora of text editors available on various app stores. Yeah, they get the job done, but you have to keep both of your hands engaged and tapping on the various toolbars and buttons… I was missing [Vim](http://www.vim.org/).

I am a huge fan of Vim - the editor. It is so cool to be able to edit without leaving the keyboard. The idea that, when you are editing, you add less and modify more is so comfortable and incredibly efficient. It works on desktop, because you have a keyboard attached that you can use with - hopefully - all of your fingers. On a touch screen however, it's a very stupid idea to try to use Vim.

I hear you say: "Come on! Don't dismiss the idea without trying it first!". Believe me, I did try. Try it yourself, it's called [vimtouch](https://github.com/momodalo/vimtouch). Vimtouch, the port of Vim for android, although being a big deal technologically, it's utterly unusable in a practical setting. Why? Because at best you've got two thumbs to do the job of ten fingers. It's highly inefficient.

No matter what editor you use, it has one basic issue: It only works when you open it. Confused? Let's try a practical, common, frequently occuring scenario. Your boss has sent you an email and you are ANGRY! You want to reply and pour your heart out. You press the reply button and suddenly realize: "This is the perfect job for an editor!" So you search through the millions of apps you've installed, looking for that editor and only then start editing. It takes you an hour to compose 5 lines. Afterwards you copy-paste the stuff into your email reply only then you are done. What a hassle!!

And then it hit me… Why the hell do you need text editors? Why can't your keyboard act as the editor? It's always there when you actually want to input/edit something and it's software only, so there's no hardware to worry about. You can hack the shit out of it. I mean, WHY NOT??

And this inspiration (rant) became the idea for VIII - an Editor-in-Keyboard.

TO BE CONTINUED...


Orange Design System Android

  ODS Android provides Orange Android components to developers and a demo application.

  Visit ODS Android

  Report bug
  ·
  Request feature

## Table of contents

- [Status](#status)
- [Content](#content)
- [Bugs and feature requests](#bugs-and-feature-requests)
- [Contributing](#contributing)
- [Copyright and license](#copyright-and-license)

## Status

[![Build](https://img.shields.io/github/actions/workflow/status/Orange-OpenSource/ods-android/android-build.yml?logo=github)](https://github.com/Orange-OpenSource/ods-android/actions/workflows/android-build.yml?query=branch%3Amain)
[![Maven Central](https://img.shields.io/maven-central/v/com.orange.ods.android/ods-lib?logo=apachemaven)](https://search.maven.org/search?q=com.orange.ods.android)

## Content

This repository contains the Orange Design System Android library that provides Orange Android components, but also a demo application showcasing these different components.

For more specific information:

* [Library README](https://github.com/Orange-OpenSource/ods-android/blob/develop/lib/README.md)
* [Demo application README](https://github.com/Orange-OpenSource/ods-android/blob/develop/app/README.md)

## Bugs and feature requests

Have a bug or a feature request? Please first search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/Orange-OpenSource/ods-android/issues/new/choose).

## Contributing

Please read through our [contributing guidelines](https://github.com/Orange-OpenSource/ods-android/blob/develop/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.

## Copyright and license

Code released under the [MIT License](https://github.com/Orange-OpenSource/ods-android/blob/develop/LICENSE).


# RootEncoder for Android

[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-rtmp%20rtsp%20stream%20client%20java-green.svg?style=true)](https://android-arsenal.com/details/1/5333)
[![Release](https://jitpack.io/v/pedroSG94/RootEncoder.svg)](https://jitpack.io/#pedroSG94/RootEncoder)
[![Documentation](https://img.shields.io/badge/library-documentation-orange)](https://pedroSG94.github.io/RootEncoder)

Sponsored with 💖 &nbsp by

Enterprise Grade APIs for Feeds & Chat. Try the Android Chat tutorial 💬

RootEncoder (rtmp-rtsp-stream-client-java) is a stream encoder to push video/audio to media servers using protocols RTMP, RTSP and SRT with all code written in Java/Kotlin

Note: The library was renamed from rtmp-rtsp-stream-client-java to RootEncoder after add SRT protocol because the name has no sense anymore

## iOS version (under develop):

https://github.com/pedroSG94/RootEncoder-iOS

## Wiki

https://github.com/pedroSG94/RootEncoder/wiki

## Permissions:

```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
```

## Compile

To use this library in your project with gradle add this to your build.gradle:

Last version

```gradle
allprojects {
  repositories {
    maven { url 'https://jitpack.io' }
  }
}
dependencies {
  implementation 'com.github.pedroSG94.RootEncoder:library:2.4.5'
}

```

Old versions (2.2.6 or less)

```gradle
allprojects {
  repositories {
    maven { url 'https://jitpack.io' }
  }
}
dependencies {
  implementation 'com.github.pedroSG94.RootEncoder:rtplibrary:2.2.6'
}
```

## Features:

- [x] Android min API 16.

### Encoder:

- [x] Support [camera1](https://developer.android.com/reference/android/hardware/Camera.html) and [camera2](https://developer.android.com/reference/android/hardware/camera2/package-summary.html) API
- [x] Encoder type buffer to buffer.
- [x] Encoder type surface to buffer.
- [x] Audio noise suppressor.
- [x] Audio echo cancellation.
- [x] Disable/Enable video and audio while streaming.
- [x] Switch camera while streaming.
- [x] Change video bitrate while streaming (API 19+).
- [x] AV1, H264, H265, G711, AAC and OPUS hardware/software encoding.
- [x] Force video and audio Codec to use hardware/software encoding (Not recommended).
- [X] Record MP4 file while streaming (API 18+).
- [X] Set Image, Gif or Text to stream on real time.
- [X] OpenGL real time filters. [More info](https://github.com/pedroSG94/RootEncoder/wiki/Real-time-filters)
- [x] Stream from video and audio files like mp4, webm, mp3, etc (Limited by device decoders). [More info](https://github.com/pedroSG94/RootEncoder/wiki/Stream-from-file)
- [x] Stream device screen (API 21+).

### RTMP:

- [X] Get upload bandwidth used.
- [x] RTSP auth (adobe and llnw).
- [x] AV1, H265 ([Using RTMP enhanced](https://github.com/veovera/enhanced-rtmp/tree/main)), H264, AAC and G711 support.
- [x] RTMPS (under TLS)
- [x] RTMPT and RTMPTS (tunneled and tunneled under TLS)
- [x] AMF0
- [ ] AMF3

### RTSP:

- [X] Get upload bandwidth used.
- [x] RTMP auth (basic and digest).
- [x] AV1, H264, H265, AAC, G711 and OPUS support.
- [x] TCP/UDP.
- [x] RTSPS.

### SRT (beta):

- [X] Get upload bandwidth used.
- [X] H264, H265, AAC and OPUS support.
- [X] Resend lost packets
- [X] Encrypt (AES128, AES192 and AES256)
- [ ] SRT auth.

https://haivision.github.io/srt-rfc/draft-sharabayko-srt.html

### UDP (beta):

- [X] Get upload bandwidth used.
- [X] H264, H265, AAC and OPUS support.
- [X] Unicast, Multicast and Broadcast support.
- [X] MPEG2-TS support.

## Other related projects:

https://github.com/pedroSG94/RTSP-Server

### 3rd party projects:

Projects related with the library developed by other users.
Contact with user owner if you have any problem or question.

https://github.com/FunnyDevs/rtmp-rtsp-stream-client-java-recordcontrollers

## Real time filters:

### NOTE:
In library version 2.0.9, the filters was refactored. Check the wiki link to migrate your implementation.

https://github.com/pedroSG94/RootEncoder/wiki/Real-time-filters

## Looking for sponsors

This library need sponsors to get new devices or pay platforms to test and debug errors. Any donation or sponsor is welcome!
If you are interested. You can contact me by email or donate directly on [Github](https://github.com/sponsors/pedroSG94) or [Paypal](https://www.paypal.com/paypalme/pedroSG94)
Thank you!

## Use examples:

### Rotation example

This is the recommend way to use the library.
This example support screen rotation, stream orientation (vertical, horizontal) filters and change video/audio sources on fly:
https://github.com/pedroSG94/RootEncoder/tree/master/app/src/main/java/com/pedro/streamer/rotation

### Screen example

Example to stream using Screen as video source using a service to stream in background:
https://github.com/pedroSG94/RootEncoder/tree/master/app/src/main/java/com/pedro/streamer/screen

### From file example

Code example to stream using a video file as video/audio source:
https://github.com/pedroSG94/RootEncoder/tree/master/app/src/main/java/com/pedro/streamer/file

### Old Api example

Code example for low API devices (Android API 16+):
https://github.com/pedroSG94/RootEncoder/tree/master/app/src/main/java/com/pedro/streamer/oldapi


# Code Runtime Analysis for Non-Trivial Java  Code

## Build

- ./gradlew clean buildPlugin [-PbuildProfile=XXX]

## Load to Idea

- load the project into IntelliJ IDEA community with 'Open' and select the project directory

- setup jdk 17 for the project 'Project Structure'

- setup ProjectJdk or jdk 21 for gradle in 'Settings -> Gradle'

## Load the dotnet project to Rider

- run ./gradlew :rider:prepare [-PbuildProfile=XXX]

- open in rider the solution rider/Digma.Rider.Plugin/Digma.Rider.Plugin.sln

### Build Profiles

build profiles build and package a plugin for specific intellij platform version.

see the list of available profiles in  [BuildProfiles](common-build-logic/src/main/kotlin/common/BuildProfile.kt)

for example './gradlew clean buildPlugin -PbuildProfile=p241'


[![Translation status](https://weblate.spiritcroc.de/widgets/schildichat/-/schildichat-android-next/svg-badge.svg)](https://weblate.spiritcroc.de/projects/schildichat/schildichat-android-next/)
[![SchildiChat-Android Matrix room #android:schildi.chat](https://img.shields.io/matrix/android:schildi.chat.svg?label=%23android:schildi.chat&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#android:schildi.chat)

# schildichat-android-next

Matrix client based on [Element Android X](https://github.com/element-hq/element-x-android)
in the tradition of the original [SchildiChat for Android](https://github.com/SchildiChat/SchildiChat-android)
which was based on the now deprecated Element Android codebase.

Similarly to Element X, this SchildiChat Android rewrite should still be considered beta,
as it lacks some functionality which one might expect from a fully-featured chat app, compared to the old SchildiChat implementation.

An overview over changes compared to Element X can be found [here](FEATURES.md).

## Translations

If you want to translate SchildiChat, visit [our weblate](https://weblate.spiritcroc.de/projects/schildichat/schildichat-android-next/).
Translations that concern upstream Element code are best contributed directly to Element, who currently manage translations on [localazy](https://localazy.com/p/element).

## Screenshots

## Building

In general, building works the same as for Element X or any common Android project.
Just import into Android Studio and make sure you have all the required SDKs ready.

Currently, SchildiChat uses a [forked matrix-rust-sdk](https://github.com/SchildiChat/matrix-rust-sdk) and
[wysiwyg](https://github.com/SchildiChat/matrix-rich-text-editor)
published on [GitHub packages](https://github.com/SchildiChat/matrix-rust-components-kotlin/packages/),
which unfortunately [still does not provide unauthenticated access](https://github.com/orgs/community/discussions/26634).
Accordingly, before building, create a GitHub token with the `read:packages` permission, and configure it in your `local.properties`:
```
gpr.user=...
gpr.token=...
```

Alternatively, you may export the `GPR_USER` and `GPR_TOKEN` environment variables before building.

If you do not have a GitHub account, you can also download the appropriate `.aar` file from
[the SDK's releases](https://github.com/SchildiChat/matrix-rust-components-kotlin/releases) and put it into `./libraries/rustsdk/matrix-rust-sdk.aar`.

## WYSIWYG development

To develop changes in our [matrix-rich-text-editor fork](https://github.com/SchildiChat/matrix-rich-text-editor):

### Build WYSIWYG locally

- Clone the repo
- Bump the version number to some future version that [doesn't exist yet](https://github.com/SchildiChat/matrix-rich-text-editor/tags)
  using `./update_version 1.2.3` where `1.2.3` is your chosen version number. By not re-using any existing version number you can make sure you're using your
  local build if the build of SchildiChat succeeds.
- Publish the wysiwyg by running `make android` in its directory. (Make sure you have `JAVA_HOME`, `ANDROID_NDK_HOME` and all the build dependencies setup)

### Include local-built WYSIWYG in SchildiChat

- Modify `settings.gradle.kts` to insert `mavenLocal()` into the `dependencyResolutionManagement {}` block.
  ([Cherry-pick](https://github.com/SchildiChat/schildichat-android-next/commit/de2a30082012a079d8978caf7d5af7e5764310a4))
- Change the version number of `wysiwyg` in `gradle/libs.versions.toml` to match the one you published locally.

## Contributing

Generally, contributions are welcome!
Note that in order to ease upstream merges, we want to leave the smallest footprint possible on Element's sources
when implementing original features or patching Element's behaviour.

In particular (may change a bit while the project is still in alpha):
- Put code into additional files (`chat.schildi.*` package names) if reasonable
    - Prefer `schildi/lib` module if it doesn't depend on element modules (except maybe strings)
    - Prefer `schildi/components` module if it depend on some of Element's Design/UI components but nothing else
    - Otherwise, prefer element module where it makes most sense (or create a new module for bigger features, maybe)
- Put Schildi-specific drawables and other xml resources that override upstream resources into the `sc` build flavor
    - This way, we can use the same name and avoid merge conflicts
    - Compare e.g. `libraries/designsystem`: we define the flavor `sc` and thus put drawables in the `sc` instead of `main` directory.
      For new modules that do not feature a `sc` flavor yet, copy over the required `build.gradle.kts` content from a module that does.
- Put Schildi-specific strings into `schildi/lib`
    - Never touch upstream strings! If we want to change Element's strings, we'll either want a script that patches them,
      so we can restore upstream strings before upstream merges and re-do our changes automatically after the merge,
      or alternative put it into an `sc` build flavor, if we do not need to touch multiple translations.
- Don't worry too much about code style if violating it can ease upstream merges
    - When putting upstream code into a new block (e.g., putting it in an `if`-statement), don't indent the upstream code, but rather add comments like
        `// Wrong indention for merge-ability - start` and `// Wrong indention for merge-ability - end`


# Yuki Hook API

[![GitHub license](https://img.shields.io/github/license/HighCapable/YukiHookAPI?color=blue)](https://github.com/HighCapable/YukiHookAPI/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/v/release/HighCapable/YukiHookAPI?display_name=release&logo=github&color=green)](https://github.com/HighCapable/YukiHookAPI/releases)
[![Telegram](https://img.shields.io/badge/discussion-Telegram-blue.svg?logo=telegram)](https://t.me/YukiHookAPI)
[![Telegram](https://img.shields.io/badge/discussion%20dev-Telegram-blue.svg?logo=telegram)](https://t.me/HighCapable_Dev)
[![QQ](https://img.shields.io/badge/discussion%20dev-QQ-blue.svg?logo=tencent-qq&logoColor=red)](https://qm.qq.com/cgi-bin/qm/qr?k=Pnsc5RY6N2mBKFjOLPiYldbAbprAU3V7&jump_from=webapi&authKey=X5EsOVzLXt1dRunge8ryTxDRrh9/IiW1Pua75eDLh9RE3KXE+bwXIYF5cWri/9lf)

⛱ An efficient Hook API and Xposed Module solution built in Kotlin.

English | [简体中文](README-zh-CN.md)

|  | [HighCapable](https://github.com/HighCapable) |
|-------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|

This project belongs to the above-mentioned organization, **click the link above to follow this organization** and discover more good projects.

## What's this

This is an efficient Hook API rebuilt based on the Xposed API using Kotlin,
and creates rich function extensions for the development of Xposed Modules.

The name is taken from ["ももくり" heroine Yuki Kurihara](https://www.bilibili.com/bangumi/play/ss5016).

Formerly the Innocent Xposed API used in [Development Learning Project](https://github.com/fankes/TMore), now renamed and open sourced.

## Get Started

[Click here](https://highcapable.github.io/YukiHookAPI/en/) go to the documentation page for more detailed tutorials and content.

For supportive related information, you can check it directly [click here](https://highcapable.github.io/YukiHookAPI/en/guide/supportive).

## Cooperations

The following are projects that have collaborated and are using `YukiHookAPI`.

| Repository                                                                      | Developer                                       |
|---------------------------------------------------------------------------------|-------------------------------------------------|
| [TSBattery](https://github.com/fankes/TSBattery)                                | [fankesyooni](https://github.com/fankes)        |
| [MIUI 原生通知图标](https://github.com/fankes/MIUINativeNotifyIcon)                   | [fankesyooni](https://github.com/fankes)        |
| [ColorOS 通知图标增强](https://github.com/fankes/ColorOSNotifyIcon)                   | [fankesyooni](https://github.com/fankes)        |
| [自由屏幕旋转](https://github.com/Xposed-Modules-Repo/com.fankes.forcerotate)         | [fankesyooni](https://github.com/fankes)        |
| [拒绝强制亮度](https://github.com/Xposed-Modules-Repo/com.fankes.refusebrightness)    | [fankesyooni](https://github.com/fankes)        |
| [AppErrorsTracking](https://github.com/KitsunePie/AppErrorsTracking)            | [fankesyooni](https://github.com/fankes)        |
| [Enable WebView Debugging](https://github.com/WankkoRee/EnableWebViewDebugging) | [WankkoRee](https://github.com/WankkoRee)       |
| [Fuck MIUI Gesture](https://github.com/HCGStudio/FuckMIUIGesture)               | [mahoshojoHCG](https://github.com/mahoshojoHCG) |
| [MIUI遮罩进化](https://github.com/GSWXXN/RestoreSplashScreen)                       | [GSWXXN](https://github.com/GSWXXN)             |
| [Color OS Installer Plus](https://github.com/NextAlone/ColorOSInstallerPlus)    | [NextAlone](https://github.com/NextAlone)       |
| [Auto NFC](https://github.com/GSWXXN/AutoNFC)                                   | [GSWXXN](https://github.com/GSWXXN)             |
| [不要竖屏](https://github.com/WankkoRee/Portrait2Landscape)                         | [WankkoRee](https://github.com/WankkoRee)       |
| [QDReadHook](https://github.com/xihan123/QDReadHook)                            | [xihan123](https://github.com/xihan123)         |
| [HXReadHook](https://github.com/xihan123/HXReadHook)                            | [xihan123](https://github.com/xihan123)         |
| [WxRecordRead](https://github.com/pwh-pwh/wxrecordread)                         | [Coderpwh](https://github.com/pwh-pwh)          |
| [FuckShake](https://github.com/pwh-pwh/fuck_shake)                              | [Coderpwh](https://github.com/pwh-pwh)          |
| [MIUI更新进化](https://miup.utssg.xyz)                                              | [ZQDesigned](https://github.com/ZQDesigned)     |
| [MIUI录屏进化](https://www.coolapk.com/apk/UTSSG.ZQDesigned.miuirecordercracker)    | [ZQDesigned](https://github.com/ZQDesigned)     |
| [Fuck AD](https://github.com/hujiayucc/Fuck-AD)                                 | [hujiayucc](https://github.com/hujiayucc)       |
| [Zuiyou ADFree](https://github.com/kazutoiris/zuiyou-adfree)                    | [kazutoiris](https://github.com/kazutoiris)     |

Are you also using `YukiHookAPI`? Come and **PR** to add your repository to the list above (private repositories do not need to indicate web
links).

## Promotion

Hey, please stay! 👋

Here are related projects such as Android development tools, UI design, Gradle plugins, Xposed Modules and practical software.

If the project below can help you, please give me a star!

All projects are free, open source, and follow the corresponding open source license agreement.

→ To see more about my projects, please click here ←

## Star History

![Star History Chart](https://api.star-history.com/svg?repos=HighCapable/YukiHookAPI&type=Date)

## Third-Party Open Source Usage Statement

- [Kotlin Symbol Processing API](https://github.com/google/ksp)
- [FreeReflection](https://github.com/tiann/FreeReflection)

## License

- [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0)

```
Apache License Version 2.0

Copyright (C) 2019-2024 HighCapable

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```

Copyright © 2019-2024 HighCapable