Lines of code




INEZ / Timon Schelling


This Project Is my participation in the INEZ-challenge by


  • Written in kotlin
  • Easy to use shopping list
  • Auto save
  • Add and remove items
  • Check items
  • Optional hide checked items
  • Reset list(uncheck all item at once)
  • Check Spelling of units and products
  • Customizable units and product list
  • Find and merge duplicates (to example “1 Apple” & “2 Apple” -> “3 Apple”)
  • Pin/unpin window (blue button)



Installed JRE(1.8 tested on every System) with javafx (


Installed JDK(1.8 tested on every System) with javafx (


Download the dist.zib from the current release and extract it on your machine


Run the launch file depending on your System



Linux and MacOS:


or run it directly with Java:

java -cp "lib/*" Main

Code example’s

klang tool

import klang.check
import klang.impl.JLanguageToolRule
import klang.tool
import org.languagetool.language.GermanyGerman

fun main() {
    val someRandomGermanTextWithSpellingIssues = "Hallo. Ich ben ein kliner Blindtext. Und zwar schan so longe ich denken kann."

    //create new tool object
    val tool = tool {
        //add all rules here with unaryPlus or add

    //call check method on tool to execute all tool rules on someRandomGermanTextWithSpellingIssues
    val suggestions = tool.check(someRandomGermanTextWithSpellingIssues)

    //read and print suggestion data
    suggestions.forEachIndexed { i, it ->
        println("$i: ${it.original} --> ${it.suggested}")



0: ben --> Ben
1: ben --> den
2: ben --> bei
3: ben --> oben
4: ben --> per
5: ben --> bin
6: ben --> eben
7: ben --> gen
8: ben --> wen
9: ben --> Yen
10: ben --> peu
11: ben --> säen  


The project is built with Gradle. Run Gradle to build the project and to run the tests using the following command on Linux/MacOS:

./gradlew build

or the following command on Windows:

gradlew build

The folder dist will contain a ready to use build of INEZ and (as common for gradle) build all other build files.



The settings.json can be found in the static folder. It is used to configure products and units that the app should know about.

The main json object should contain too elements:


A json object containing all product groups.

A product group is described:

"name of the product groupe": ["name of a specific product", "name of a specific product", ...]

*U can use %PRODUCT% inside of a actual product name as a variable containing the product grope name:

"Milch": ["%PRODUCT% Foo&Bar"]

Is the same as

"Milch": ["Milch Foo&Bar"]


A json array of unit describing json objects

A unit is described:

  "name": "actual name of the unit",
  "shortcut": "shortcut of the unit"

To example:

    "products": {
        "Milch": ["%PRODUCT% Foo&Bar", "%PRODUCT% Bar&Foo"]
    "units": [
          "name": "Gramm",
          "shortcut": "mg"
          "name": "Kilogramm",
          "shortcut": "kg"



  • Core: UI and INEZ specific code
  • Util: not INEZ specific code
  • Test: Unit tests


  • amber: parts of my currently not published kotlin utility library Amber
  • klang: tool to suggest text changes in user input (based on rules, also used for autocompletion)
  • org.slf4j.impl: contains a dummy StaticLoggerBinder(used to disable slf4j logging)


Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License