{"id":31714313,"url":"https://github.com/athanclark/scriptorium","last_synced_at":"2026-07-29T19:31:21.175Z","repository":{"id":312888831,"uuid":"1046208693","full_name":"athanclark/scriptorium","owner":"athanclark","description":"Note-taking application","archived":false,"fork":false,"pushed_at":"2025-09-12T19:46:25.000Z","size":527,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-09-12T19:49:37.541Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/athanclark.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-28T10:54:06.000Z","updated_at":"2025-09-12T19:46:29.000Z","dependencies_parsed_at":"2025-09-02T17:38:50.059Z","dependency_job_id":null,"html_url":"https://github.com/athanclark/scriptorium","commit_stats":null,"previous_names":["athanclark/scriptorium"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/athanclark/scriptorium","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athanclark%2Fscriptorium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athanclark%2Fscriptorium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athanclark%2Fscriptorium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athanclark%2Fscriptorium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/athanclark","download_url":"https://codeload.github.com/athanclark/scriptorium/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athanclark%2Fscriptorium/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000725,"owners_count":26082894,"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-10-08T02:00:06.501Z","response_time":56,"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":[],"created_at":"2025-10-09T01:19:33.836Z","updated_at":"2025-10-09T01:19:39.180Z","avatar_url":"https://github.com/athanclark.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"assets/app-icon.svg\" style=\"width: 200px; height: 200px\" /\u003e\n\n# Scriptorium\n\n\u003e A Simple Note-Taking Application\n\nScriptorium is an application for taking notes. It's inspired by [Joplin](https://joplinapp.org/), but has\na few distinct design decisions that differentiate it:\n\n- Support for [Markdown](https://www.markdownguide.org/), [ASCIIDoc](https://asciidoc.org/), and HTML as note-taking\n  syntaxes. It's designed to expand on these in the future, for instance [reStructuredText](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html).\n- Data is stored locally in a [SQLite](https://www.sqlite.org/) database, and remotely with either [MySQL](https://www.mysql.com/) or\n  [PostgreSQL](https://www.postgresql.org/) ([MariaDB](https://mariadb.org/) and [MSSQL](https://www.microsoft.com/en-us/sql-server) are planned).\n- Change Management for data between remote and local databases tries to be as logical and recoverable as possible -- data deletion\n  is discouraged at the user-level whenever possible, which leads to easier unification between databases.\n- Supoport for mobile is planned but not yet implemented (the application is built on [Tauri](https://v2.tauri.app/)).\n\n## Installation\n\nIn the [Releases Page](https://github.com/athanclark/scriptorium/releases), you'll find the latest released and published binaries for your\noperating system.\n\n## Issues\n\nIf the application is broken, whether technically or philosophically, please [file a report](https://github.com/athanclark/scriptorium/issues).\nI am not responsible for your information getting deleted, stolen, or otherwise compromised. See the [License]() for details.\n\n## Building from Source\n\nFirst, make sure you have the following installed:\n\n- [Rust Toolchain](https://rustup.rs/) (just use the `stable` toolchain)\n- [NodeJS](https://nodejs.org/en) (I'm using v24 on my development environment, but the GitHub build workflow is using version 22)\n- [PNPM](https://pnpm.io/)\n- [rsync](https://linux.die.net/man/1/rsync) (on windows it can be [installed via chocolatey](https://community.chocolatey.org/packages/rsync/5.4.1.1))\n- [WebKit2 GTK 4.1](https://webkitgtk.org/reference/webkit2gtk/2.38.4/)\n\nThen, install the dependencies\n\n```bash\npnpm install\n```\n\nYou can get a \"live-reload\" development system by running this:\n\n```bash\npnpm tauri dev\n```\n\nAnd build a production version on your operating system with\n\n```bash\npnpm tauri build\n```\n\nIf you get an error regarding \"failed to run linuxdeploy\", your AppImage bundler might not be able to parse some shared libraries. You can skip some of\nthe symbol stripping with an environment variable:\n\n```bash\nNO_STRIP=1 pnpm tauri build\n```\n\n## Remote Server\n\nCurrently, Scriptorium supports [MySQL](https://www.mysql.com/) and [PostgreSQL](https://www.postgresql.org/) for storing data remotely. You can add your\nconnections under the \"Settings\" window.\n\nIt's assumed that your SQL server has a valid TLS/SSL certificate, and has been configured to use it. Here's a brief overview of getting [Let's Encrypt](https://letsencrypt.org/)\nto repudiate and secure your SQL server:\n\n**NOTE**: What I'm advising below may or may not be considered secure -- use your best judgement / company's best policies / security compliance directives when doing things\nthat could affect your systems' security.\n\n### Getting Your Certificate\n\nBecause Let's Encrypt's CertBot relies on the public Internet to prove ownership of a FQDN, you'll need both a publically accessible server and a domain name pointing to it\n(whether it's an A-record or CNAME is outside of the scope of this article).\n\nFrom there, login to your remote machine and get yourself a certificate:\n\n```bash\ncertbot certonly --standalone -d sql.example.com\n```\n\n\u003e See [CertBot's website](https://certbot.eff.org/) for installation and usage on your platform.\n\nCertBot will typically install your certs under `/etc/letsencrypt/archive/sql.example.com/`, linked from `/etc/letsencrypt/live/sql.example.com`. Typically, these\nwill be owned by the `root` user and the `root` group - specifically the `privkey.pem` file, which your SQL server will need access to. You'll have to decide how you'll go about\nenabling access to that file, but me personally, I like to live dangerously, so I'm going to expand the attack surface for critical private keys and change the owning group\nto a group also shared by the service that runs my SQL server.\n\n### Reading The Certificates\n\nFor instance, if you have have a MySQL server installed and running with [SystemD](https://systemd.io/), typically it will be run under the `mysql` user (created when installing\nthe program). You'll see a similar effect when installing PostgreSQL the same way, which would be run by the `postgres` user. In both of these cases, I'll just add the user to\nthe `ssl-cert` group, which gets created by CertBot when installing the software:\n\n```bash\nusermod -a -G ssl-cert {mysql, postgres}\n```\n\nIn a similar light, I'll change the _group_ ownership of my certificates to that very same group:\n\n```bash\nchown -R root:ssl-cert /etc/letsencrypt/{archive,live}/sql.example.com\n```\n\nFurthermore, I'll have to grant the group read-access to `privkey.pem`:\n\n```bash\nchmod g+r /etc/letsencrypt/archive/sql.example.com/privkey*\n```\n\nThis will now allow our `mysql` or `postgres` user to read those certificates and execute directory search on those folders.\n\n### Configuring MySQL\n\nFor MySQL, you'll have to adjust your `mysqld.conf` file (typically anyway -- your system may differ):\n\n```ini\n# TLS\nssl_cert = /etc/letsencrypt/live/sql.example.com/cert.pem\nssl_key  = /etc/letsencrypt/live/sql.example.com/privkey.pem\nssl_ca   = /etc/letsencrypt/live/sql.example.com/chain.pem\n\n# Prefer modern protocols\ntls_version = TLSv1.2,TLSv1.3\n\n# (MySQL 5.7+/8.0 and MariaDB 10.6+)\nrequire_secure_transport = ON   # force TLS for all non-local connections\n```\n\nI just appended this to my `mysqld.conf` file.\n\n### Configuring PostgreSQL\n\nSimilarly, here's the configuration for `postgresql.conf`:\n\n```ini\nssl = on\nssl_cert_file = '/etc/letsencrypt/live/sql.example.com/fullchain.pem'\nssl_key_file  = '/etc/letsencrypt/live/sql.example.com/privkey.pem'\nssl_ca_file   = '/etc/letsencrypt/live/sql.example.com/chain.pem'\nssl_min_protocol_version = 'TLSv1.2'\n```\n\nRestarting either server after configuring this should enable SSL/TLS for your servers. This is important because we don't want our database's passwords\ngetting leaked to the Internet for every connection.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fathanclark%2Fscriptorium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fathanclark%2Fscriptorium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fathanclark%2Fscriptorium/lists"}