{"id":13777133,"url":"https://github.com/karmi/marley","last_synced_at":"2025-07-18T14:32:34.383Z","repository":{"id":445462,"uuid":"67978","full_name":"karmi/marley","owner":"karmi","description":"Minimalist blogging engine without textareas based on Markdown, Ruby, Sinatra and Git push hooks","archived":false,"fork":false,"pushed_at":"2009-11-10T12:12:28.000Z","size":925,"stargazers_count":246,"open_issues_count":2,"forks_count":41,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-02-14T20:35:24.366Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://www.restafari.org/introducing-marley.html","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/karmi.png","metadata":{"files":{"readme":"README.rdoc","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}},"created_at":"2008-10-26T13:10:08.000Z","updated_at":"2023-06-13T01:12:06.000Z","dependencies_parsed_at":"2022-07-07T23:30:41.101Z","dependency_job_id":null,"html_url":"https://github.com/karmi/marley","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/karmi%2Fmarley","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karmi%2Fmarley/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karmi%2Fmarley/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karmi%2Fmarley/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/karmi","download_url":"https://codeload.github.com/karmi/marley/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225043060,"owners_count":17411924,"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-08-03T18:00:38.171Z","updated_at":"2024-11-17T13:30:30.384Z","avatar_url":"https://github.com/karmi.png","language":"Ruby","funding_links":[],"categories":["Blogging","Ruby","Middlewares"],"sub_categories":[],"readme":"= Marley\n\n*Marley* is minimal blog engine without admin interface written in Sinatra framework (http://sinatra.rubyforge.org).\n\nIt has no admin interface for writing posts. Use your favorite text editor to edit plain-text files and synchronize them to server.\nMarley uses plain-text files for storing articles and SQLite database for storing comments (set data location in \u003ctt\u003econfig.yml\u003c/tt\u003e).\nIt comes with Rake and Capistrano tasks for installing and deploying the application, and for syncing articles from your local machine to the server.\n\nThe +master+ branch is bare application, +restafari_org+ branch is what runs @ www.restafari.org.\n\nIn case you like to use Marley, you should fork it and then make your own branch for your own styling, so you can \u003ctt\u003egit pull\u003c/tt\u003e any future updates from the master and then merge/cherry-pick them into your branch. Marley has support for themes: see +themes+ directory. Just duplicate the +default+ directory and start tweaking. Obviously, do not use the _restafari_ theme for your own blog, please.\n\n== Ingredients\n\n* Sinatra, Rack and Thin\n* ActiveRecord and SQLite\n* Akismet filtering (see \u003ctt\u003e./vendor/akismetor.rb\u003c/tt\u003e)\n* YAML configuration\n* RDiscount for Markdown --\u003e HTML conversion\n* Builder for Atom feed generation\n* Rake and Capistrano tasks\n\n== Installation and dependencies\n\nYou have to install or update following Rubygems:\n\n    $ sudo gem install sinatra rack thin activerecord sqlite3-ruby rdiscount builder capistrano\n\nEdit this configuration file:\n\n    config/config.example.yml\n\nand save it as \u003ci\u003econfig/config.yml\u003c/i\u003e.\n\nInstall the application with this Rake task:\n\n    $ rake app:install\n    \nLoad this URL in your browser:\n\n    http://localhost:4567\n\nYou're done. SRSLY.\n\n== Deployment on server\n\nEnsure that you have correct information in \u003ctt\u003econfig/config.yml\u003c/tt\u003e. Rename example deploy file to  \u003ctt\u003econfig/deploy.rb\u003c/tt\u003e and fill in proper information for: _user_, _repository_, _deploy_to_, _app_, _web_, _db_.\nThen run:\n\n* \u003ctt\u003ecap deploy:setup\u003c/tt\u003e\n* \u003ctt\u003ecap deploy:cold\u003c/tt\u003e\n\nNormal Capistrano deployment procedures apply (ie. you use \u003ctt\u003ecap deploy\u003c/tt\u003e very often).\n\nOf course, you have to ensure that there is at least some content on the server in data directory. See next section!\n\n== Synchronizing content\n\nMarley has no administrative interface for writing articles inside some silly \u003ctt\u003e\u003ctextarea\u003e\u003c/tt\u003e. It assumes you like to write in your favorite text editor, using Markdown, previewing on the fly, and just synchronize when you're ready to publish.\n  \nThere are several ways how to do that:\n\n* You can be hardcore and write articles over SSH in Vim directly on the server for \"just-in-time-publication\" when you hit \u003ctt\u003e:w\u003c/tt\u003e\n\n* You can be less glorious, of course, and save your articles to some folder on your disk and \u003ctt\u003escp\u003c/tt\u003e-ing said folder to the server. Or use SFTP? Cyberduck drag \u0026 drop? Aaargh, not reccommended unless you _really_ like to see what you're doing, in real time.\n\n* You can implement some sane practice and start versioning your writing with Git. (What else?) This way, you can setup remote repository on your server, just \u003ctt\u003epush\u003c/tt\u003e-ing changes whenever you feel like you want to say something in public. A \u003ci\u003epost-commit hook\u003c/i\u003e is completely neccessary in this case, of course. (It isn't paramount of convenience having to SSH on your server to run \u003ctt\u003egit pull origin master\u003c/tt\u003e in some folder.) See Capistrano task \u003ctt\u003ecap sync:setup:hook\u003c/tt\u003e for setting this up.\n\n* When you already use Git, you can push to Github (where else?), and have Github call Marley by it's Post-Receive Hooks (http://github.com/guides/post-receive-hooks). Github then calls Marley's \u003ctt\u003e/sync\u003c/tt\u003e and it will \u003ctt\u003egit pull\u003c/tt\u003e changes from Github. How is this authenticated? Good question. By setting up a (possibly long and secure) token in the config file. OMG! Could be overheard in the internets! If you're worried or prudent, do not use this. (See Capistrano task \u003ctt\u003ecap sync:setup:github\u003c/tt\u003e for adding remote Github repo on the server!)\n\nYou can set-up last two options by running Capistrano task \u003ctt\u003ecap sync:setup\u003c/tt\u003e. Choose whether you like to upload your local data as a Git repository to the server (and setup post-receive hook in doing so) or you want to clone data from Github repository. You should add a Post-Receive URL in your repo's administration on Github as told by the task when it has runned.\n\nOf course, put other ideas in the Marley Wiki (http://github.com/karmi/marley/wikis)\n\n== Managing spam\n\nMarley displays spam comments on the article page, by default. You can easily mark and delete spam in admin interface, when you prepend article URL with _admin_ -- as in http://localhost:4567/admin/my-slashdotted-article.html. Log in with credentials set in \u003ctt\u003econfig.yml\u003c/tt\u003e.\n\nIn addition, there are Rake and Capistrano tasks for easily destroying spam from command line or a cron job: \u003ctt\u003erake manage:spam:prune\u003c/tt\u003e and \u003ctt\u003ecap manage:spam:prune\u003c/tt\u003e. You just lose \"false positives\" this way. But there aren't much of them with Akismet.\n\n== Todo\n\n* Authenticate Github hook by HTTP-Auth, not token\n* Enable commenters edit their comments for 15 minutes after posting (based on cookie)\n* Kick Markdown formatting into a Formatter so everyone can use whatever formatter she likes\n* Kick articles extraction logic into an Interface so everyone can use whatever data store she likes, not being plain (texter) like me\n\n== Licence\n\nCopyright (c) 2008 Karel Minarik (www.karmi.cz)\n\nCode released under the MIT license, do not reuse graphical assets and styles in the \u003ci\u003erestafari_org\u003c/i\u003e branch, please\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarmi%2Fmarley","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkarmi%2Fmarley","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarmi%2Fmarley/lists"}