{"id":15594805,"url":"https://github.com/simonneutert/labradorite-notebook","last_synced_at":"2025-07-22T01:06:25.707Z","repository":{"id":61561337,"uuid":"542307420","full_name":"simonneutert/labradorite-notebook","owner":"simonneutert","description":"Dramatization: Every online notebook failed me. Labradorite keeps me sane. All my notes at my fingertips.","archived":false,"fork":false,"pushed_at":"2025-06-21T12:31:38.000Z","size":1080,"stargazers_count":9,"open_issues_count":8,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-21T13:35:19.558Z","etag":null,"topics":["flatfile","journal","localhost","notes","notes-app","notetaking","roda","ruby","rust","selfhost","selfhosted","tantiny","tantivy","webapp"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/simonneutert.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2022-09-27T22:10:52.000Z","updated_at":"2025-06-21T12:31:34.000Z","dependencies_parsed_at":"2024-09-17T16:47:26.884Z","dependency_job_id":"374b8306-1f03-44ad-b823-37be69afd088","html_url":"https://github.com/simonneutert/labradorite-notebook","commit_stats":null,"previous_names":[],"tags_count":28,"template":true,"template_full_name":null,"purl":"pkg:github/simonneutert/labradorite-notebook","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonneutert%2Flabradorite-notebook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonneutert%2Flabradorite-notebook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonneutert%2Flabradorite-notebook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonneutert%2Flabradorite-notebook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/simonneutert","download_url":"https://codeload.github.com/simonneutert/labradorite-notebook/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonneutert%2Flabradorite-notebook/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266405405,"owners_count":23923536,"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-21T11:47:31.412Z","response_time":64,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"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":["flatfile","journal","localhost","notes","notes-app","notetaking","roda","ruby","rust","selfhost","selfhosted","tantiny","tantivy","webapp"],"created_at":"2024-10-03T00:41:41.558Z","updated_at":"2025-07-22T01:06:25.691Z","avatar_url":"https://github.com/simonneutert.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Labradorite Notebook\u003c!-- omit in toc --\u003e\n\n\u003cimg align=\"right\" src=\"https://github.com/simonneutert/labradorite-notebook/blob/main/public/labradorite.jpg?raw=true\" alt=\"Labradorite dreamed by openai's Dall-E2: A brown labrador shooting a lazer from a blue crystal on its forehead, digital art\"\u003e\n\n\u003e Labradorite rightfully belongs to the group of wisdom crystals, because it\n\u003e promotes a free flow of mental energy as it awakens intuition and allows us to\n\u003e get mentally unstuck.\n\u003e\n\u003e _\\- every esoteric out there_\n\n---\n\n[![Ruby 3.3 Rust 1.76.0](https://github.com/simonneutert/labradorite-notebook/actions/workflows/ruby.yml/badge.svg)](https://github.com/simonneutert/labradorite-notebook/actions/workflows/ruby.yml)\n\n---\n\n\u003e [!IMPORTANT] [Tantiny](https://github.com/baygeldin/tantiny) has died this\n\u003e summer (most probably) ...\n\u003e\n\u003e This project heavily depends on Tantiny, and as a result, we anticipate\n\u003e releasing our final updates in the near future.\\\n\u003e I am committed to maintaining the project's functionality for as long as\n\u003e feasible. However, I will not be investing additional time or resources into\n\u003e its further development. 😔 🥲 It will continue to work though! As it is\n\u003e fulfilling what it was built for in the first place. Dependabot will help keep\n\u003e security vulnerabilities closed and containerization will do the rest.\n\n---\n\n- [Rationale](#rationale)\n- [Features / User Info](#features--user-info)\n- [Technical Prerequisites](#technical-prerequisites)\n- [Architecture](#architecture)\n- [Folder Structure](#folder-structure)\n- [Major Dependencies](#major-dependencies)\n- [Run/Deploy with Docker](#rundeploy-with-docker)\n  - [Docker Compose](#docker-compose)\n- [Development](#development)\n- [Run it](#run-it)\n- [Follow-up: Inspiration, Knowledge](#follow-up-inspiration-knowledge)\n    - [Tantiny](#tantiny)\n    - [Rails Multi-Model Search](#rails-multi-model-search)\n\n---\n\n## Rationale\n\nMost Notetaking apps do either too much (Notion), too little (Apple Notes) and\nlock me in (all options ever).\n\nI wanted something that does **just-enough**™, in the spirit of a _flat file\ncms_. Let me try and wrap it up in a few bullets:\n\n- **ownership** of the notes (flat files)\\\n  markdown, yaml, attachments all in one place in directories\n- **easy** on the eyes/mind\\\n  I don't want to see all the old stuff I may not need anymore\n- a search that shows me **snips** in the notes\\\n  not just the notes in a sidebar\n- a very simple **tagging** support\n- basic **file uploads**\\\n  keeping the originals side by side with notes\n\nI like to keep things simple, so I once again fell for\n[Roda](https://roda.jeremyevans.net) as the Web Layer.\n[Tantiny](https://github.com/baygeldin/tantiny) is the kicker for this project.\nI was curious, if I could come up with something useful quickly, not having to\ndeal with a complicated setup or Postgres as a requirement.\n\n---\n\n## Features / User Info\n\n**Markdown Editor**\n\n- Preview\n- Supports auto-formatting with/around saving (on page refresh)\n\n**Attachments**\n\n- supported attachments for uploads\n  - txt\n  - pdf\n  - md\n  - png\n  - jpg\n  - jpeg\n  - heic\n  - webp\n  - yml\n  - yaml\n  - json\n\n**Screenshots**\n\n\u003cimg src=\"assets/docs/images/search_results.png\"\u003e\n\n---\n\n\u003cimg src=\"assets/docs/images/edit.png\"\u003e\n\n---\n\n\u003cimg src=\"assets/docs/images/show.png\"\u003e\n\n## Technical Prerequisites\n\n- Ruby v3.x are tested and ready to roll\n- Install [Rust@v1.76.0](https://www.rust-lang.org/) with\n  [Cargo](https://github.com/rust-lang/cargo)\n\n## Architecture\n\nLittle experiment on how it rolls:\n\n- all GET gets HTML\n- all POST sends FORMS/JSON gets JSON back\n- all links/navigation are plain HTML `a` tags 🤯\n\n## Folder Structure\n\n- `lib`: Library Code / Business Logic\n- `views`: ERB Views\n- `memos`: the Memos/Notes in subdirectories `YYYY/MM/DD/random-string`\n- `public`: css/js/media\n- `.tantiny`: the local index data created by the\n  [tantiny](https://github.com/baygeldin/tantiny) gem\n\n## Major Dependencies\n\n- Roda\n- Tantiny\n- RedCarpet\n\n## Run/Deploy with Docker\n\nThe included `Dockerfile` and the `docker-compose.yml` are more a stub to build\nupon.\n\nCurrently the Dockerfile support passing the USERNAME as an `build-arg`.\n\n- `$ docker build . --build-arg USERNAME=$(whoami) -t labba`\n- `$ docker run --rm -p9292:9292 labba`\n\nEither this way, or you adapt the Dockerfile to your needs.\n\nLet's say your username on the server you run (or your machine) is `johndoe`,\nthen your Dockerfile should look something like this:\n\n```Dockerfile\n# in your version of the Dockerfile, replace labradorite at the ARG USERNAME\nARG USERNAME=johndoe\n```\n\nThat will help you both secure the service and have the files being created with\nthe proper rights on the host system.\n\n### Docker Compose\n\nbuild and/or up using: `$ USERNAME=$(whoami) docker-compose build`\n\n**Volumes**\n\n- this `memos` directory has all your created content in it. Having it mounted\n  from your host should make easy for you to backup (if you don't use a private\n  gitrepo for that 😉)\n- fyi: having tantiny's index (`.tantiny`) as a volume has no benefit. Beware,\n  it can easily have a negative impact.\n\n## Development\n\nFrom v0.5.0 on, the project can only be run native on a Linux machine or in a\nDocker container. See the Dockerfiles and `justfile` for more information.\n\n- `$ rake test` runs the test suite\n- `$ rake reset_default_memos` resets the files to the repos defaults (e.g. for\n  testing)\n- `$ rake reset_memos` clears ALL memos\n\nBefore pushing code, you should always run `rake reset` and `rake test`,\\\n**therefore have a repo you work on AND another you use JUST for running the\nsoftware.**\n\n## Run it\n\nExample docker-compose file:\n\n```docker-compose\nversion: '3'\nservices:\n  app:\n    user: \"${UID}:${GID}\"\n    environment:\n      - USERNAME=yourusername # REPLACE THIS WITH YOUR VPS user's USERNAME\n    image: ghcr.io/simonneutert/labradorite-notebook:v0.2.0\n    # ports:\n    #  - 9292:9292\n    command: bundle exec rackup -o0 -Eproduction\n    volumes:\n      - ./memos:/home/labradorite/memos:cached\n```\n\n## Follow-up: Inspiration, Knowledge\n\n#### Tantiny\n\nhttps://github.com/baygeldin/tantiny\n\n#### Rails Multi-Model Search\n\nhttps://stevepolito.design/blog/search-across-multiple-models-in-rails/\n\nGist: a searchable table is to be added and kept updated using commit_hooks\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonneutert%2Flabradorite-notebook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsimonneutert%2Flabradorite-notebook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonneutert%2Flabradorite-notebook/lists"}