{"id":22293650,"url":"https://github.com/xi/pupupu","last_synced_at":"2025-03-25T22:18:22.476Z","repository":{"id":150048367,"uuid":"153948092","full_name":"xi/pupupu","owner":"xi","description":"simple static CMS for crappy servers","archived":false,"fork":false,"pushed_at":"2023-01-24T19:18:37.000Z","size":64,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-01-30T19:24:32.286Z","etag":null,"topics":["cms","static-site-generator"],"latest_commit_sha":null,"homepage":"","language":"PHP","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/xi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","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}},"created_at":"2018-10-20T21:02:45.000Z","updated_at":"2023-01-24T18:59:17.000Z","dependencies_parsed_at":"2023-07-03T20:46:52.735Z","dependency_job_id":null,"html_url":"https://github.com/xi/pupupu","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xi%2Fpupupu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xi%2Fpupupu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xi%2Fpupupu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xi%2Fpupupu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xi","download_url":"https://codeload.github.com/xi/pupupu/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245550681,"owners_count":20633883,"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","static-site-generator"],"created_at":"2024-12-03T17:30:12.790Z","updated_at":"2025-03-25T22:18:22.454Z","avatar_url":"https://github.com/xi.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pupupu - simple static CMS for crappy servers\n\n[Static website generators](https://www.staticgen.com/) are awesome because of\ntwo reasons:\n\n-   the website is fast and secure because no code is running on the server\n-   developers can use all their favourite tools (e.g. text editors or git)\n\nThe big downside is that usability for non-developers is poor because they\nusually do not know about text editors and git.\n\n[Lektor](https://www.getlektor.com/) calls itself a \"static content management\nsystem\". It is a static website generator, but it also has a web UI to edit the\nsource files. This way, it feels a lot like a CMS while maintaining most of the\nbenefits of a static website generator.\n\nUnfortunately, many hosters still only offer PHP. So Lektor, which is written\nin python, is not an option.\n\nSo here I present: A simple static CMS for crappy servers!\n\n## Quickstart\n\n-   Get the latest zip file from \u003chttps://github.com/xi/pupupu/releases\u003e\n-   Unpack to your webserver\n-   Create your templates in a folder called `_templates/`. For starters, you\n    can copy an example theme from `pupupu/themes/`. Don't forget to add some\n    CSS!\n-   Open `https://yourdomain.com/pupupu/` in a browser\n-   Start creating your content!\n\n## Documentation\n\n### Folder Structure\n\nThe following files and folders are relevant for your project:\n\n-   `/pupupu/` - UI for editing\n-   `/_templates/` - template files\n-   `/_templates/default.html` - default template\n-   `/_content/` - source files\n-   `/_content/_site.yml` - contains site-wide config\n-   `/_content/_users.yml` - password hashes\n-   `/files/` - uploaded files\n\n### Content\n\nFor each page, there is a corresponding yaml and markdown file in `/_content/`.\nThe template can be defined in the yaml file using the `_template` key. If none\nis specified, `default.html` is used.\n\nEach time a page is saved in the UI, it automatically regenerated. If the site\nconfig is saved, all pages are regenerated. If a page uses the API to include\ncontent from other pages, you can add it to `_dynamic` in the site config to\nregenerate it each time any page is saved.\n\n#### Files and Folders\n\nMost pages will be represented as a folder containing the files `index.yml` and\n`index.md`. This will generated a folder containing `index.html`. Browsers can\nskip the `index.html` part, resulting in nice URLs.\n\nStill, there are some cases where you need to control the file name. For this\nreason, a different pattern is used if the page name contains a dot: If you\ncreate a page called \"feed.xml\", the corresponding files are called\n`feed.xml.yml` and `feed.xml.md` and will generate `feed.xml`. (Pages that have\na dot in their name can consequently not have subpages.)\n\n### Templates\n\n[Twig](https://twig.symfony.com/) is used as templating system. The following\nvariables are available in a template:\n\n-   `path` - path to current page\n-   `page` - the data from the page's yaml file\n-   `body` - the contents of the page's markdown file\n-   `site` - the data from `/_content/_site.yml\n-   `pupupu` - an interface through which you can access arbitrary data (useful\n    for feeds or index pages). Please refer to the source code for a list of\n    methods.\n\nThere are also some special filters available:\n\n-   `md` - render markdown using [PHP Markdown\n    Extra](https://michelf.ca/projects/php-markdown/extra/)\n-   `shift_headings` - useful to fit user-generated content into the document\n    outline\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxi%2Fpupupu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxi%2Fpupupu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxi%2Fpupupu/lists"}