{"id":20284437,"url":"https://github.com/artyom/notes-server","last_synced_at":"2026-02-10T23:05:32.469Z","repository":{"id":66758976,"uuid":"399411665","full_name":"artyom/notes-server","owner":"artyom","description":"Small web server to handle personal notes","archived":false,"fork":false,"pushed_at":"2024-12-11T23:18:55.000Z","size":2667,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-20T02:48:58.738Z","etag":null,"topics":[],"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/artyom.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}},"created_at":"2021-08-24T09:42:29.000Z","updated_at":"2024-03-02T09:26:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"62b47285-3a02-4336-86b4-313dde296820","html_url":"https://github.com/artyom/notes-server","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/artyom/notes-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artyom%2Fnotes-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artyom%2Fnotes-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artyom%2Fnotes-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artyom%2Fnotes-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/artyom","download_url":"https://codeload.github.com/artyom/notes-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artyom%2Fnotes-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29321277,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T20:44:44.282Z","status":"ssl_error","status_checked_at":"2026-02-10T20:44:43.393Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":[],"created_at":"2024-11-14T14:19:46.462Z","updated_at":"2026-02-10T23:05:32.452Z","avatar_url":"https://github.com/artyom.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Notes Server\n\nThis is a small HTTP server that handles personal notes.\nIt presents notes as a collection of markdown (commonmark) documents,\nand allows to edit them directly in a web interface.\n\nThis tool is targeted for personal use only, and implements some rudimentary safety checks against accidental exposure to the public internet:\nit only serves requests coming from the private network ranges.\n\nThis server keeps its data in a single SQLite database.\n\n## Composing\n\nAt the root page it serves a list of all notes.\n\nTo create a new note/page, navigate to its to-be location, you'll see a 404 error page with a link.\n\nThis tool relies on the [Monaco editor] as its composer.\nEditor covers the whole page, to submit your changes, use `Cmd-s` or `Ctrl-s` hotkey.\n\nThe very first line of the note becomes its title.\n\n[Monaco editor]: https://microsoft.github.io/monaco-editor/\n\n## Tags\n\nNotes may have tags assigned for categorization.\nTags are read directly from the note body, from the first “HTML comment” section.\n\nTags must be a set of comma-separated terms located on a single line,\nprefixed with the `Tags:` substring.\n\nSome examples, that are equivalent:\n\n```html\n\u003c!-- Tags: tag1, tag2 --\u003e\n```\n\n```html\n\u003c!--\n    Tags: tag1, tag2\n--\u003e\n```\n\n```html\n\u003c!--\n    Some text.\n    Tags: tag1, tag2\n    More text.\n--\u003e\n```\n\n## Uploads\n\nYou can also attach files by dragging them into the editor.\nOnce file uploads, you'll get a relative link to it at the cursor position.\nNote that currently files are stored directly in the same database as notes.\nCurrent limit for a single file is 10MiB.\n\nSome quirks:\n\n* Files can only be uploaded to an already saved notes.\n  Attempts to upload file to a new note that's not saved yet will fail.\n* If you delete a note, all its attachments are deleted too.\n\n## Search\n\nFor full text search this tool relies on [SQLite FTS5 extension],\nsee its [syntax] for more details.\n\n[SQLite FTS5 extension]: http://sqlite.org/fts5.html\n[syntax]: https://sqlite.org/fts5.html#full_text_query_syntax\n\n## Backups\n\nAs this tool keeps all its data in a single database, backups are trivial.\nThere's a caveat that it's not safe to copy the database while the tool is running.\nTo safely get a backup file while the server is running, you can use the sqlite cli,\nto open the database and issue a [VACUUM INTO] command.\n\nAlternatively, you can use the tool under `tools/notes-backup` directory.\nIt creates a backup file, and uploads it to an S3 bucket.\nIt is intended to be run as a scheduled job.\n\n[VACUUM INTO]: https://sqlite.org/lang_vacuum.html#vacuum_with_an_into_clause\n\n## HTTPS\n\nThere's a special condition in the code that allows it to run as a HTTPS service.\nIt is intended for the split-DNS setups, where you keep a stub service running on the public HTTPS endpoint.\n\nSuch stub service relies on Let's Encrypt ACME API to get a certificate for a given domain name,\nand store it into the same database that notes-server uses.\n\nNotes server then can be run listening on the *private* HTTPS endpoint,\nexpecting requests for the same domain, and using certificate from the database.\n\nThere's an implementation of such a stub service under `tools/autocert-stub` directory.\n\n## Contributions\n\nThis code is open source, but it is very opinionated and only implements the features that I personaly use.\nIt is likely not a good fit for any other use case that's different from that.\n\nIf you need some feature or change in the current behavior,\nplease fork this project and build your extension on top such fork.\nIt is unlikely that any pull requests with the functionality I'm not interested in will get merged into this repository.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartyom%2Fnotes-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fartyom%2Fnotes-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartyom%2Fnotes-server/lists"}