{"id":15831683,"url":"https://github.com/cleverdevil/dwell","last_synced_at":"2025-07-08T04:33:44.778Z","repository":{"id":215536413,"uuid":"739186448","full_name":"cleverdevil/dwell","owner":"cleverdevil","description":"CMS for creating personal websites for the IndieWeb, powered by DuckDB and JSON","archived":false,"fork":false,"pushed_at":"2025-03-15T23:32:01.000Z","size":6060,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-25T07:42:56.510Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","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/cleverdevil.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":"2024-01-05T01:10:55.000Z","updated_at":"2025-03-15T23:32:04.000Z","dependencies_parsed_at":"2024-10-26T16:55:21.735Z","dependency_job_id":"d6d4e75d-66be-41cb-ba05-0dea39b12631","html_url":"https://github.com/cleverdevil/dwell","commit_stats":{"total_commits":20,"total_committers":1,"mean_commits":20.0,"dds":0.0,"last_synced_commit":"af196c9ecf42da970c0592c8221f5f9f3adb6e6a"},"previous_names":["cleverdevil/dwell"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cleverdevil%2Fdwell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cleverdevil%2Fdwell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cleverdevil%2Fdwell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cleverdevil%2Fdwell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cleverdevil","download_url":"https://codeload.github.com/cleverdevil/dwell/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246635403,"owners_count":20809325,"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":[],"created_at":"2024-10-05T12:06:02.235Z","updated_at":"2025-04-01T11:42:35.920Z","avatar_url":"https://github.com/cleverdevil.png","language":"HTML","readme":"# Dwell: An IndieWeb CMS for Personal Websites\n\nDwell is a simple CMS for creating your own\n[indieweb](https://indieweb.org \"IndieWeb\") website, including support\nfor [micropub](https://www.w3.org/TR/micropub/ \"Micropub\"),\n[indieauth](https://indieweb.org/IndieAuth \"IndieAuth\"), and\n[webmention](https://www.w3.org/TR/webmention/ \"Webmention\"). Dwell\nwas created to power the personal site of\n[cleverdevil](https://cleverdevil.io \"Jonathan LaCour\"), which currently\nruns the [known](https://github.com/idno/known \"Known\") content\nmanagement system. Under the hood, Dwell is built in the\n[python](https://python.org \"Python\") programming language, and uses\n[duckdb](https://duckdb.org \"DuckDB\") for its query engine, though all\ncontent is stored on-disk as `JSON` files contained within a\n[hive](https://duckdb.org/docs/data/partitioning/hive_partitioning.html \"Hive\")\npartitioned directory structure.\n\n## Why?\n\nFor many years, I have had my own site. In fact, my current website\nincludes a massive [archive](https://cleverdevil.io/archive \"archive\")\nall of my content starting from 2002! I have even migrated all of the\ncontent I posted on Instagram, Twitter, and Facebook before I left those\nsilos entirely after they became cesspools of misinformation and\nsurveillance capitalism owned and operated by billionaires with values\nthat do not align with my own.\n\nMy current site runs on [known](https://github.com/idno/known \"Known\"),\nwhich has served me well. While I am able to write PHP, it is absolutely not my\nlanguage of choice or expertise. In addition, I would like to make my site more\nlightweight, with as few dependencies as possible, and no need for complex\nrelational databases.\n\nWhy not use something like WordPress? Yes, WordPress has the benefit of\na massive community, but is essentially a giant pile of legacy. I have a\nlot of experience with that community, and I think its lovely, but isn’t\nreally focused on what I care about, and has all of the same complexity\nissues as Known, with the downside of being an absolute security\nnightmare.\n\nWhy not a static site generator? I considered it, but I like the ability\nto create extremely dynamic pages. With DuckDB, I get all of the\nbenefits of a relational database with none of the operational pain.\n\nLastly, because its fun. I love working on my site!\n\n## Technical Details\n\nContent is stored on disk as JSON files in a directory structure that is\npartitioned based upon date, as follows:\n\n    content/\n        year=2023/\n            month=11/\n                day=12/\n                    post-uuid.json\n\nDwell uses the aforementioned DuckDB to make the entire content\ndirectory queryable with SQL, without the need to run a separate,\nheavyweight database server. Very large sites with tens of thousands of\nposts can be completely indexed by Dwell in a matter of a few seconds.\nThe complete content is stored in a table called `raw_content` within\nthe `content.db` database, and a convenience view called `content` is\ncreated which makes the data easier to interact with.\n\n## Status\n\nThis is early. Very early. The first focus has been proving out the data\nstorage, indexing, and querying mechanism using DuckDB. Below is a list\n(that is likely incomplete) of features, including what is done, and\nwhat is in-progress.\n\n- [x] Consume and index a hive-partitioned directory of MF2 JSON\n- [x] Storage and index support for post kinds\n  - [x] Blog\n  - [x] Status\n  - [x] Bookmark\n  - [x] Watch\n  - [x] Play\n  - [x] Reply\n  - [x] Photo\n  - [x] Checkin\n  - [x] Listen\n  - [x] Recipe\n  - [x] Review\n  - [x] RSVP\n- [x] Query for posts\n  - [x] Get by post id\n  - [x] Query by date range and post kind\n  - [x] Ordering, limit, and offset\n- [x] Micropub support\n  - [x] Create content\n    - [x] MF2 JSON\n    - [x] Form encoded\n    - [x] Multipart form\n  - [x] Update content\n  - [x] Delete content\n  - [x] Undelete content\n  - [x] Media endpoint\n  - [ ] Syndication\n    - [ ] Mastodon\n    - [ ] Bluesky\n- [ ] IndieAuth support\n    - [x] Token database\n    - [x] Password configuration\n    - [x] Micropub endpoint enforcement\n    - [x] User-facing auth flow\n    - [ ] User-facing auth flow beautification\n    - [ ] Separate IndieAuth code\n- [ ] Webmention\n- [ ] Move all post kinds to plugins, other than Blog, Status, and Photo\n- [ ] Website views\n  - [x] Home stream\n  - [x] Custom streams\n  - [x] Monthly summaries\n  - [x] On this day\n  - [x] Photos page\n  - [ ] Static pages\n  - [x] Profile\n  - [x] Archive\n  - [x] Now\n  - [x] Overview\n  - [ ] Make all streams and post kinds use proper microformats\n- [ ] Forms for authenticated users to create all “kinds” of content\n- [x] Fixing ingestion for specific types and content that is missed\n  - [x] Recipe\n  - [x] Like / Repost kind\n  - [x] Interactions (likes, primarily)\n\nAt first, I will entirely focus on getting my own website fully\nfunctional on-top of Dwell, to enable me to migrate off of Known, but I am\nactively seeking collaborators that are interested in a shared codebase for\nbuilding our own sites.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcleverdevil%2Fdwell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcleverdevil%2Fdwell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcleverdevil%2Fdwell/lists"}