
[{"content":"My Android development projects and libraries.\n","date":"30 July 2025","externalUrl":null,"permalink":"/projects/android/","section":"Projects","summary":"\u003cp\u003eMy Android development projects and libraries.\u003c/p\u003e","title":"Android Projects","type":"projects"},{"content":"I am a developer focused on the Android and Kotlin scenes. I\u0026rsquo;m also a gamer, so you might find some mods and tools for that here as well.\nYou can reach me at support@faendir.com for questions or suggestions regarding my projects.\n","date":"30 July 2025","externalUrl":null,"permalink":"/","section":"F43nd1r","summary":"\u003cp\u003eI am a developer focused on the Android and Kotlin scenes. I\u0026rsquo;m also a gamer, so you might find some mods and tools for that here as well.\u003c/p\u003e\n\u003cp\u003eYou can reach me at \u003ca\n  href=\"mailto:support@faendir.com\"\u003esupport@faendir.com\u003c/a\u003e for questions or suggestions regarding my projects.\u003c/p\u003e","title":"F43nd1r","type":"page"},{"content":"A collection of my open source projects and contributions.\n","date":"30 July 2025","externalUrl":null,"permalink":"/projects/","section":"Projects","summary":"\u003cp\u003eA collection of my open source projects and contributions.\u003c/p\u003e","title":"Projects","type":"projects"},{"content":"Room Ktlint Plugin is a Ktlint rule for automatically formatting SQL queries in Room @Query annotations using sql-formatter.\nThe plugin integrates with Ktlint and supports autocorrection, making it easy to maintain consistently formatted SQL queries in your Android Room database code. It customizes SQL formatting specifically for Room/SQLite dialects.\n","date":"30 July 2025","externalUrl":null,"permalink":"/projects/android/room-ktlint-plugin/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/room-ktlint-plugin\"\n    target=\"_blank\"\n  \u003eRoom Ktlint Plugin\u003c/a\u003e is a Ktlint rule for automatically formatting SQL queries in Room \u003ccode\u003e@Query\u003c/code\u003e annotations using \u003ca\n  href=\"https://github.com/vertical-blank/sql-formatter\"\n    target=\"_blank\"\n  \u003esql-formatter\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe plugin integrates with Ktlint and supports autocorrection, making it easy to maintain consistently formatted SQL queries in your Android Room database code. It customizes SQL formatting specifically for Room/SQLite dialects.\u003c/p\u003e","title":"Room Ktlint Plugin","type":"projects"},{"content":"AWS CDK Kotlin is a generated Kotlin DSL for AWS CDK. It provides a more idiomatic way to work with AWS CDK in Kotlin, enabling fluent, type-safe infrastructure as code.\nOverview # The AWS CDK Kotlin DSL auto-generates Kotlin extension functions for every AWS CDK construct, builder, and resource. This allows developers to define cloud infrastructure using a Kotlin-idiomatic syntax with full IDE support and type safety.\nUnder the hood this DSL is a wrapper over the existing AWS CDK Java API, making it easier to use in Kotlin projects. Wrappers are automatically generated and updated using Renovate auto merge and Github Actions.\nExample # app { stack(\u0026#34;LambdaStack\u0026#34;) { buildFunction(\u0026#34;HelloHandler\u0026#34;) { code(Code.fromInline(\u0026#34;function handler() { console.log(\u0026#39;Hello, CDK\u0026#39;); }\u0026#34;)) handler(\u0026#34;index.handler\u0026#34;) runtime(Runtime.NODEJS_16_X) } } }.synth() How It Works # The DSL generates functions for:\nCDK Constructs (e.g., App) - Creates instances with optional initialization blocks:\npublic fun app(initializer: @AwsCdkDsl App.() -\u0026gt; Unit = {}): App = App().apply(initializer) public fun app(props: AppProps, initializer: @AwsCdkDsl App.() -\u0026gt; Unit = {}): App = App(props).apply(initializer) CDK Construct Builders (e.g., App.Builder) - Enables fluent builder patterns:\npublic fun buildApp(initializer: @AwsCdkDsl App.Builder.() -\u0026gt; Unit = {}): App = App.Builder.create().apply(initializer).build() Scoped Constructs (e.g., Stack) - Provides receiver functions for easy nesting within parent constructs:\npublic fun stack(initializer: @AwsCdkDsl Stack.() -\u0026gt; Unit = {}): Stack = Stack().apply(initializer) public fun Construct.stack(initializer: @AwsCdkDsl Stack.() -\u0026gt; Unit = {}): Stack = Stack(this).apply(initializer) public fun Construct.stack(id: String, initializer: @AwsCdkDsl Stack.() -\u0026gt; Unit = {}): Stack = Stack(this, id).apply(initializer) public fun Construct.stack(id: String, props: StackProps, initializer: @AwsCdkDsl Stack.() -\u0026gt; Unit = {}): Stack = Stack(this, id, props).apply(initializer) ","date":"19 May 2023","externalUrl":null,"permalink":"/projects/kotlin/aws-cdk-kt/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/aws-cdk-kt\"\n    target=\"_blank\"\n  \u003eAWS CDK Kotlin\u003c/a\u003e is a generated Kotlin DSL for \u003ca\n  href=\"https://aws.amazon.com/cdk/\"\n    target=\"_blank\"\n  \u003eAWS CDK\u003c/a\u003e. It provides a more idiomatic way to work with AWS CDK in Kotlin, enabling fluent, type-safe infrastructure as code.\u003c/p\u003e","title":"AWS CDK Kotlin","type":"projects"},{"content":"Kotlin libraries and tools I\u0026rsquo;ve developed.\n","date":"19 May 2023","externalUrl":null,"permalink":"/projects/kotlin/","section":"Projects","summary":"\u003cp\u003eKotlin libraries and tools I\u0026rsquo;ve developed.\u003c/p\u003e","title":"Kotlin Projects","type":"projects"},{"content":"This article will give an introduction to Kotlin annotation processing using Kotlin Symbol Processing (KSP). We’ll take a look at KSP, compare it to the alternative KAPT, and implement a simple example.\n","date":"10 June 2022","externalUrl":"https://codecentric.de/wissens-hub/blog/kotlin-symbol-processing-introduction","permalink":"/blog/kotlin-symbol-processing-introduction/","section":"Blog","summary":"\u003cp\u003eThis article will give an introduction to Kotlin annotation processing using Kotlin Symbol Processing (KSP). We’ll take a look at KSP, compare it to the alternative KAPT, and implement a simple example.\u003c/p\u003e","title":"An Introduction to Kotlin Symbol Processing","type":"blog"},{"content":"Technical articles and posts about Android, Kotlin, and software development.\n","date":"10 June 2022","externalUrl":null,"permalink":"/blog/","section":"Blog","summary":"\u003cp\u003eTechnical articles and posts about Android, Kotlin, and software development.\u003c/p\u003e","title":"Blog","type":"blog"},{"content":"This article will give an introduction to Kotlin DSLs (Domain-Specific Languages) and teach you how to create and generate them with an annotation processor. We’ll also take a look at Kotlin internals and how we can use this knowledge to our advantage.\n","date":"6 May 2022","externalUrl":"https://codecentric.de/wissens-hub/blog/generating-kotlin-dsls","permalink":"/blog/generating-kotlin-dsls/","section":"Blog","summary":"\u003cp\u003eThis article will give an introduction to Kotlin DSLs (Domain-Specific Languages) and teach you how to create and generate them with an annotation processor.\nWe’ll also take a look at Kotlin internals and how we can use this knowledge to our advantage.\u003c/p\u003e","title":"Generating Kotlin DSLs","type":"blog"},{"content":"AutoDSL auto-generates DSL (Domain Specific Languages) for your Kotlin classes using annotations. It can run with either KSP or KAPT.\n","date":"28 April 2021","externalUrl":null,"permalink":"/projects/kotlin/autodsl/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/autodsl-ksp\"\n    target=\"_blank\"\n  \u003eAutoDSL\u003c/a\u003e auto-generates DSL (Domain Specific Languages) for your Kotlin classes using annotations. It can run with either \u003ca\n  href=\"https://github.com/google/ksp\"\n    target=\"_blank\"\n  \u003eKSP\u003c/a\u003e or \u003ca\n  href=\"https://kotlinlang.org/docs/kapt.html\"\n    target=\"_blank\"\n  \u003eKAPT\u003c/a\u003e.\u003c/p\u003e","title":"AutoDSL","type":"projects"},{"content":"Charm is a mod for Minecraft inspired by the Quark mod in that it is designed to enhance the vanilla game experience without compromising its gameplay style.\nCharm was created by @svenhjol. I joined the project during the update cycle for Minecraft 1.16.\nFind more info on Curseforge.com.\n","date":"9 November 2020","externalUrl":null,"permalink":"/projects/games/charm/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/svenhjol/Charm\"\n    target=\"_blank\"\n  \u003eCharm\u003c/a\u003e is a mod for Minecraft inspired by the \u003ca\n  href=\"https://github.com/Vazkii/Quark\"\n    target=\"_blank\"\n  \u003eQuark\u003c/a\u003e mod in that it is designed to enhance the vanilla game experience without compromising its gameplay style.\u003c/p\u003e\n\u003cp\u003eCharm was created by \u003ca\n  href=\"https://github.com/svenhjol\"\n    target=\"_blank\"\n  \u003e@svenhjol\u003c/a\u003e. I joined the project during the update cycle for Minecraft 1.16.\u003c/p\u003e","title":"Charm","type":"projects"},{"content":"Projects relating to games, like mods and tools.\n","date":"9 November 2020","externalUrl":null,"permalink":"/projects/games/","section":"Projects","summary":"\u003cp\u003eProjects relating to games, like mods and tools.\u003c/p\u003e","title":"Game Projects","type":"projects"},{"content":"This project consists of a leaderboard discord bot for sevaral Zachtronics games, (Opus Magnum, Spacechem, Shenzhen I/O) and a leaderboard website for Opus Magnum.\n","date":"25 August 2020","externalUrl":null,"permalink":"/projects/games/zlbb/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/zachtronics-leaderboard-bot\"\n    target=\"_blank\"\n  \u003eThis project\u003c/a\u003e consists of a leaderboard discord bot for sevaral Zachtronics games, (\u003ca\n  href=\"https://store.steampowered.com/app/558990/Opus_Magnum/\"\n    target=\"_blank\"\n  \u003eOpus Magnum\u003c/a\u003e, \u003ca\n  href=\"https://store.steampowered.com/app/92800/SpaceChem/\"\n    target=\"_blank\"\n  \u003eSpacechem\u003c/a\u003e, \u003ca\n  href=\"https://store.steampowered.com/app/504210/SHENZHEN_IO/\"\n    target=\"_blank\"\n  \u003eShenzhen I/O\u003c/a\u003e) and a \u003ca\n  href=\"https://zlbb.faendir.com/\"\n    target=\"_blank\"\n  \u003eleaderboard website\u003c/a\u003e for Opus Magnum.\u003c/p\u003e","title":"Zachtronics Leaderboard Bot","type":"projects"},{"content":"Querydsl Kotlin Codegen is a querydsl module which allows you to generate kotlin QClasses. It was upstreamed in querydsl 5.\nI\u0026rsquo;m also helping with Querydsl maintenance in general.\n","date":"8 May 2020","externalUrl":null,"permalink":"/projects/kotlin/querydsl-kotlin-codegen/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/querydsl/querydsl/tree/master/querydsl-kotlin-codegen\"\n    target=\"_blank\"\n  \u003eQuerydsl Kotlin Codegen\u003c/a\u003e is a querydsl module which allows you to generate kotlin QClasses. It was upstreamed in querydsl 5.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m also helping with Querydsl maintenance in general.\u003c/p\u003e","title":"Querydsl Kotlin Codegen","type":"projects"},{"content":"F43dit is an Opus Magnum solution editing project.\nThere are two parts:\nOMSP is the solution parser, which transforms solution files into a kotlin model and vice versa.\nOMSEKT contains the solution kotlin dsl and transforms the kotlin model into dsl and back again. It also contains an online solution editor hosted here.\n","date":"3 April 2020","externalUrl":null,"permalink":"/projects/games/f43dit/","section":"Projects","summary":"\u003cp\u003eF43dit is an \u003ca\n  href=\"http://www.zachtronics.com/opus-magnum/\"\n    target=\"_blank\"\n  \u003eOpus Magnum\u003c/a\u003e solution editing project.\u003c/p\u003e\n\u003cp\u003eThere are two parts:\u003c/p\u003e\n\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/omsp\"\n    target=\"_blank\"\n  \u003eOMSP\u003c/a\u003e is the solution parser, which transforms solution files into a kotlin model and vice versa.\u003c/p\u003e\n\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/omsekt\"\n    target=\"_blank\"\n  \u003eOMSEKT\u003c/a\u003e contains the solution kotlin dsl and transforms the kotlin model into dsl and back again. It also contains an online solution editor hosted \u003ca\n  href=\"https://om.faendir.com\"\n    target=\"_blank\"\n  \u003ehere\u003c/a\u003e.\u003c/p\u003e","title":"F43dit","type":"projects"},{"content":"Liquibase Kotlin DSL is a Kotlin DSL for Liquibase changelogs, originally developed by redundent.\n","date":"19 December 2019","externalUrl":null,"permalink":"/projects/kotlin/liquibase-kotlin-dsl/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/liquibase-kotlin-dsl\"\n    target=\"_blank\"\n  \u003eLiquibase Kotlin DSL\u003c/a\u003e is a Kotlin DSL for Liquibase changelogs, originally developed by \u003ca\n  href=\"https://github.com/redundent/liquibase-kotlin-dsl\"\n    target=\"_blank\"\n  \u003eredundent\u003c/a\u003e.\u003c/p\u003e","title":"Liquibase Kotlin DSL","type":"projects"},{"content":"cardmarket-api-kotlin is a kotlin wrapper for the cardmarket.com API.\n","date":"14 October 2019","externalUrl":null,"permalink":"/projects/kotlin/cardmarket/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/cardmarket-api-kotlin\"\n    target=\"_blank\"\n  \u003ecardmarket-api-kotlin\u003c/a\u003e is a kotlin wrapper for the \u003ca\n  href=\"https://www.cardmarket.com\"\n    target=\"_blank\"\n  \u003ecardmarket.com\u003c/a\u003e \u003ca\n  href=\"https://api.cardmarket.com/ws/documentation\"\n    target=\"_blank\"\n  \u003eAPI\u003c/a\u003e.\u003c/p\u003e","title":"Kotlin Cardmarket API","type":"projects"},{"content":"Acrarium is a server application collecting and aggregating bug reports sent from ACRA. Reports are automatically categorized and visualized, while also allowing to view all report content manually.\n","date":"17 May 2017","externalUrl":null,"permalink":"/projects/android/acrarium/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/Acrarium\"\n    target=\"_blank\"\n  \u003eAcrarium\u003c/a\u003e is a server application collecting and aggregating bug reports sent from \u003ca\n  href=\"https://github.com/ACRA/acra\"\n    target=\"_blank\"\n  \u003eACRA\u003c/a\u003e.\nReports are automatically categorized and visualized, while also allowing to view all report content manually.\u003c/p\u003e","title":"Acrarium","type":"projects"},{"content":"Rhino is an implementation of JavaScript in Java. Rhino for Android allows to use all features of Rhino on Android.\nFeatures which were previously not working on Android include\noptimization levels other than -1 the usage of JavaAdapter to extend Java classes from JavaScript ","date":"5 February 2016","externalUrl":null,"permalink":"/projects/android/rhino/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/mozilla/rhino\"\n    target=\"_blank\"\n  \u003eRhino\u003c/a\u003e is an implementation of JavaScript in Java. \u003ca\n  href=\"https://github.com/F43nd1r/rhino-android\"\n    target=\"_blank\"\n  \u003eRhino for Android\u003c/a\u003e allows to use all features of Rhino on Android.\u003c/p\u003e\n\u003cp\u003eFeatures which were previously not working on Android include\u003c/p\u003e","title":"Rhino for Android","type":"projects"},{"content":"ACRA is a library enabling Android Applications to automatically send their crash reports to a report server. It is targeted to android application developers to help them get data from their applications when they crash or behave erroneously.\nIt was originally developed by Kevin Gaudin and is currently maintained by me.\n","date":"3 January 2016","externalUrl":null,"permalink":"/projects/android/acra/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/ACRA/acra\"\n    target=\"_blank\"\n  \u003eACRA\u003c/a\u003e is a library enabling Android Applications to automatically send their crash reports to a report server. It is targeted to android application developers to help them get data from their applications when they crash or behave erroneously.\u003c/p\u003e","title":"ACRA","type":"projects"},{"content":"Multitool was a Lightning Launcher plugin bundling various functions, including\nAnimations Scheduled Backups Gesture Support Music Widget Calendar Widget Script Manager Development on Lightning Launcher has seized. This project has been archived.\n","date":"30 August 2015","externalUrl":null,"permalink":"/projects/android/multitool/","section":"Projects","summary":"\u003cp\u003e\u003ca\n  href=\"https://github.com/F43nd1r/Multitool\"\n    target=\"_blank\"\n  \u003eMultitool\u003c/a\u003e was a \u003ca\n  href=\"https://www.lightninglauncher.com/wordpress/\"\n    target=\"_blank\"\n  \u003eLightning Launcher\u003c/a\u003e plugin bundling various functions, including\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAnimations\u003c/li\u003e\n\u003cli\u003eScheduled Backups\u003c/li\u003e\n\u003cli\u003eGesture Support\u003c/li\u003e\n\u003cli\u003eMusic Widget\u003c/li\u003e\n\u003cli\u003eCalendar Widget\u003c/li\u003e\n\u003cli\u003eScript Manager\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDevelopment on Lightning Launcher has seized. This project has been archived.\u003c/p\u003e","title":"Multitool","type":"projects"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"}]