{"id":17210961,"url":"https://github.com/arturbosch/tinbo","last_synced_at":"2025-10-12T03:08:46.696Z","repository":{"id":114468842,"uuid":"66214435","full_name":"arturbosch/Tinbo","owner":"arturbosch","description":"General purpose extensible shell-like platform","archived":false,"fork":false,"pushed_at":"2018-07-22T08:54:33.000Z","size":4178,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-04-13T22:46:09.084Z","etag":null,"topics":["kotlin","spring-shell","timemanagement"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arturbosch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-08-21T18:35:26.000Z","updated_at":"2023-01-05T19:25:42.000Z","dependencies_parsed_at":"2023-06-08T07:00:27.716Z","dependency_job_id":null,"html_url":"https://github.com/arturbosch/Tinbo","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/arturbosch/Tinbo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arturbosch%2FTinbo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arturbosch%2FTinbo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arturbosch%2FTinbo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arturbosch%2FTinbo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arturbosch","download_url":"https://codeload.github.com/arturbosch/Tinbo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arturbosch%2FTinbo/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267912106,"owners_count":24164498,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-30T02:00:09.044Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kotlin","spring-shell","timemanagement"],"created_at":"2024-10-15T02:55:53.644Z","updated_at":"2025-10-12T03:08:46.584Z","avatar_url":"https://github.com/arturbosch.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tinbo\n\nGeneral purpose extensible shell-like platform.\n\n- Builds on top of Spring-Shell\n- Supports different modes for command filtering\n- Highly extensible through ServiceLoader pattern\n\n![tinbo](img/tinbostart.png \"Tinbo - Welcome\")\n\nDevelopment at `https://gitlab.com/arturbosch/Tinbo`\nMirror at `https://github.com/arturbosch/Tinbo`\n\n### Build\n\n- `git clone git@github.com:arturbosch/Tinbo.git`\n- `cd Tinbo`\n- `./gradlew build`\n- `./copyPlugins`\n- `java -jar tinbo-platform/builds/libs/Tinbo-[VERSION].jar`\n\n### Plugins\n\nOfficial Tinbo plugins are:\n- tinbo-time - time tracking \u0026 summaries\n- tinbo-finance - finance tracking\n- tinbo-notes - simple notes storage\n- tinbo-tasks - simple tasks management\n- tinbo-projects - PSP-like project management\n- tinbo-charts - charts for time and project tracking (pie and burndown)\n- tinbo-lloc - count logical lines of code for given path (JVM languages)\n- tinbo-weather - shows weather for the next three days based on specified city\n- tinbo-ascii - transforms given picture into ascii-art (semi-good)\n\nConcept behind this plugins:\n- Easy to use through the terminal\n- Developed with 'i3 power user' in mind\n- No database overhead, saves as csv, easy to modify out of tinbo\n\n\n#### Screenshots\n##### Time mode\n![tinbo](img/tinbotime.png \"Tinbo - Time\")\n\n##### Finance mode\n\n![tinbo](img/tinbofinance.png \"Tinbo - Finance\")\n\n### Write a Plugin\n\nFollow this steps to create your own plugins:\n\n- Create a project and add `tinbo-plugin-api` dependency\n\n```\ndependencies {\n\tcompileOnly project(\":plugin-api\")\n}\n```\n-  Create a class implementing the `TinboPlugin` interface and register your commands. Make use of TinboContext which is basically a wrapper over the spring context. Example from `tinbo-notes`:\n\n```kotlin\n@Component\nclass NotesPlugin : TinboPlugin() {\n\n\toverride fun version(): String = \"1.0.0\"\n\n\toverride fun registerCommands(tinbo: TinboContext): List\u003cCommand\u003e {\n\t\tval console = tinbo.beanOf\u003cTinboTerminal\u003e()\n\t\tval tinboConfig = tinbo.tinboConfig\n\t\tval persister = NotePersister(tinboConfig)\n\t\tval dataHolder = NoteDataHolder(persister, tinboConfig)\n\t\tval executor = NoteExecutor(dataHolder, tinboConfig)\n\t\tval noteCommands = NoteCommands(executor, console)\n\t\ttinbo.registerSingleton(\"NoteCommands\", noteCommands)\n\n\t\tval notesModeCommand = StartNotesModeCommand()\n\t\ttinbo.registerSingleton(\"StartNoteModeCommand\", notesModeCommand)\n\n\t\ttinbo.registerSingleton(\"NotesPersister\", persister)\n\t\treturn listOf(noteCommands, notesModeCommand)\n\t}\n}\n```\n\n- Write your shell commands, see [spring-shell documentation](http://docs.spring.io/spring-shell/docs/current/reference/html/) on how to write spring-shell commands or take a look at one of the tinbo-plugins.\n\n```kotlin\n@CliCommand(\"hello\")\nfun execute(): String {\n    return \"Hello World\"\n}\n```\n\n- Create a file `io.gitlab.arturbosch.tinbo.plugins` in `resources/META-INF/services`\nand write down your fully qualified plugin names. (e.g. `io.gitlab.arturbosch.tinbo.lloc.LLOC`)\n\n- Package up your plugin as a jar and put it in the Tino/plugins folder\n\n- On the next start `tinbo` will locate your plugin and load it!\n\n- If you use external dependency make sure to package them too. (e.g. with gradle: \n`jar { from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } }`)\n\n- If your using maven for plugin development, run `gradle publishToMavenLocal` in `tinbo-plugin-api` folder first.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farturbosch%2Ftinbo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farturbosch%2Ftinbo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farturbosch%2Ftinbo/lists"}