{"id":20418267,"url":"https://github.com/askonomm/shape","last_synced_at":"2025-04-12T17:25:27.639Z","repository":{"id":182376046,"uuid":"668371746","full_name":"askonomm/shape","owner":"askonomm","description":"A composable content management system for bespoke websites.","archived":false,"fork":false,"pushed_at":"2023-08-23T20:50:44.000Z","size":1772,"stargazers_count":27,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-10T12:51:14.300Z","etag":null,"topics":["cms"],"latest_commit_sha":null,"homepage":"","language":"Clojure","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/askonomm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-07-19T16:41:17.000Z","updated_at":"2025-01-17T09:53:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"a5b792e1-43b8-4fed-aa37-7d11ff3fb4f2","html_url":"https://github.com/askonomm/shape","commit_stats":null,"previous_names":["askonomm/shape"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askonomm%2Fshape","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askonomm%2Fshape/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askonomm%2Fshape/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askonomm%2Fshape/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/askonomm","download_url":"https://codeload.github.com/askonomm/shape/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248603358,"owners_count":21131789,"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":["cms"],"created_at":"2024-11-15T06:30:52.722Z","updated_at":"2025-04-12T17:25:27.613Z","avatar_url":"https://github.com/askonomm.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"https://github.com/askonomm/shape/assets/84135165/4297d93e-9a9e-4ba5-b6aa-72d6aef35930\" width=\"80\" /\u003e\n\n# Shape CMS\n\nShape is a content management system, written in Clojure. It's target use case is bespoke websites created by developers or development agencies that value stability and ease of maintenance, while allowing the content of the site to be managed with ease by non-developers. **Currently in progress, docs will appear as things get created.**\n\n## Installation\n\n### Prerequisites\n\n- Have Clojure CLI tool installed (namely `clj` CLI tool)\n- Have Java installed\n\n### Running Shape\n\nAll you need is to execute this command in the folder where Shape's code is:\n\n```bash\nclj -X shape.core/run\n```\n\nBy running Shape the first time, it will automatically set-up the DB. Then fire up your browser and visit `localhost:3999/admin`, this should direct you to the setup page where you can create your account, after which it will redirect you to the admin panel (which is currently empty).\n\nYou can change the port that Shape is running on by setting the `PORT` environment variable.\n\n### Database configuration\n\nBy default Shape will create a SQLite database on its own when first running it, named `shape.db`, and it will live in the root directory of the site. You can however overwrite this via the `DB_URL` environment variable, which has to be a valid JDBC URL format and point to a SQLite database.\n\n### E-mail configuration\n\nFor things that require e-mail, such as the ability to reset your password, you also need to set up additional SMTP settings. There are a number of services that provide a SMTP service, such as [Mailgun]() and [Postmark](). \n\nTo set up e-mail services, you should configure the following environment variables:\n\n- `MAIL_FROM` - E-mail address that the mails are sent from (example: admin@yourwebsite.com)\n- `MAIL_HOST` - SMTP host (example: smtp.postmarkapp.com)\n- `MAIL_USER` - SMTP username\n- `MAIL_PASSWORD` - SMTP password\n- `MAIL_PORT` - SMTP port\n- `MAIL_TLS` - Set this to `true` if you want to use TSL, otherwise remove it.\n- `MAIL_SSL` - Set this to `true` if you want to use SSL, otherwise remove it.\n\n## The idea\n\nClojure is lacking a nice, composable CMS. Something that makes it easy for developers to build websites using Clojure, and non-developers to use those websites. \n\nAnd so I'm building a CMS like that. \n\nThe idea is quite simple; at the heart of it all are **Content Shapes**, which can be your information pages, blog posts, shop products, whatever it is - you can create infinite amount of these by putting together different data types and naming them (eg text for title, image for thumbnail, number for currency, etc). This lays out the data architecture of the site and is what the end-users will be creating. \n\nWhat the end-users will spend time with is **Content**, which are composed out of the **Content Shapes** you've created, allowing the user to easily manage content with different data structures from the admin panel.\n\nThen there are **Partials**, these are pure-Clojure functions in your Theme that spit out HTML (via Hiccup, I figure). This can be anything you want, and it enables the use of a DSL to fetch data from the previously mentioned **Content Shapes**. Could be a Product View, could be a Blog Post View, whatever you want, these are the building blocks of the website. \n\nAnd at last there are **Pages**. Pages are composed out of **Partials**, and they are attached to a URL. The URL could be static, like `/about`, or it could be dynamic like `/blog/{post}`. **Partials** will also have a way to tell what the `{post}` is in case of a dynamic URL, so that you could fetch the right data for your Partial. \n\nAnd that's it, pretty straight-forward and this alone should enable the creation of quite many different websites, be it a blog, an online-shop or portfolio. \n\n## Roadmap to 0.1\n\n- [x] Site setup flow\n- [x] Authentication flow\n- [x] Content Shapes implementation\n- [ ] Content creation in admin panel - **In progress**\n- [ ] Pages implementation\n- [ ] Default theme creation\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faskonomm%2Fshape","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faskonomm%2Fshape","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faskonomm%2Fshape/lists"}