{"id":29901319,"url":"https://github.com/cassiascheffer/willow_camp","last_synced_at":"2025-08-17T08:07:17.798Z","repository":{"id":307844541,"uuid":"973670295","full_name":"cassiascheffer/willow_camp","owner":"cassiascheffer","description":"⛺ A Place to Stash Your Stuff","archived":false,"fork":false,"pushed_at":"2025-08-09T20:42:19.000Z","size":857,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-09T22:15:52.890Z","etag":null,"topics":["blog","bookmarks","rss"],"latest_commit_sha":null,"homepage":"https://willow.camp","language":"Ruby","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/cassiascheffer.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}},"created_at":"2025-04-27T13:46:56.000Z","updated_at":"2025-08-09T20:41:25.000Z","dependencies_parsed_at":"2025-08-03T09:16:30.290Z","dependency_job_id":null,"html_url":"https://github.com/cassiascheffer/willow_camp","commit_stats":null,"previous_names":["cassiascheffer/willow_camp"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/cassiascheffer/willow_camp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiascheffer%2Fwillow_camp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiascheffer%2Fwillow_camp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiascheffer%2Fwillow_camp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiascheffer%2Fwillow_camp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cassiascheffer","download_url":"https://codeload.github.com/cassiascheffer/willow_camp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiascheffer%2Fwillow_camp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270820793,"owners_count":24651534,"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-08-17T02:00:09.016Z","response_time":129,"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":["blog","bookmarks","rss"],"created_at":"2025-08-01T14:37:29.144Z","updated_at":"2025-08-17T08:07:17.783Z","avatar_url":"https://github.com/cassiascheffer.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ⛺ [willow.camp](https://willow.camp)\n\n[![Status](https://img.shields.io/badge/status-page-brightgreen)](https://status.willow.camp/)\n\nA blogging platform built with Ruby on Rails. Supports subdomains, custom domains, multiple themes, and markdown posts.\n\n## Features\n\n- Blog post interface with pagination\n- DaisyUI theme picker\n- Markdown posts with YAML frontmatter\n- API for post management\n- CLI for post management (see `cli/` directory)\n\n## Development Setup\n\n### Prerequisites\n\n- Ruby 3.2.0+\n- Node.js 18+\n- PostgreSQL 14+\n- Yarn or npm\n\n### Installation\n\n1. Clone the repository:\n```bash\ngit clone https://github.com/cassiascheffer/willow_camp.git\ncd willow_camp\n```\n\n### CLI Development\n\nThe CLI is located in the `cli/` directory:\n\n```bash\ncd cli\nbundle install\nbundle exec rake test\ngem build willow_camp_cli.gemspec\n```\n\n2. Install dependencies:\n```bash\nbundle install\n```\n\n3. Setup database:\n```bash\nrails db:setup\n```\n\n4. Start development servers:\n```bash\nbin/dev\n```\n\n5. Visit http://localhost:3000\n\n### Theme Configuration\n\nThemes can be changed in the settings page. The application supports all DaisyUI themes.\n\n### Testing\n\n```bash\nrails test\n```\n\n## API Documentation\n\nThe API uses token-based authentication and returns JSON responses.\n\n### Authentication\n\nInclude a bearer token in requests:\n\n```\nAuthorization: Bearer your-api-token\n```\n\nCreate tokens in the dashboard at `/dashboard/settings`.\n\n### Endpoints\n\n#### List Posts\n\n```\nGET /api/posts\n```\n\nReturns all posts for the authenticated user.\n\n**Response:**\n```json\n{\n  \"posts\": [\n    {\n      \"id\": 1,\n      \"slug\": \"my-post\",\n      \"markdown\": \"---\\ntitle: My Post\\n---\\n# Content\"\n    }\n  ]\n}\n```\n\n#### Get a Post\n\n```\nGET /api/posts/:slug\n```\n\nReturns a specific post by slug.\n\n#### Create a Post\n\n```\nPOST /api/posts\n```\n\n**Request:**\n```json\n{\n  \"post\": {\n    \"markdown\": \"---\\ntitle: My New Post\\npublished: true\\n---\\n# Content\"\n  }\n}\n```\n\n#### Update a Post\n\n```\nPATCH /api/posts/:slug\n```\n\n**Request:**\n```json\n{\n  \"post\": {\n    \"markdown\": \"---\\ntitle: Updated Title\\n---\\n# Updated content\"\n  }\n}\n```\n\n#### Delete a Post\n\n```\nDELETE /api/posts/:slug\n```\n\nReturns 204 on success.\n\n### Error Responses\n\n- **401**: `{ \"error\": \"Unauthorized\" }`\n- **403**: `{ \"error\": \"You don't have permission to access this post\" }`\n- **404**: `{ \"error\": \"Post not found\" }`\n- **422**: `{ \"errors\": [\"Title can't be blank\"] }`\n\n### Example Usage\n\n```bash\ncurl -X POST https://willow.camp/api/posts \\\n  -H \"Authorization: Bearer your-api-token\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"post\": {\n      \"markdown\": \"---\\ntitle: API Post\\n---\\n# Hello World\"\n    }\n  }'\n```\n\n## Markdown Posts\n\nPosts use Markdown with YAML frontmatter:\n\n```yaml\n---\ntitle: My Post\ndescription: Post description\npublished: true\ndate: 2023-05-25\ntags:\n  - rails\n  - ruby\n---\n\n# Post content\n\nRegular markdown content here.\n```\n\n### Creating Posts from Files\n\n```ruby\nmarkdown_content = File.read(\"path/to/post.md\")\nauthor = User.find_by(email: \"author@example.com\")\npost = Post.from_markdown(markdown_content, author)\npost.save\n```\n\n## Deployment\n\nDeploy to any Rails hosting platform (Heroku, Fly.io, Railway).\n\n```bash\nrails assets:precompile\nrails db:migrate\n```\n\n## License\n\n**This license applies to the willow.camp software only, not to any content created using the software.**\n\n[willow.camp](https://github.com/cassiascheffer/willow_camp) by [Cassia Scheffer](https://github.com/cassiascheffer) software is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/).\n\n[![CC BY-NC-SA 4.0](https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png)](https://creativecommons.org/licenses/by-nc-sa/4.0/)\n\n**Note:** Content created by users of willow.camp (blog posts, images, etc.) remains the property of the respective content creators and is not covered by this license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcassiascheffer%2Fwillow_camp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcassiascheffer%2Fwillow_camp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcassiascheffer%2Fwillow_camp/lists"}