{"id":16782301,"url":"https://github.com/erikdoe/quvyn","last_synced_at":"2025-04-10T21:22:29.984Z","repository":{"id":37003357,"uuid":"279984083","full_name":"erikdoe/quvyn","owner":"erikdoe","description":"Minimal website commenting system","archived":false,"fork":false,"pushed_at":"2023-04-13T16:56:31.000Z","size":1881,"stargazers_count":12,"open_issues_count":2,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-24T18:52:28.034Z","etag":null,"topics":["ava","comments","playwright","rust","vuejs"],"latest_commit_sha":null,"homepage":"https://erikdoe.github.io/quvyn","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/erikdoe.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":"2020-07-15T21:32:58.000Z","updated_at":"2023-01-31T21:21:37.000Z","dependencies_parsed_at":"2025-02-18T03:41:50.202Z","dependency_job_id":null,"html_url":"https://github.com/erikdoe/quvyn","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erikdoe%2Fquvyn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erikdoe%2Fquvyn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erikdoe%2Fquvyn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erikdoe%2Fquvyn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/erikdoe","download_url":"https://codeload.github.com/erikdoe/quvyn/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248299029,"owners_count":21080450,"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","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":["ava","comments","playwright","rust","vuejs"],"created_at":"2024-10-13T07:44:54.299Z","updated_at":"2025-04-10T21:22:29.964Z","avatar_url":"https://github.com/erikdoe.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# About Quvyn\n\n![Rust](https://github.com/erikdoe/quvyn/workflows/Rust/badge.svg)\n\nQuvyn is a minimal website commenting system. It doesn't have an admin UI, it doesn't support multiple sites, it \ndoesn't support load-balancing, it doesn't even use a database. But it comes as a single binary with no dependencies, \nit stores comments in the filesystem where they can be processed with lots of Unix tools, and it uses modern \ntechnologies.\n\n\n## tl;dr\n\nStep 0: Install Rust toolchain (if needed)\n\n    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n\nStep 1: Clone Quvyn repo\n\n    git clone git@github.com:erikdoe/quvyn.git \u0026\u0026 cd quvyn\n\nStep 2: Build and run Quvyn\n\n    cargo run -- --repo ./var/demo\n\nStep 3: Demo time\n\n    open http://localhost:8080/app/demo.html\n\nNow you should see a page with a working commenting system. Play around. If you like what you see, read on.\n\n\n## Installation\n\nThe Quvyn backend is written in [Rust](https://www.rust-lang.org/). So, you need the Rust toolchain to build a binary \non your system. Once you have the Rust toolchain you can build Quvyn with the Rust package manager:\n\n    cargo build --release\n\nAssuming the build succeeds, the binary can be found in `target/release/quvyn`. Copy this binary to a suitable place \non your system and set it up as a daemon process, using [supervisord](http://supervisord.org/) or \n[daemontools](https://cr.yp.to/daemontools.html) or similar.\n\n\n## Configuration\n\nThere is no configuration file and Quvyn does not read environment variables. All configuration is done via command-line\noptions:\n\n`--repo PATH`\n\nThe comments are stored as files in a directory, referred to as the repository. The location of the repository can be \nspecified with this option. Each file in the repository contains a single comment in JSON format. The filenames are\nrandom UUIDs.\n\nWhen Quvyn starts it reads all files from the repository directory and keeps them in memory. When a new comment is \nposted, the comment is saved to the filesystem immediately. This explains why Quvyn does not scale horizontally, ie. \nyou should not run multiple instances behind a load balancer.\n\n`--app PATH`\n\nQuvyn ships with a frontend written in [Vue.js](https://vuejs.org/), found in the `vue` directory in the source\ndistribution. You can use the Quvyn backend to serve its own frontend. To do so, make the directory available to the\nQuvyn backend process and use this option to set the path.\n\n**Note:** for normal use you want your website to load `quvyn.js`. You do not need the demo app or the stylesheet; both can \nserve as inspiration for how to integrate Quvyn into your own site, though. If you deploy all files a demo app is \navailable at [http://localhost:8080/app/demo.html](http://localhost:8080/app/demo.html)\n\n`--bind address`\n\nBy default Quvyn binds to port 80 on localhost. You can change this with this option. Hostname and port are separated\nby a colon, eg. _0.0.0.0:4567_.\n\n`--origin (URL|*)`\n\nQuvyn can run on a domain different from the domain of the website where the comments are displayed. In such a case you \nmust tell Quvyn to set appropriate [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) headers using this \noption. Normally, you would specify the URL of the website that displays the comments.\n\n`--notify EMAIL-ADDRESS`\n\nIf this option is set Quvyn sends an email to the specified email address every time a comment is posted. The email\ncontains the comment as JSON.\n\n**Note:** Quvyn simply uses `sendmail` to send the emails. So, please make sure that this is installed and works.\n\n\n## Importing comments \n\nQuvyn can import comments from CSV files. The file **must** have the following format:\n\n* Fields must be separated by commas (`,`).\n* Fields that contain commas or line breaks must be place in double quotes (`\"`).\n* Double quotes in the field text must be escaped using a double quote, ie. a double quote in the field text is \n  written as a double double quote (`\"\"`).\n* The first line of the file must contain a header with the field names.\n* Fields are as follows:\n\nfield (in order) | content\n-----------------|---------\ntimestamp        | String in ISO 8601 format (actually, in RFC 3339 format)\npath             | String that specifies the path of the page to which the comment belongs\nauthor_name      | Name of the author (can be empty)\nauthor_email     | Email address of the author (can be empty)\ntext             | Comment text in markdown format \n\nSuch a file can then be imported with the `--import` option. Note that you should specify the repo path, too.\n\n\n## Development\n\n### UI end-to-end tests\n\nThe UI tests use [AVA](https://github.com/avajs/ava) as a test runner and [Playwright](https://playwright.dev) for \nautomated browser testing.\n\nFor now, you have to start Quvyn manually before you run the UI tests:\n\n    cargo run -- --repo var/tests-ui\n\nThen, in a second terminal, run the tests:\n\n    npm test\n\nDon't forget to run `npm install` after checking out the code.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferikdoe%2Fquvyn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferikdoe%2Fquvyn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferikdoe%2Fquvyn/lists"}