{"id":41933465,"url":"https://github.com/ryot4/sidenote","last_synced_at":"2026-01-25T18:04:19.051Z","repository":{"id":57512637,"uuid":"239320342","full_name":"ryot4/sidenote","owner":"ryot4","description":"A CLI tool that helps to manage plain text notes per working directory","archived":false,"fork":false,"pushed_at":"2025-08-02T15:37:43.000Z","size":133,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-02T17:38:24.541Z","etag":null,"topics":["cli","file-management","note-taking","productivity"],"latest_commit_sha":null,"homepage":"","language":"Go","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/ryot4.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}},"created_at":"2020-02-09T14:43:46.000Z","updated_at":"2025-08-02T15:37:46.000Z","dependencies_parsed_at":"2024-03-12T16:49:18.775Z","dependency_job_id":null,"html_url":"https://github.com/ryot4/sidenote","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/ryot4/sidenote","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryot4%2Fsidenote","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryot4%2Fsidenote/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryot4%2Fsidenote/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryot4%2Fsidenote/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryot4","download_url":"https://codeload.github.com/ryot4/sidenote/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryot4%2Fsidenote/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28756432,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T16:32:25.380Z","status":"ssl_error","status_checked_at":"2026-01-25T16:32:09.189Z","response_time":113,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cli","file-management","note-taking","productivity"],"created_at":"2026-01-25T18:04:18.521Z","updated_at":"2026-01-25T18:04:19.046Z","avatar_url":"https://github.com/ryot4.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sidenote\n\n`sidenote` is a command line tool for managing plain text notes.\n\nWith `sidenote`, you can associate notes with a workspace (a directory and its subdirectories),\nand access them from anywhere in the workspace in the same way, just like files in the current directory.\n\n## Installation\n\n### Binary releases (linux/amd64 only for now)\n\nSee the [releases page](https://github.com/ryot4/sidenote/releases).\nDownload and extract the archive, and then put the binary into the directory listed in `$PATH`.\n\n### Build from source\n\nMake sure [Go distribution is installed](https://golang.org/doc/install), and then run `go install`.\n\n    $ go install github.com/ryot4/sidenote@latest\n\nThis installs the binary into `$GOPATH/bin`. Make sure `$GOPATH/bin` is listed in `$PATH`.\n\n### Command line completions (Bash only for now)\n\n`sidenote completion` prints the shell script for command line completion.\nYou can enable completion by sourcing the script in your shell.\n\nFor Bash, make sure `bash-completion` is installed and add the following line to your `~/.bashrc` file.\n\n    source \u003c(sidenote completion bash)\n\n## Quick start\n\n### .notes directory\n\nTo prevent the working directory from being cluttered with text files, `sidenote` stores notes in a dedicated\ndirectory named `.notes` (by default). First of all, you need to prepare it with `init` subcommand.\n\n    $ sidenote init\n    initialized .notes\n    $ ls -dl .notes\n    drwxr-xr-x 2 ryot4 ryot4 4096 Feb  9 19:03 .notes\n\nIf you want to store files outside the current working directory, you can initialize `.notes`\nas a symbolic link with `init -l`. The target directory is created if it does not exist.\n\n    $ sidenote init -l ~/Documents/notes\n    initialized .notes (-\u003e /home/ryot4/Documents/notes)\n    $ ls -l .notes\n    lrwxrwxrwx 1 ryot4 ryot4 31 Feb  9 19:03 .notes -\u003e /home/ryot4/Documents/notes\n\nWhen `.notes` does not exist in the current working directory, `sidenote` searches the directory\nhierarchy upward. Therefore you only need to run `init` once at the top of each workspace.\n\n    $ sidenote path            # Print the relative path to the .notes directory.\n    .notes\n    $ mkdir subdir; cd subdir\n    $ sidenote path\n    ../.notes                  # Notes in the parent directory are referred.\n\nNote that `.notes` is just a directory; It does not contain any special information other than notes.\nYou can always operate files in `.notes` with standard command line utilities as usual.\n\n### Editing notes\n\nYou can use your favorite text editor to edit notes. (`sidenote` refers `$VISUAL` and `$EDITOR`)\n\n    $ sidenote edit todo.txt                # This opens .notes/todo.txt with $EDITOR.\n    $ sidenote edit -p issues/issue-123.md  # You can create subdirectories. (-p creates the directory if not exists)\n\nNotes can be referred from anywhere in the workspace in the same way. You only need to specify\nthe path of the file in the `.notes` directory, and `sidenote` resolves the actual path to the file.\n\n    $ sidenote edit TODO\n    $ cd path/to/some/subdirectory\n    $ sidenote edit TODO            # This opens the same TODO file as above.\n\nFilenames can be generated based on the current date. (subset of `strftime(3)` format is available)\n\n    $ date +'%Y-%m-%d'\n    2020-02-09\n    $ sidenote edit -f '%Y-%m-%d.md'             # This opens 2020-02-09.md.\n    $ export SIDENOTE_NAME_FORMAT='%Y-%m-%d.md'\n    $ sidenote edit                              # Same as above, but no need to specify the format every time.\n\n### Importing existing files\n\nInstead of creating new files, you can also import existing files with `import` subcommand.\n\n    $ sidenote import note.txt\n    imported note.txt\n    $ sidenote import -d todo.txt                # This removes the original file after import.\n    imported todo.txt\n    $ sidenote import hello.txt hello-world.txt  # You can specify the name of the imported file.\n    imported hello-world.txt\n\n### Displaying notes\n\nTo display notes, use `cat` or `show` subcommand:\n\n    $ sidenote cat todo.txt\n    $ sidenote show todo.txt  # This opens todo.txt with $PAGER.\n\n### File operations\n\nYou can list and remove notes with `ls` and `rm` subcommands, respectively.\n\n    $ sidenote ls\n    todo.txt\n    $ sidenote ls -l\n    Feb  9 21:37 todo.txt\n    $ sidenote rm todo.txt\n    removed todo.txt\n\nOf course you can use standard command line utilities as well.\n\n    $ cd $(sidenote path)   # You can operate files as usual after this.\n    $ mv todo.txt done.txt\n\n### Searching by combination with other commands\n\nSearching can be done with a combination of `path` subcommand and existing searching commands\nsuch as `find` and `grep`.\n\n    $ find $(sidenote path) -name todo.txt      # Find notes named todo.txt.\n    $ grep -R pattern $(sidenote path)          # Search from all files.\n    $ grep -R pattern $(sidenote path 2020/02)  # Search from files in 2020/02/.\n\nIn addition, you can use `exec` subcommand to execute arbitrary commands inside the notes directory.\nThe above examples can also be done as follows using `exec`:\n\n    $ sidenote exec find . -name todo.txt\n    $ sidenote exec grep -R pattern\n    $ sidenote exec -cd 2020/02 grep -R pattern  # You can specify subdirectories with -cd option.\n\nNote that `exec` executes commands without shell; if you want to use shell aliases or functions,\nuse `path` instead.\n\n### And more\n\nFor the full list of subcommands, options and environment varibles, see `sidenote -h` and\n`sidenote \u003ccommand\u003e -h`.\n\n## Tips\n\n### Dotfiles are ignored\n\nYou cannot use filenames beginning with a dot (`.`).\n\n    $ sidenote edit .test\n    error: path .test contains dotfile\n    $ sidenote edit dir/.test\n    error: path dir/.test contains dotfile\n\nIf you create dotfiles inside the notes directory, they are ignored.\n\n    $ sidenote exec git init -q  # Put notes under version control.\n    $ sidenote ls                # This does not list .notes/.git.\n\n### Store files in the directory other than .notes\n\nYou can use `-d` option or `SIDENOTE_DIR` environment variable to specify the directory\nwhere files are stored.\n\n    $ sidenote -d .mynotes init           # Use .mynotes for notes.\n    $ sidenote -d .mynotes edit todo.txt\n    $ export SIDENOTE_DIR=.mynotes\n    $ sidenote edit todo.txt              # Same as above.\n\nYou can also use absolute paths:\n\n    $ sidenote -d ~/Documents/notes ls  # List notes in ~/Documents/notes.\n\n### Share the same notes directory from multiple workspaces\n\nWith `init -l`, you can refer the same directory from multiple workspaces:\n\n    $ cd /path/to/project\n    $ sidenote init -l ~/Documents/notes/coding\n    $ sidenote edit useful-knowledge.adoc\n\nIn another shell session:\n\n    $ cd /path/to/another-project\n    $ sidenote init -l ~/Documents/notes/coding  # Use the same directory.\n    $ sidenote ls\n    useful-knowledge.adoc\n    ...\n\n### Ignore notes in Git globally\n\nTo ignore notes in Git globally, add `.notes` to the file specified by `core.excludesfile`\n(by default, this is `~/.config/git/ignore`) in Git config.\n\n    $ mkdir -p ~/.config/git\n    $ echo .notes \u003e\u003e ~/.config/git/ignore\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryot4%2Fsidenote","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryot4%2Fsidenote","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryot4%2Fsidenote/lists"}