{"result":{"depiction_url":null,"edges":{},"id":1642,"is_a":["text","documentation","developerguide"],"links":[{"rel":"self","target":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1642"},{"rel":"hub","target":"https:\/\/zotonic.com\/.zotonic\/websub"}],"medium":null,"medium_url":null,"name":"doc_developerguide_contributing","page_url":{"en":"https:\/\/zotonic.com\/docs\/1642\/contributing-to-zotonic","x-default":"https:\/\/zotonic.com\/docs\/1642\/contributing-to-zotonic"},"preview_url":null,"resource":{"body":"<div>\n            \n  <div class=\"section\">\n\n<p>We encourage contributions to Zotonic from the community! This chapter describes\nhow you can help improve Zotonic.<\/p>\n<ol class=\"arabic\">\n<li><p class=\"first\">Fork the <code class=\"docutils literal notranslate\"><span class=\"pre\">zotonic<\/span><\/code> repository on Github (at <a class=\"reference external\" href=\"https:\/\/github.com\/zotonic\/zotonic\">https:\/\/github.com\/zotonic\/zotonic<\/a>).<\/p>\n<\/li>\n<li><p class=\"first\">Clone your fork or add the remote if you already have a clone of\nthe repository:<\/p>\n<div class=\"highlight-erlang notranslate\"><div class=\"highlight\"><pre><span><\/span><span class=\"n\">git<\/span> <span class=\"n\">clone<\/span> <span class=\"n\">git<\/span><span class=\"p\">@<\/span><span class=\"n\">github<\/span><span class=\"p\">.<\/span><span class=\"nn\">com<\/span><span class=\"p\">:<\/span><span class=\"n\">yourusername<\/span><span class=\"o\">\/<\/span><span class=\"n\">zotonic<\/span><span class=\"p\">.<\/span><span class=\"n\">git<\/span>\n<\/pre><\/div>\n<\/div>\n<p>or:<\/p>\n<div class=\"highlight-erlang notranslate\"><div class=\"highlight\"><pre><span><\/span><span class=\"n\">git<\/span> <span class=\"n\">remote<\/span> <span class=\"n\">add<\/span> <span class=\"n\">mine<\/span> <span class=\"n\">git<\/span><span class=\"p\">@<\/span><span class=\"n\">github<\/span><span class=\"p\">.<\/span><span class=\"nn\">com<\/span><span class=\"p\">:<\/span><span class=\"n\">yourusername<\/span><span class=\"o\">\/<\/span><span class=\"n\">zotonic<\/span><span class=\"p\">.<\/span><span class=\"n\">git<\/span>\n<\/pre><\/div>\n<\/div>\n<\/li>\n<li><p class=\"first\">Create a topic branch for your change:<\/p>\n<div class=\"highlight-erlang notranslate\"><div class=\"highlight\"><pre><span><\/span><span class=\"n\">git<\/span> <span class=\"n\">checkout<\/span> <span class=\"o\">-<\/span><span class=\"n\">b<\/span> <span class=\"n\">some<\/span><span class=\"o\">-<\/span><span class=\"n\">topic<\/span><span class=\"o\">-<\/span><span class=\"n\">branch<\/span>\n<\/pre><\/div>\n<\/div>\n<\/li>\n<li><p class=\"first\">Make your change and commit. Use a clear and descriptive commit\nmessage, spanning multiple lines if detailed explanation is needed.<\/p>\n<\/li>\n<li><p class=\"first\">Push to your fork of the repository and then send a pull-request\nthrough Github:<\/p>\n<div class=\"highlight-erlang notranslate\"><div class=\"highlight\"><pre><span><\/span><span class=\"n\">git<\/span> <span class=\"n\">push<\/span> <span class=\"n\">mine<\/span> <span class=\"n\">some<\/span><span class=\"o\">-<\/span><span class=\"n\">topic<\/span><span class=\"o\">-<\/span><span class=\"n\">branch<\/span>\n<\/pre><\/div>\n<\/div>\n<\/li>\n<li><p class=\"first\">A Zotonic committer will review your patch and merge it into the\nmain repository or send you feedback. The pull request page on\ngithub is the main place to discuss the code and related topics.<\/p>\n<\/li>\n<\/ol>\n<div class=\"section\">\n<a name=\"dev-codingstyle\"><\/a><h2>Coding standards<\/h2>\n<p>The Zotonic code follows <a class=\"reference external\" href=\"https:\/\/github.com\/inaka\/erlang_guidelines\">Inaka’s Erlang Coding Guidelines<\/a>. This is enforced\nusing the <a class=\"reference external\" href=\"https:\/\/github.com\/inaka\/elvis\">Elvis<\/a> code checking tool. You can check the code locally with:<\/p>\n<div class=\"highlight-bash notranslate\"><div class=\"highlight\"><pre><span><\/span>$ elvis rock\n<\/pre><\/div>\n<\/div>\n<p>When contributing, simply try to follow the coding style as you find it in the\nexisting code.<\/p>\n<div class=\"section\">\n<h3>Emacs<\/h3>\n<p>Provided with the Zotonic distribution is a Zotonic template mode,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">zotonic-tpl-mode<\/span><\/code>, which supports the Zotonic flavor of Django.\nIt is located in the <code class=\"file docutils literal notranslate\"><span class=\"pre\">priv\/emacs\/zotonic-tpl-mode.el<\/span><\/code> file, and\nmay be installed in emacs by adding something like this to your <cite>.emacs<\/cite>\nfile:<\/p>\n<div class=\"highlight-common-lisp notranslate\"><div class=\"highlight\"><pre><span><\/span><span class=\"p\">(<\/span><span class=\"nv\">add-to-list<\/span> <span class=\"ss\">&#39;load-path<\/span> <span class=\"s\">&quot;...\/path\/to\/zotonic\/priv\/emacs&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">(<\/span><span class=\"nb\">require<\/span> <span class=\"ss\">&#39;zotonic-tpl-mode<\/span><span class=\"p\">)<\/span>\n<span class=\"c1\">;; optional, for associating .tpl files with zotonic-tpl-mode<\/span>\n<span class=\"p\">(<\/span><span class=\"nv\">add-to-list<\/span> <span class=\"ss\">&#39;auto-mode-alist<\/span> <span class=\"o\">&#39;<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;\\\\.tpl$&quot;<\/span> <span class=\"o\">.<\/span> <span class=\"nv\">zotonic-tpl-mode<\/span><span class=\"p\">))<\/span>\n<\/pre><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"section\">\n<h2>Writing commit messages<\/h2>\n<p>The Zotonic commit convention are slightly based on <a class=\"reference external\" href=\"https:\/\/github.com\/basho\/rebar\">rebar’s README<\/a>.<\/p>\n<p>Structure your commit message like this:<\/p>\n<div class=\"highlight-none notranslate\"><div class=\"highlight\"><pre><span><\/span>prefix: One line summary (less than 50 characters)\n\nLonger description, multiline text that is supposed to wrap at 72\ncharacters.\n\nFixes #403\n<\/pre><\/div>\n<\/div>\n<ul class=\"simple\">\n<li><strong>Prefix<\/strong>: Every commit message must start with one of the designated commit\nprefixes:<\/li>\n<\/ul>\n\n<p><ul class=\"simple\">\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">mod_foobar:<\/span><\/code> Changes that are related to a single module should\nbe prefixed with the module name.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">doc:<\/span><\/code> For changes to the documentation, everything below doc\/<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">scripts:<\/span><\/code> for changes to the <code class=\"docutils literal notranslate\"><span class=\"pre\">zotonic<\/span><\/code> command and its helper scripts.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">build:<\/span><\/code> for the build system and related changes.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">tests:<\/span><\/code> for unit tests and the testsandbox.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">skel:<\/span><\/code> for the skeleton sites.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">zotonic_status:<\/span><\/code> for the default site.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">translation:<\/span><\/code> for new\/updated translations.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">core:<\/span><\/code> For changes in the <cite>apps\/zotonic_core<\/cite> directory; i.e., anything\nnot covered by another tag.<\/li>\n<\/ul>\n<\/p>\n<ul class=\"simple\">\n<li>The <strong>summary<\/strong> should be less than 50 characters, and tell what was\nchanged. Use the imperative present tense (fix, add, change). For\nexample: <cite>Add ‘foobar’ filter<\/cite>, <cite>Fix bug in media upload service<\/cite>.<\/li>\n<li>The <strong>description<\/strong> should explain the intention and implementation\nof your approach, in the present tense.<\/li>\n<li>Optionally, when your commit <strong>fixes<\/strong> a bug on github, add <cite>Fixes\n#1545<\/cite> on a separate line below the description.<\/li>\n<\/ul>\n<p>Notice the empty line preceding the longer description and the “Fixes” tag.<\/p>\n<\/div>\n<div class=\"section\">\n<h2>Git best practices<\/h2>\n<ul class=\"simple\">\n<li>Please maintain commit atomicity by breaking up logical changes into\nseparate commits; e.g., do not commit unrelated fixes into a single\ncommit.<\/li>\n<li>Make whitespace changes separately.<\/li>\n<li>When updating from the Zotonic source, please use <code class=\"docutils literal notranslate\"><span class=\"pre\">git<\/span> <span class=\"pre\">pull<\/span>\n<span class=\"pre\">--rebase<\/span><\/code> to prevent unnecessary merge commits.<\/li>\n<li>Generally, try to <a class=\"reference external\" href=\"http:\/\/blog.8thlight.com\/kevin-liddle\/2012\/09\/27\/mind-your-git-manners.html\">Mind your Git Manners<\/a>.<\/li>\n<\/ul>\n<\/div>\n<div class=\"section\">\n<h2>The CONTRIBUTORS file<\/h2>\n<p>When this is your first contribution to Zotonic, you are welcome to\nadd your name and e-mail address to the CONTRIBUTORS file in the root\nof the project. Please keep the file alphabetically ordered.<\/p>\n<\/div>\n<div class=\"section\">\n<h2>Running the tests<\/h2>\n<p>Zotonic comes with a basic test suite which can be run the following way:<\/p>\n<div class=\"highlight-bash notranslate\"><div class=\"highlight\"><pre><span><\/span>zotonic runtests\n<\/pre><\/div>\n<\/div>\n<p>This starts the Zotonic system and executes all EUnit tests. It will\ndisable all zotonic sites except for the special site <code class=\"docutils literal notranslate\"><span class=\"pre\">testsandbox<\/span><\/code>,\nwhich will be enabled.<\/p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">testsandbox<\/span><\/code> site does not have a database configuration and is\nconfigured to run on <code class=\"docutils literal notranslate\"><span class=\"pre\">localhost:8040<\/span><\/code>.<\/p>\n<\/div>\n<div class=\"section\">\n<h2>Contributing documentation<\/h2>\n<div class=\"section\">\n<h3>Build the documentation<\/h3>\n<p>First, install <a class=\"reference external\" href=\"http:\/\/www.sphinx-doc.org\/en\/stable\/install.html\">Sphinx<\/a>.\nTo build the documentation, Erlang must be installed.<\/p>\n<div class=\"highlight-bash notranslate\"><div class=\"highlight\"><pre><span><\/span>$ <span class=\"nb\">cd<\/span> doc\/\n\n<span class=\"c1\"># Install dependencies<\/span>\n$ pip install -r requirements.txt\n\n<span class=\"c1\"># Generate meta-*.rst files:<\/span>\n$ make stubs\n\n<span class=\"c1\"># Then generate HTML files:<\/span>\n$ make html\n<\/pre><\/div>\n<\/div>\n<p>Then view the HTML files in <code class=\"docutils literal notranslate\"><span class=\"pre\">doc\/_build\/html\/index.html<\/span><\/code>.<\/p>\n<\/div>\n<div class=\"section\">\n<h3>Heading styles<\/h3>\n<p>Use the following <a class=\"reference external\" href=\"http:\/\/www.sphinx-doc.org\/en\/stable\/rest.html#sections\">convention<\/a>\nfor headings:<\/p>\n<div class=\"highlight-rst notranslate\"><div class=\"highlight\"><pre><span><\/span><span class=\"gh\">First-level heading<\/span>\n<span class=\"gh\">===================<\/span>\n\n<span class=\"gh\">Second-level heading<\/span>\n<span class=\"gh\">--------------------<\/span>\n\n<span class=\"gh\">Third-level heading<\/span>\n<span class=\"gh\">^^^^^^^^^^^^^^^^^^^<\/span>\n\n<span class=\"gh\">Fourth-level heading<\/span>\n<span class=\"gh\">&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;<\/span>\n<\/pre><\/div>\n<\/div>\n<p>When writing documentation of modules, actions, etc.; anything under\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ref\/<\/span><\/code>; the first level heading is already there for you, generated\nin the <code class=\"docutils literal notranslate\"><span class=\"pre\">meta-*.rst<\/span><\/code> file. So you should only use <code class=\"docutils literal notranslate\"><span class=\"pre\">----------<\/span><\/code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">..........<\/span><\/code> for the headings in the <code class=\"docutils literal notranslate\"><span class=\"pre\">ref\/<\/span><\/code> files.<\/p>\n<p>When using Emacs, this little snippet helps with adding underlines to\nheadings:<\/p>\n<div class=\"highlight-common-lisp notranslate\"><div class=\"highlight\"><pre><span><\/span><span class=\"p\">(<\/span><span class=\"nb\">defun<\/span> <span class=\"nv\">underline-with-char<\/span> <span class=\"p\">(<\/span><span class=\"nb\">char<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">(<\/span><span class=\"nv\">interactive<\/span> <span class=\"p\">(<\/span><span class=\"nb\">list<\/span> <span class=\"p\">(<\/span><span class=\"nv\">read-from-minibuffer<\/span> <span class=\"s\">&quot;Char: &quot;<\/span><span class=\"p\">)))<\/span>\n  <span class=\"p\">(<\/span><span class=\"nb\">when<\/span> <span class=\"p\">(<\/span><span class=\"nb\">=<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">(<\/span><span class=\"nb\">length<\/span> <span class=\"nb\">char<\/span><span class=\"p\">))<\/span>\n    <span class=\"p\">(<\/span><span class=\"nb\">error<\/span> <span class=\"s\">&quot;Need a character&quot;<\/span><span class=\"p\">))<\/span>\n  <span class=\"p\">(<\/span><span class=\"k\">setq<\/span> <span class=\"nb\">char<\/span> <span class=\"p\">(<\/span><span class=\"nb\">aref<\/span> <span class=\"nb\">char<\/span> <span class=\"mi\">0<\/span><span class=\"p\">))<\/span>             <span class=\"c1\">; Ignore everything but the first char.<\/span>\n  <span class=\"p\">(<\/span><span class=\"nv\">save-excursion<\/span>\n    <span class=\"p\">(<\/span><span class=\"nv\">goto-char<\/span> <span class=\"p\">(<\/span><span class=\"nv\">point-at-eol<\/span><span class=\"p\">))<\/span>\n    <span class=\"p\">(<\/span><span class=\"nv\">insert<\/span> <span class=\"s\">&quot;\\n&quot;<\/span>\n            <span class=\"p\">(<\/span><span class=\"nb\">make-string<\/span> <span class=\"p\">(<\/span><span class=\"nb\">-<\/span> <span class=\"p\">(<\/span><span class=\"nv\">point-at-eol<\/span><span class=\"p\">)<\/span>\n                            <span class=\"p\">(<\/span><span class=\"nv\">point-at-bol<\/span><span class=\"p\">))<\/span>\n                         <span class=\"nb\">char<\/span><span class=\"p\">))))<\/span>\n<\/pre><\/div>\n<\/div>\n<p>From a mailing list <a class=\"reference external\" href=\"http:\/\/lists.gnu.org\/archive\/html\/help-gnu-emacs\/2008-05\/msg00305.html\">post<\/a>.<\/p>\n<\/div>\n<div class=\"section\">\n<h3>References<\/h3>\n<p>Be generous with using references (<code class=\"docutils literal notranslate\"><span class=\"pre\">:ref:`pagelabel`<\/span><\/code>) in your\nwriting. The more terms are linked to their respective documentation\npages, the better. Only make the first occurrence of a term a\nreference to its page, though; consequent occurrences can be made\n<code class=\"docutils literal notranslate\"><span class=\"pre\">`italic`<\/span><\/code>.<\/p>\n<p>Add a <code class=\"docutils literal notranslate\"><span class=\"pre\">..<\/span> <span class=\"pre\">seealso::<\/span><\/code> section at the top to highlight any other\npages which are closely related to the current one, for example:<\/p>\n<div class=\"highlight-erlang notranslate\"><div class=\"highlight\"><pre><span><\/span><span class=\"p\">..<\/span> <span class=\"n\">code<\/span><span class=\"o\">-<\/span><span class=\"nn\">block<\/span><span class=\"p\">::<\/span> <span class=\"n\">none<\/span>\n<\/pre><\/div>\n<\/div>\n\n<p><aside class=\"admonition seealso\">\nSee also\n<a class=\"reference internal\" href=\"#dev-contributing\"><span class=\"std std-ref\">Contributing to Zotonic<\/span><\/a>\n<\/aside>\n<\/p>\n<\/div>\n<div class=\"section\">\n<h3>Table styles<\/h3>\n<p>For the easy editing of tables, we use Emacs’ <a class=\"reference external\" href=\"http:\/\/emacswiki.org\/emacs\/TableMode\">table-mode<\/a>, which at first has a bit of\na learning curve but actually works pretty well when creating the\nascii-art tables that the RST format requires you to use.<\/p>\n<p>In general, we use this style of table:<\/p>\n<div class=\"highlight-erlang notranslate\"><div class=\"highlight\"><pre><span><\/span><span class=\"o\">+--------------------+-------------------+<\/span>\n<span class=\"p\">|<\/span> <span class=\"nv\">Header<\/span>             <span class=\"p\">|<\/span><span class=\"nv\">Other<\/span> <span class=\"n\">header<\/span>       <span class=\"p\">|<\/span>\n<span class=\"o\">+====================+===================+<\/span>\n<span class=\"p\">|<\/span><span class=\"nv\">This<\/span> <span class=\"n\">is<\/span> <span class=\"n\">the<\/span> <span class=\"n\">table<\/span>   <span class=\"p\">|<\/span><span class=\"nv\">Some<\/span> <span class=\"n\">more<\/span> <span class=\"n\">contents<\/span> <span class=\"p\">|<\/span>\n<span class=\"p\">|<\/span><span class=\"n\">cell<\/span> <span class=\"n\">contents<\/span>       <span class=\"p\">|<\/span>                   <span class=\"p\">|<\/span>\n<span class=\"o\">+--------------------+-------------------+<\/span>\n<\/pre><\/div>\n<\/div>\n<div class=\"section\">\n<h4>Writing consistent Cookbook items<\/h4>\n<p>A Zotonic Cookbook item is a single-concept solution to a well-defined\nproblem, living in the <a class=\"reference internal\" href=\"\/id\/doc_cookbook_index#guide-cookbook\"><span class=\"std std-ref\">Cookbooks<\/span><\/a> section of the\ndocumentation.<\/p>\n<p>Useful items range from the simplest content management tasks to\ntechnically sophisticated module development and site administration\nsolutions. This means that items are welcomed from noobies and wizards\nalike.<\/p>\n<p>Whenever you struggle to find a solution to a specific problem, fail\nto find a Cookbook item that addresses it, and work through the\nsolution with a final “Aha!,” you have the raw material for an\nexcellent Cookbook submission.<\/p>\n<p>A well-written item has four sections:<\/p>\n<p><strong>WHY<\/strong>: What problem does this Cookbook item solve? What benefits\ndoes it deliver?<\/p>\n<p>Four major reasons for submitting Cookbook items are:<\/p>\n<ol class=\"arabic simple\">\n<li>The best way to learn is to teach<\/li>\n<li>Your Cookbook items documents your efforts; helps you remember what\nyou did next time you encounter a similar problem<\/li>\n<li>Each item makes it that much easier for noobies and other community\nmembers to advance their Zotonic skills.<\/li>\n<\/ol>\n<p><strong>ASSUMPTIONS<\/strong>: What does this item assume about operating\nsystem, Linux distribution, programming skills, knowledge of Zotonic\narchitecture and conventions etc.<\/p>\n<p><strong>HOW<\/strong>: Step-by-step instructions for implementing your solution.<\/p>\n<p>Don’t take user competency for granted. When you specify a command,\nnote what user name you’re working under and what directory you are\nworking in.  Respect the noobies by including steps that may be\nobvious to you but not so obvious to folks with less experience.<\/p>\n<p>Think of your instructions as a check-list. A noobie should be able to\nachieve success by reading, implementing and checking off each\ninstruction. Keep your instructions simple, complete, and clear.<\/p>\n<p>Recruit a noobie to try out your solution. Fix the stumbling blocks\ns\/he encounters. If you can’t find a noobie, put yourself in noobie\nmind. Remember, you too once were one.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"section\">\n<a name=\"releases\"><\/a><h2>Zotonic releases<\/h2>\n<aside class=\"admonition seealso\">\n<p class=\"first admonition-title\">See also<\/p>\n<p class=\"last\"><a class=\"reference external\" href=\"https:\/\/github.com\/zotonic\/zotonic\/releases\">GitHub<\/a> for the latest\nrelease.<\/p>\n<\/aside>\n<div class=\"section\">\n<h3>Release dates<\/h3>\n<p>Zotonic follows a time-based release model. Every first Monday of the month – at\nthe call of the <a class=\"reference external\" href=\"http:\/\/www.invadingholland.com\/guides-to-holland\/emergency-alarm\">Dutch test siren<\/a> – a new Zotonic version is released. Version\nnumbers are incremented according to the <a class=\"reference external\" href=\"http:\/\/semver.org\/\">Semantic versioning<\/a> specification.<\/p>\n<\/div>\n<div class=\"section\">\n<h3>Release schedule<\/h3>\n<p>Preparation for each release lasts one month:<\/p>\n<ol class=\"arabic simple\">\n<li><strong>Development phase<\/strong>: new features are added and existing ones improved.\nCommits take place on the current <code class=\"docutils literal notranslate\"><span class=\"pre\">.x<\/span><\/code> development branch (for instance,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">0.x<\/span><\/code>).<\/li>\n<li><strong>Stabilisation phase<\/strong>: five working days before a release, we create a\nrelease branch from the development branch, incrementing the minor version\nnumber (for instance, <code class=\"docutils literal notranslate\"><span class=\"pre\">release-0.16.0<\/span><\/code>). During the stabilisation phase, no\nnew features are added. Instead, the last bug fixes for the release are\ncommitted.<\/li>\n<li>On the first Monday of each month, the release branch is <strong>tagged<\/strong>\n(for instance, <code class=\"docutils literal notranslate\"><span class=\"pre\">0.16.0<\/span><\/code>), merged back into the development branch and then\ndiscarded.<\/li>\n<\/ol>\n<\/div>\n<div class=\"section\">\n<h3>Hotfix releases<\/h3>\n<p>Some bug fixes, such as security fixes, need to be made available immediately.\nIn case a change cannot wait for the next monthly release, we release it as a\nhotfix, incrementing the patch number (for instance, <code class=\"docutils literal notranslate\"><span class=\"pre\">0.16.1<\/span><\/code>).<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n           <\/div>","category_id":{"id":317,"is_a":["meta","category"],"name":"developerguide","title":"Developer guide","uri":"https:\/\/zotonic.com\/id\/developerguide"},"content_group_id":{"id":339,"is_a":["meta","content_group"],"name":"default_content_group","title":{"_type":"trans","tr":{"en":"Default Content Group"}},"uri":"https:\/\/zotonic.com\/id\/default_content_group"},"created":"2020-05-30T05:47:29Z","creator_id":{"id":336,"is_a":["person","robot"],"name":"gitbot","title":"Git","uri":"https:\/\/zotonic.com\/id\/336"},"github_url":"https:\/\/github.com\/zotonic\/zotonic\/tree\/master\/doc\/developer-guide\/contributing.rst","is_authoritative":true,"is_dependent":false,"is_featured":false,"is_protected":false,"is_published":true,"is_unfindable":false,"language":["en"],"modified":"2022-02-15T10:01:38Z","modifier_id":{"id":336,"is_a":["person","robot"],"name":"gitbot","title":"Git","uri":"https:\/\/zotonic.com\/id\/336"},"name":"doc_developerguide_contributing","pivot_geocode":null,"pivot_location_lat":null,"pivot_location_lng":null,"privacy":0,"publication_end":"9999-06-01T00:00:00Z","publication_start":"2022-02-15T10:01:38Z","slug":"contributing-to-zotonic","title":"Contributing to Zotonic","title_slug":"contributing-to-zotonic","tz":"UTC","uri":null,"version":18,"visible_for":0},"uri":"https:\/\/zotonic.com\/id\/1642","uri_template":"https:\/\/zotonic.com\/id\/:id","websub":{"hub":"https:\/\/zotonic.com\/.zotonic\/websub","topic":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1642"}},"status":"ok"}