{"result":{"depiction_url":null,"edges":{"haspart":{"objects":[{"created":"2026-10-07T11:13:47Z","object_id":{"id":2912,"is_a":["collection"],"name":"developer_collection_getting_started","title":{"_type":"trans","tr":{"en":"Getting started"}},"uri":"https:\/\/zotonic.com\/id\/2912"},"seq":1},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2918,"is_a":["collection"],"name":"developer_collection_applications","title":{"_type":"trans","tr":{"en":"Understanding Zotonic applications"}},"uri":"https:\/\/zotonic.com\/id\/2918"},"seq":2},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2928,"is_a":["collection"],"name":"developer_collection_command_line_workflows","title":{"_type":"trans","tr":{"en":"Working from the command line"}},"uri":"https:\/\/zotonic.com\/id\/2928"},"seq":3},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2939,"is_a":["collection"],"name":"developer_collection_templates","title":{"_type":"trans","tr":{"en":"Templates and page rendering"}},"uri":"https:\/\/zotonic.com\/id\/2939"},"seq":4},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2948,"is_a":["collection"],"name":"developer_collection_content_data","title":{"_type":"trans","tr":{"en":"Content and data"}},"uri":"https:\/\/zotonic.com\/id\/2948"},"seq":5},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2958,"is_a":["collection"],"name":"developer_collection_reusable_functionality","title":{"_type":"trans","tr":{"en":"Building reusable functionality"}},"uri":"https:\/\/zotonic.com\/id\/2958"},"seq":6},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2964,"is_a":["collection"],"name":"developer_collection_browser_apis","title":{"_type":"trans","tr":{"en":"Browser interaction and APIs"}},"uri":"https:\/\/zotonic.com\/id\/2964"},"seq":7},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2968,"is_a":["collection"],"name":"developer_collection_development_tools","title":{"_type":"trans","tr":{"en":"Development tools and debugging"}},"uri":"https:\/\/zotonic.com\/id\/2968"},"seq":8},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2982,"is_a":["collection"],"name":"developer_collection_testing","title":{"_type":"trans","tr":{"en":"Testing and maintaining applications"}},"uri":"https:\/\/zotonic.com\/id\/2982"},"seq":9},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2989,"is_a":["collection"],"name":"developer_collection_configuration_deployment","title":{"_type":"trans","tr":{"en":"Configuration and deployment"}},"uri":"https:\/\/zotonic.com\/id\/2989"},"seq":10},{"created":"2026-10-07T11:13:47Z","object_id":{"id":2996,"is_a":["collection"],"name":"developer_collection_troubleshooting","title":{"_type":"trans","tr":{"en":"Troubleshooting"}},"uri":"https:\/\/zotonic.com\/id\/2996"},"seq":11},{"created":"2026-10-07T11:13:47Z","object_id":{"id":1547,"is_a":["text","documentation","reference"],"name":"doc_reference_cli_index","title":{"_type":"trans","tr":{"en":"Command-line reference"}},"uri":"https:\/\/zotonic.com\/id\/1547"},"seq":12},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1636,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_introduction","title":{"_type":"trans","tr":{"en":"Introduction"}},"uri":"https:\/\/zotonic.com\/id\/1636"},"seq":13},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1526,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_getting_started","title":{"_type":"trans","tr":{"en":"Set up a local development environment"}},"uri":"https:\/\/zotonic.com\/id\/1526"},"seq":14},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1411,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_docker","title":{"_type":"trans","tr":{"en":"Install with Docker or Podman"}},"uri":"https:\/\/zotonic.com\/id\/1411"},"seq":15},{"created":"2020-05-30T10:07:03Z","object_id":{"id":2176,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_directory_structure","title":{"_type":"trans","tr":{"en":"The Zotonic workspace"}},"uri":"https:\/\/zotonic.com\/id\/2176"},"seq":16},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1527,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_sites","title":{"_type":"trans","tr":{"en":"Create your first site"}},"uri":"https:\/\/zotonic.com\/id\/1527"},"seq":17},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1528,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_status_site","title":{"_type":"trans","tr":{"en":"Find the status site and your site&#39;s admin"}},"uri":"https:\/\/zotonic.com\/id\/1528"},"seq":18},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1540,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_controllers","title":{"_type":"trans","tr":{"en":"Add an HTTP controller"}},"uri":"https:\/\/zotonic.com\/id\/1540"},"seq":19},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1541,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_dispatch_rules","title":{"_type":"trans","tr":{"en":"Follow a request to its template"}},"uri":"https:\/\/zotonic.com\/id\/1541"},"seq":20},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1276,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_resources","title":{"_type":"trans","tr":{"en":"Use stable resource names"}},"uri":"https:\/\/zotonic.com\/id\/1276"},"seq":21},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1352,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_templates","title":{"_type":"trans","tr":{"en":"Create a page layout"}},"uri":"https:\/\/zotonic.com\/id\/1352"},"seq":22},{"created":"2024-05-21T10:22:23Z","object_id":{"id":2410,"is_a":["text","documentation","developerguide"],"name":null,"title":{"_type":"trans","tr":{"en":"CSS classes used in templates"}},"uri":"https:\/\/zotonic.com\/id\/2410"},"seq":23},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1280,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_media","title":{"_type":"trans","tr":{"en":"Render and manage media"}},"uri":"https:\/\/zotonic.com\/id\/1280"},"seq":24},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1637,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_icons","title":{"_type":"trans","tr":{"en":"Build and serve frontend assets"}},"uri":"https:\/\/zotonic.com\/id\/1637"},"seq":25},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1419,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_forms_and_validation","title":{"_type":"trans","tr":{"en":"Validate a form on both sides"}},"uri":"https:\/\/zotonic.com\/id\/1419"},"seq":26},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1638,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_search","title":{"_type":"trans","tr":{"en":"Search"}},"uri":"https:\/\/zotonic.com\/id\/1638"},"seq":27},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1409,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_translation","title":{"_type":"trans","tr":{"en":"Translate interface text"}},"uri":"https:\/\/zotonic.com\/id\/1409"},"seq":28},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1539,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_wires","title":{"_type":"trans","tr":{"en":"Handle a browser event with a wire"}},"uri":"https:\/\/zotonic.com\/id\/1539"},"seq":29},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1536,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_access_control","title":{"_type":"trans","tr":{"en":"Keep permission checks at the boundary"}},"uri":"https:\/\/zotonic.com\/id\/1536"},"seq":30},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1353,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_modules","title":{"_type":"trans","tr":{"en":"Create a reusable module"}},"uri":"https:\/\/zotonic.com\/id\/1353"},"seq":31},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1274,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_notifications","title":{"_type":"trans","tr":{"en":"Respond to a notification"}},"uri":"https:\/\/zotonic.com\/id\/1274"},"seq":32},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1302,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_server_browser_interaction","title":{"_type":"trans","tr":{"en":"Handle a browser event with a wire"}},"uri":"https:\/\/zotonic.com\/id\/1302"},"seq":33},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1552,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_email","title":{"_type":"trans","tr":{"en":"Configure outbound email and verify delivery"}},"uri":"https:\/\/zotonic.com\/id\/1552"},"seq":34},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1639,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_shell","title":{"_type":"trans","tr":{"en":"Connect to the running Erlang shell"}},"uri":"https:\/\/zotonic.com\/id\/1639"},"seq":35},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1640,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_logging","title":{"_type":"trans","tr":{"en":"Write logs that explain an operation"}},"uri":"https:\/\/zotonic.com\/id\/1640"},"seq":36},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1546,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_testing","title":{"_type":"trans","tr":{"en":"Choose checks for a change"}},"uri":"https:\/\/zotonic.com\/id\/1546"},"seq":37},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1641,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_deployment_index","title":{"_type":"trans","tr":{"en":"Installation and deployment"}},"uri":"https:\/\/zotonic.com\/id\/1641"},"seq":38},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1529,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_troubleshooting","title":{"_type":"trans","tr":{"en":"A site does not start"}},"uri":"https:\/\/zotonic.com\/id\/1529"},"seq":39},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1642,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_contributing","title":{"_type":"trans","tr":{"en":"Contribute a Zotonic change"}},"uri":"https:\/\/zotonic.com\/id\/1642"},"seq":40},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1643,"is_a":["text","documentation"],"name":"doc_releasenotes_index","title":"Release Notes","uri":"https:\/\/zotonic.com\/id\/1643"},"seq":41},{"created":"2020-05-30T05:47:29Z","object_id":{"id":1455,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_upgrading","title":{"_type":"trans","tr":{"en":"Upgrade notes"}},"uri":"https:\/\/zotonic.com\/id\/1455"},"seq":42}],"predicate":{"id":310,"is_a":["meta","predicate"],"name":"haspart","title":{"_type":"trans","tr":{"en":"Contains"}},"uri":"http:\/\/purl.org\/dc\/terms\/hasPart"}},"relation":{"objects":[{"created":"2026-10-07T11:13:48Z","object_id":{"id":3047,"is_a":["collection"],"name":"admin_guide","title":{"_type":"trans","tr":{"en":"Site administration"}},"uri":"https:\/\/zotonic.com\/id\/3047"},"seq":1}],"predicate":{"id":303,"is_a":["meta","predicate"],"name":"relation","title":{"_type":"trans","tr":{"nl":"Relatie","en":"Relation"}},"uri":"http:\/\/purl.org\/dc\/terms\/relation"}},"subject":{"objects":[{"created":"2026-10-07T11:13:48Z","object_id":{"id":2556,"is_a":["categorization","keyword","keyword_information_type"],"name":"zotonic_topic_explanation","title":"Explanation","uri":"https:\/\/zotonic.com\/id\/2556"},"seq":1},{"created":"2026-10-07T11:13:48Z","object_id":{"id":2564,"is_a":["categorization","keyword","keyword_audience"],"name":"zotonic_topic_backend_developer","title":"Backend developer","uri":"https:\/\/zotonic.com\/id\/2564"},"seq":2},{"created":"2026-10-07T11:13:48Z","object_id":{"id":2605,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_site_management","title":"Site management","uri":"https:\/\/zotonic.com\/id\/2605"},"seq":3}],"predicate":{"id":308,"is_a":["meta","predicate"],"name":"subject","title":{"_type":"trans","tr":{"en":"Keyword"}},"uri":"http:\/\/purl.org\/dc\/elements\/1.1\/subject"}}},"id":1635,"is_a":["text","documentation","developerguide"],"links":[{"rel":"self","target":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1635"},{"rel":"hub","target":"https:\/\/zotonic.com\/.zotonic\/websub"}],"medium":null,"medium_url":null,"name":"doc_developerguide_index","page_url":{"en":"https:\/\/zotonic.com\/developer-guide","x-default":"https:\/\/zotonic.com\/developer-guide"},"preview_url":null,"resource":{"version":85,"pivot_location_lat":null,"title":{"_type":"trans","tr":{"en":"Developer guide"}},"is_authoritative":true,"body":{"_type":"trans","tr":{"en":"<p>Build a Zotonic site, understand its applications, and use the development tools to check your work. These guides use a local example site named <code>garden<\/code>. Replace that name with your own site when following a task.<\/p>\n<p>Use <strong>Erlang\/OTP 28<\/strong>, the recommended Erlang version for these guides.<\/p>\n<p>Start with Getting started for a first working page. Use Understanding Zotonic applications to find where a change belongs. The command-line and development tools collections help you inspect the running system. The reference collection lists every bundled CLI command in the checked source revision.<\/p>"}},"slug":"developer-guide","is_protected":false,"visible_for":0,"tz":"UTC","language":["en"],"is_featured":false,"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"},"category_id":{"id":317,"is_a":["meta","category"],"name":"developerguide","title":"Developer guide","uri":"https:\/\/zotonic.com\/id\/developerguide"},"publication_start":"2022-02-15T10:01:31Z","is_website_redirect":false,"page_path":"\/developer-guide","github_url":"https:\/\/github.com\/zotonic\/zotonic\/tree\/master\/doc\/developer-guide\/index.rst","pivot_location_lng":null,"name":"doc_developerguide_index","is_unfindable":false,"is_published":true,"doc_editorial_edges":{"haspart":[1547,2912,2918,2928,2939,2948,2958,2964,2968,2982,2989,2996],"relation":[3047],"subject":[2556,2564,2605]},"summary":{"_type":"trans","tr":{"en":"Build, inspect, and maintain Zotonic sites and modules."}},"pivot_geocode":null,"custom_slug":false,"created":"2020-05-30T05:47:29Z","uri":null,"is_dependent":false,"is_page_path_multiple":false,"publication_end":"9999-08-17T12:00:00Z","modifier_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"privacy":0,"doc_editorial_bundle":true,"creator_id":{"id":336,"is_a":["person","robot"],"name":"gitbot","title":"Git","uri":"https:\/\/zotonic.com\/id\/336"},"seo_noindex":false,"modified":"2026-10-07T11:14:00Z","title_slug":{"_type":"trans","tr":{"en":"developer-guide"}}},"uri":"https:\/\/zotonic.com\/id\/1635","uri_template":"https:\/\/zotonic.com\/id\/:id","websub":{"hub":"https:\/\/zotonic.com\/.zotonic\/websub","topic":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1635"}},"status":"ok"}