A Discord client based on ShiggyCord, with small changes!
Find a file
semantic-release-bot 1a3041b2d1 chore: Release 1.0.0 [skip ci]
# 1.0.0 (2025-07-26)

### Bug Fixes

* actually fix improper FAB insets ([e987723](e9877234be))
* Adapt to change of `window.modules` being a Map ([78c303b](78c303b5f5)), closes [#120](https://github.com/C0C0B01/Kettu/issues/120)
* api quickfix ([652449b](652449bd50))
* **api/patcher:** allow cancelling lazy patching ([e70f598](e70f598306))
* **api/patcher:** assert delayCallback ([#196](https://github.com/C0C0B01/Kettu/issues/196)) ([5bc8868](5bc886868d))
* backport iOS invalid element type crash fix ([afacfa0](afacfa0648))
* **badges:** check if user is null ([a0c2ca7](a0c2ca7837))
* change `Bunny` to `Revenge` in `ErrorBoundary` content ([89f1b18](89f1b18ebb))
* cloudsync hotfix (hopefully) ([89035fe](89035fe9a1))
* **commands:** fill new required properties ([32afc78](32afc78e0a)), closes [#81](https://github.com/C0C0B01/Kettu/issues/81)
* **constants:** update forward proxy link ([58781a0](58781a08ea))
* **core/patches/wrapSafeAreaProvider:** remove broken patch ([dfb0367](dfb036740a))
* crash when opening noti settings ([1c15174](1c151745e2))
* downgrade dependencies to fix build issue ([b803053](b803053e28))
* **entry:** await core init & unawait plugins init ([3ed0f77](3ed0f777a0))
* **entry:** load @metro/internals/modules before main init ([87913ce](87913cecfc))
* failsafe panel UI settings patching ([46a2c6e](46a2c6eaa1))
* Fix old settings menu and make some improvements to it ([#90](https://github.com/C0C0B01/Kettu/issues/90)) ([e240509](e2405093ee))
* fix themes page crashing? ([f542e8c](f542e8ce47))
* fonts error displaying as theme error ([6243316](6243316c35)), closes [#42](https://github.com/C0C0B01/Kettu/issues/42)
* **i18n:** outdated locale was used instead ([7c8ee06](7c8ee06c7e))
* **issue-template:** declare no plugin request [skip ci] ([87cfc74](87cfc742f6))
* **lib/api/native/modules:** add more native module fallbacks ([825a404](825a404cae))
* **lib/api/native/modules:** add more native module fallbacks ([#102](https://github.com/C0C0B01/Kettu/issues/102)) ([6f95203](6f95203dfa)), closes [#99](https://github.com/C0C0B01/Kettu/issues/99)
* **lib/api/native/modules:** add new MMKVManager fallback ([a68f137](a68f137543))
* **lib/ui/settings:** fix icon not showing up ([2fc7715](2fc7715fa4))
* load core plugins ([ed52f33](ed52f332da))
* load plugins traditionally ([2dda939](2dda93928c))
* **metro-cache:** cache building ([072f189](072f189a72))
* **metro/common:** polyfill `url` ([59ffa77](59ffa77a3a))
* **metro/modules:** patch registry instead ([4b94b7f](4b94b7fd9c))
* **metro/patchNativeComponentRegistry:** return component name if fail ([26b7615](26b7615f84))
* **metro/polyfill:** correctly polyfill ([9bd47d2](9bd47d28a4))
* **metro/polyfill:** unproxy polyfill ([e660447](e660447143))
* **metro:** average metro fix nothing to look here ([2560e9a](2560e9aeb5))
* **metro:** Blacklist IntlMessagesProxy exports ([e2a05a7](e2a05a77ee))
* **metro:** magical fixes ([af6ba01](af6ba01079))
* **metro:** more checks for the event the cache got faulty (hopefully) ([4cca972](4cca972185))
* **metro:** proxies when unindexed ([8bbf1db](8bbf1dbf5e))
* **metro:** uncached not founds ([c89dc17](c89dc175e3))
* **metro:** unlazify react components when needed ([4057995](4057995a86))
* **native:** update native modules name ([99c1266](99c12660f4))
* only show plugin browser on dev mode ([0817e53](0817e533de))
* pass IconComponent for settings section ([e80ab84](e80ab84b7c))
* pass IconComponent for settings section ([e56ec77](e56ec778e0))
* **plugins:** filter out internal fields when loading plugins ([e141a62](e141a62dd0))
* **plugins:** handle unhandled cases ([61286d8](61286d8980))
* **plugins:** only load core plugins for pyon plugins manager ([fc1ca20](fc1ca2086d))
* **plugins:** race condition when enabling plugin ([85c10af](85c10aff12))
* **polyfill/vendetta:** pass the right Button component ([8a4d5fc](8a4d5fc0f3))
* **polyfill/vendetta:** unproxy some components ([f136597](f136597edd))
* **polyfills:** ??? ([ca25639](ca25639ff0))
* readd semantic fallback for spec 2 themes ([0fd2107](0fd2107473))
* remove debug traces ([863466e](863466e48a))
* remove keyExtractor from flashlist (untested) ([5afcb7b](5afcb7b330))
* remove parent from emitter callback ([fe937a4](fe937a4ab5))
* Restore original behavior broken by b92d2734b3 ([ec2809f](ec2809fe4c))
* Restore original behavior broken for old architecture ([#194](https://github.com/C0C0B01/Kettu/issues/194)) ([acb85ba](acb85bacba))
* revive vendetta compat ([945955d](945955dce8))
* **scripts/build:** correct output filename ([c384fd1](c384fd1a3a))
* **scripts:** fix --serve and set "const and let" as unsupported ([af13f7b](af13f7ba0b))
* set bottom inset for floating buttons ([6f52993](6f52993838))
* **settings:** update tab index lookup approach ([93c17e8](93c17e8e0c))
* **settings:** update tab index lookup approach ([821cbf0](821cbf01f2))
* **storage:** cache childrens proxies ([b1cd040](b1cd040993))
* **storage:** properly create sub-proxy storage ([c4371ed](c4371ed566))
* support New Architecture ([b92d273](b92d2734b3))
* support versions with New Architecture ([#193](https://github.com/C0C0B01/Kettu/issues/193)) ([1b96867](1b96867ac7))
* **themes:** use alternative way to patch chat background ([5ec4150](5ec41500b5)), closes [#123](https://github.com/C0C0B01/Kettu/issues/123)
* **theme:** update validation logic ([c3cbc78](c3cbc78e13))
* **types:** fix typescript [skip ci] ([61f9b65](61f9b6510b))
* **ui/components/ErrorBoundaryScreen:** minor misspelling & update branding ([#57](https://github.com/C0C0B01/Kettu/issues/57)) ([a71dd7d](a71dd7d0eb))
* **ui/components:** fix Search icon ([#46](https://github.com/C0C0B01/Kettu/issues/46)) ([105e1c5](105e1c5ba7))
* **ui/reporter/ErrorBoundaryScreen:** move comment to a single line ([657c8eb](657c8ebd78))
* **ui/settings/Developer:** actually fix asset browser border radius ([e98ad5a](e98ad5af2e))
* **ui/settings/Developer:** apply rounded corners fix ([d968d18](d968d1880e))
* **ui/settings/Developer:** fix border radiuses for Asset Browser ([87263d4](87263d4380))
* **ui/settings/Developer:** replace references to IDs in Asset Browser with indexes ([333a391](333a3919bf))
* **ui/settings:** register `Bunny` section to support bunny plugins ([03893ab](03893ab69c))
* **ui:** fix react crash when uninstalling a plugin ([b629261](b629261316))
* **ui:** unlazify FluxDispatcher, repair patchTabsUI ([b0acf89](b0acf895e4))
* update file existence check to use object for prefix ([85cbac7](85cbac714a))
* update getBuiltInCommands usage ([3eb83ee](3eb83eed33))
* **vd-polyfill:** return fake object ([4181e15](4181e15e89))
* wrap `addonpage` in `safeareaview` ([724fc1e](724fc1e135))
* wrap ErrorBoundaryScreen with SafeAreaProvider ([5e3f9b7](5e3f9b7236))
* wrap only `FloatingActionButton` in `SafeAreaView` for `AddonPage` ([42a8268](42a8268630))
* wrong imports ([87ba67e](87ba67e8c2))

### Features

* add official plugin repo ([60a95ab](60a95aba10))
* **AddonPage:** Add sort options ([7bd53f7](7bd53f7985))
* adopt dev metro ([cc87948](cc879485ac))
* bunny plugins ui init ([5fe3025](5fe3025339))
* **caching:** cache metro finds, persists across reboots ([e4df998](e4df998bb3))
* **ci:** allow dev builds ([73ebfbc](73ebfbc42f))
* **ci:** pass release args ([e19e89c](e19e89ca12))
* compile to bytecode ([18f21fe](18f21feaae))
* **core/i18n:** update default strings ([e232a72](e232a72429))
* **coreplugins:** add badges ([e3df56d](e3df56dc58))
* Custom fonts support ([#28](https://github.com/C0C0B01/Kettu/issues/28)) ([a0d1808](a0d1808cbc))
* dev builds init ([bc80f43](bc80f432b1))
* fonts overhaul ([2e3dc3c](2e3dc3c487))
* highlight search keywords ([0fc8c69](0fc8c69d51))
* implemet basic plugin info ([a198b71](a198b71074))
* improve fonts management ux ([b30e33d](b30e33d2c6))
* **metro+utils:** init lazyfication ([ee6669f](ee6669f514))
* **metro:** assets caching ([d6b47de](d6b47dee77))
* **metro:** cache module flags ([3667a43](3667a4361e))
* **metro:** expose common components & custom jsx runtime ([019fdc2](019fdc28b3))
* **metro:** lazify destructures ([dcb0408](dcb0408e31))
* **metro:** lazy patching! ([b489aea](b489aea48a))
* **patcher:** resolvable proxy patch ([dd6742d](dd6742d08d))
* **plugins:** include plugin hash in sourceURL for caching ([926d875](926d875de7))
* **plugins:** init new bunny spec ([b3c1b74](b3c1b748a0))
* port ErrorBoundary from dev ([f447910](f44791049a))
* port pyoncord's plugin system ([ffc04ee](ffc04ee9c3))
* Rebrand to Revenge ([#51](https://github.com/C0C0B01/Kettu/issues/51)) ([0a61404](0a61404132))
* **settings/pages/Developer:** show assets types, mark non-previewable assets in AssetBrowser ([b7aacf7](b7aacf734e))
* show error when failing to import font entries ([9511f17](9511f17449))
* **storage:** port storage api from dev ([122c3a1](122c3a11e9))
* support 263+ clients ([f1ba456](f1ba456474))
* **themes:** port more stuff from 'dev' ([0eb28e4](0eb28e41b7))
* **ui:** "generalize" plugin components ([e5c8799](e5c87994db))
* **ui/fonts:** rework ([8da3858](8da38589a2))
* **ui/plugins:** Bunny plugin sheet impl ([c168237](c168237fc9))
* **ui/plugins:** overflow actions ([51c6b62](51c6b62f5c))
* **ui/plugins:** show error message ([d6d0801](d6d0801731))
* **ui/settings/Developer:** improve Asset Browser ([02eefe3](02eefe3223))
* **ui/settings/Developer:** make Reload button variant destructive ([a4781d2](a4781d2a2c))
* **ui:** allow adding repository ([b5611d3](b5611d3cf1))
* **ui:** ponyfill AlertModal's `extraContent` prop for older versions ([ad65247](ad6524772b)), closes [#91](https://github.com/C0C0B01/Kettu/issues/91)
* **ui:** simplify some components ([4d88183](4d881835a6))
* **ui:** simplify unproxied notice ([1d4dfd3](1d4dfd311f))
* **ui:** update icons in About page ([ad9e05c](ad9e05c203))
* **ui:** use new alert modal for addon installs ([4a83e32](4a83e32081))
* **ui:** use new alert modal for unproxied plugin install ([fed8887](fed88873ca))
* update visuals, strings, license, add clear bundle dev option ([ee3e53f](ee3e53f943))
* wrap `App` in `SafeAreaProvider` ([ea1aec9](ea1aec9638))

### Performance Improvements

* **themes:** Draft rawColors normalization since writing directly is insanely slow for some reason ([e77e663](e77e6639d4))
* **ui:** use FlashList and some tweaks ([43b2462](43b2462e81))

### Reverts

* Revert "chore(ui/plugins): use buttons for toggle instead of switch" ([d71d503](d71d5037cd))
2025-07-26 08:31:40 +00:00
.github 288 and ra1n loader support 2025-07-26 11:29:29 +03:00
.vscode refactor: build script, use react-jsx 2024-07-08 19:22:01 +08:00
assets add pylix commit 2025-07-21 19:21:59 +03:00
docs add pylix commit 2025-07-21 19:21:59 +03:00
scripts bun fixes 2025-07-26 11:29:31 +03:00
shims feat(metro): expose common components & custom jsx runtime 2024-10-12 23:07:44 +08:00
src bun fixes 2025-07-26 11:29:31 +03:00
.gitignore bun 2025-07-25 17:08:28 +03:00
.releaserc.js add pylix commit 2025-07-21 19:21:59 +03:00
bun.lock bun fixes 2025-07-26 11:29:31 +03:00
CHANGELOG.md chore: Release 1.0.0 [skip ci] 2025-07-26 08:31:40 +00:00
CONTRIBUTING.md add pylix commit 2025-07-21 19:21:59 +03:00
eslint.config.mjs add pylix commit 2025-07-21 19:21:59 +03:00
LICENSE License update 2025-04-29 19:23:30 +01:00
package.json bun fixes 2025-07-26 11:29:31 +03:00
README.md Update README.md 2025-07-18 21:56:21 +01:00
tsconfig.json build: fix errors 2024-07-23 22:43:13 +08:00

Kettu

A mod for Discord on Android

NOTE: Kettu only supports 287 and below, if you want to use the latest version or have particular issues with Kettu, try out its future work-in-progress successor Lumi

Discord https://discord.gg/6cN7wKa8gp

Installing

Only Discord versions 287 and below are supported

Support Me

ko-fi

Please do not donate if you are not able to, if you are able to please don't donate much :)

Building

  1. Install a Kettu loader with loader config support (any mentioned in the Installing section).
  2. Go to Settings > General and enable Developer Settings.
  3. Clone the repo:
    git clone https://github.com/C0C0B01/Kettu
    
  4. Install dependencies:
    pnpm i
    
  5. Build Kettu's code:
    pnpm build
    
  6. In the newly created dist directory, run a HTTP server. I recommend http-server.
  7. Go to Settings > Developer enabled earlier. Enable Load from custom url and input the IP address and port of the server (e.g. http://192.168.1.236:4040/kettu.js) in the new input box labelled Kettu URL.
  8. Restart Discord. Upon reload, you should notice that your device will download Kettu's bundled code from your server, rather than GitHub.
  9. Make your changes, rebuild, reload, go wild!

Alternatively, you can directly serve the bundled code by running pnpm serve. kettu.js will be served on your local address under the port 4040. You will then insert http://<local ip address>:4040/kettu.js as a custom url and reload. Whenever you restart your mobile client, the script will rebuild the bundle as your client fetches it.

Stargazers

Star History Chart