{"result":{"depiction_url":null,"edges":{"observes":{"objects":[{"created":"2026-09-09T13:47:45Z","object_id":{"id":1442,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_request_context","title":"observe_request_context\/3","uri":"https:\/\/zotonic.com\/id\/1442"},"seq":1},{"created":"2026-09-09T13:47:45Z","object_id":{"id":1466,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_admin_menu","title":"observe_admin_menu\/3","uri":"https:\/\/zotonic.com\/id\/1466"},"seq":2},{"created":"2026-09-09T13:47:45Z","object_id":{"id":1628,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_filewatcher","title":"observe_filewatcher\/2","uri":"https:\/\/zotonic.com\/id\/1628"},"seq":3},{"created":"2026-09-09T13:47:45Z","object_id":{"id":2067,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_debug","title":"observe_debug\/2","uri":"https:\/\/zotonic.com\/id\/2067"},"seq":4},{"created":"2026-09-09T13:47:45Z","object_id":{"id":2538,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_development_reload","title":"observe_development_reload\/2","uri":"https:\/\/zotonic.com\/id\/2538"},"seq":5},{"created":"2026-09-09T13:47:45Z","object_id":{"id":2540,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_development_make","title":"observe_development_make\/2","uri":"https:\/\/zotonic.com\/id\/2540"},"seq":6}],"predicate":{"id":2550,"is_a":["meta","predicate"],"name":"observes","title":{"_type":"trans","tr":{"en":"Observes"}},"uri":"https:\/\/zotonic.com\/id\/observes"}},"references":{"objects":[{"created":"2020-05-30T05:47:25Z","object_id":{"id":1372,"is_a":["text","documentation","reference","template_tag"],"name":"doc_template_tag_tag_lib","title":"lib","uri":"https:\/\/zotonic.com\/id\/1372"},"seq":1000000}],"predicate":{"id":332,"is_a":["meta","predicate"],"name":"references","title":{"_type":"trans","tr":{"en":"References"}},"uri":"https:\/\/zotonic.com\/id\/references"}},"refers":{"objects":[{"created":"2026-10-19T08:47:58Z","object_id":{"id":3091,"is_a":["media","image"],"name":"doc_image_6ccc09c5be119fcf53dd08a0c356769161634f71efb014945cf00a35ef4e7e35","title":"The Development page with settings, source editor, template and dispatch debugging, introspection, and function call tracing.","uri":"https:\/\/zotonic.com\/id\/3091"},"seq":1000000}],"predicate":{"id":2409,"is_a":["meta","predicate"],"name":"refers","title":{"_type":"trans","tr":{"en":"Refers"}},"uri":"https:\/\/zotonic.com\/id\/refers"}},"subject":{"objects":[{"created":"2026-09-09T13:47:45Z","object_id":{"id":2555,"is_a":["categorization","keyword","keyword_information_type"],"name":"zotonic_topic_reference","title":"Reference","uri":"https:\/\/zotonic.com\/id\/2555"},"seq":1},{"created":"2026-09-09T13:47:45Z","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-09-09T13:47:45Z","object_id":{"id":2613,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_development_and_debugging","title":"Development and debugging","uri":"https:\/\/zotonic.com\/id\/2613"},"seq":3},{"created":"2026-09-09T13:47:45Z","object_id":{"id":2635,"is_a":["categorization","keyword","keyword_architecture"],"name":"zotonic_topic_module","title":"Module","uri":"https:\/\/zotonic.com\/id\/2635"},"seq":4},{"created":"2026-09-09T13:47:45Z","object_id":{"id":2636,"is_a":["categorization","keyword","keyword_task"],"name":"zotonic_topic_configure","title":"Configure","uri":"https:\/\/zotonic.com\/id\/2636"},"seq":5},{"created":"2026-09-09T13:47:45Z","object_id":{"id":2657,"is_a":["categorization","keyword","keyword_task"],"name":"zotonic_topic_monitor","title":"Monitor","uri":"https:\/\/zotonic.com\/id\/2657"},"seq":6}],"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":1457,"is_a":["text","documentation","reference","module"],"links":[{"rel":"self","target":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1457"},{"rel":"hub","target":"https:\/\/zotonic.com\/.zotonic\/websub"}],"medium":null,"medium_url":null,"name":"doc_module_mod_development","page_url":{"en":"https:\/\/zotonic.com\/docs\/1457\/mod_development","x-default":"https:\/\/zotonic.com\/docs\/1457\/mod_development"},"preview_url":null,"resource":{"version":4098,"pivot_location_lat":null,"title":"mod_development","is_authoritative":true,"body":"<p>Presents various tools for development.<\/p>\n<p>After the development module is enabled a menu item System &gt; Development is added in the admin.<\/p>\n<p>On the development page it is possible to set debugging options, trace template compilation, and test dispatch rules.<\/p>\n<!-- z-media 3091 {\"alt\":\"The Development page with settings, source editor, template and dispatch debugging, introspection, and function call tracing.\",\"caption\":\"-\",\"size\":\"large\"} -->\n<h2>Debug Options<\/h2>\n<p>The settings column contains these development options:<\/p>\n<ul><li><p><strong>Show paths to included template files.<\/strong> Add comments to generated templates\nshowing the exact file included at each point.<\/p><\/li><li><p><strong>Show defined blocks.<\/strong> Add comments marking the start and end of each\n<code>{% block %} ... {% endblock %}<\/code> in generated templates.<\/p><\/li><li><p><strong>Always hide the floating template trace button.<\/strong> Hide the button in every\nenvironment. This takes precedence over the option to show it on production\nand acceptance sites.<\/p><\/li><li><p><strong>Allow to show the floating template trace button on production and acceptance\nsites.<\/strong> Make the button available outside development and test environments.\nIt is still shown only to users with permission to use <code>mod_development<\/code>, and\nnot on the development tools&#39; own pages. In development and test it is\navailable by default unless explicitly hidden.<\/p><\/li><li><p><strong>Download CSS and JavaScript as separate files.<\/strong> Generate separate <code>&lt;link&gt;<\/code>\nand <code>&lt;script&gt;<\/code> tags for the files in a <code>{% lib %}<\/code> tag. This makes debugging\neasier, but increases the number of requests needed to load a page.<\/p><\/li><li><p><strong>Live reload of changed CSS files. Reload page on change of templates or\nJavaScript.<\/strong> Update styles in the browser when CSS changes, and reload the\npage when a template or JavaScript file changes. Enabling this checkbox also\nenables downloading CSS and JavaScript as separate files. The development\ntools&#39; own pages do not automatically reload on template or JavaScript changes.<\/p><\/li><li><p><strong>Disable caching by the <code>{% cache %}<\/code> tag.<\/strong> Bypass template cache blocks\nwhile checking changes. This does not disable other caches, such as browser\ncaching or application data caches.<\/p><\/li><li><p><strong>Trace all database queries for the current session.<\/strong> Enable database query\ntracing for requests in your session. This checkbox requires\n<code>mod_server_storage<\/code>. Turn it off after investigating.<\/p><\/li><li><p><strong>Enable API to recompile and build Zotonic.<\/strong> Enable the development APIs,\nincluding <code>\/api\/model\/development\/get\/recompile<\/code> for compilation and\n<code>\/api\/model\/development\/get\/flush<\/code> for flushing caches. These APIs do not\nrequire authentication when enabled; use this option only on trusted\ndevelopment installations.<\/p><\/li><li><p><strong>Show server log in the browser console.<\/strong> Start forwarding server logs to\nthe current browser tab&#39;s developer console. Stopping it stops console logging\nfor all connected logging tabs on the site. This option requires <code>mod_logging<\/code> and permission\nto receive client logs. In development, the checkbox is replaced by a notice:\nadmin pages show these logs automatically, and site pages can opt in with the\n<code>environment-development<\/code> class on their <code>&lt;html&gt;<\/code> element.<\/p><\/li><\/ul>\n<h2>Open source file in editor<\/h2>\n<p>The second settings column configures opening templates in a source editor.\nThis is either done by running a command to open a file, or by opening a\nbrowser URL. The editor can be chosen explicitly or detected automatically.<\/p>\n<p>The local editor choice is stored in <code>config.d\/zotonic-editor.config<\/code> under the\nnode configuration directory and shared by development sites and shell helpers.\nBrowser URL preferences and host-path mappings remain browser\/site-specific.\nChoosing automatic detection clears the explicit machine choice. Detection\nuses trusted node configuration, ZOTONIC_EDITOR\/VISUAL\/EDITOR, inherited editor\nsessions, file associations, running editors and installed launchers, in that\norder. Ambiguous detection requires a choice. Local browser-triggered launches\nrequire the development environment and the mod_development permission.<\/p>\n<p>Containers only launch through browser URLs. Configure a browser editor preset\nor custom URL and map the container source root to the host checkout root.\nSublime and Vim URLs need an installed host-side protocol handler.<\/p>\n<p>In the Erlang shell use <code>z:edit(mod_foobar)<\/code>, <code>z:edit(mod_foobar, function_name)<\/code>,\n<code>z:edit(StackTrace)<\/code> or <code>z:edit(&lt;&lt;&quot;path\/to\/template.tpl&quot;&gt;&gt;, 42)<\/code>. Library and\ntemplate names are resolved across running sites; ambiguous names require a\nfull path.<\/p>\n<p>A trusted zotonic configuration <code>development_editor<\/code> can contain an executable and\nargument list, for example:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-erlang\">{&quot;code&quot;, [&quot;--reuse-window&quot;, &quot;--goto&quot;, &quot;{file}:{line}:{column}&quot;]}\n<\/code><\/pre>\n<p>Set the zotonic configuration <code>development_editor_browser_only<\/code> to true to\nforce browser launches on a remote host or a container that cannot be detected\nautomatically.<\/p>\n<h3>Node configuration<\/h3>\n<p>These settings belong to the global <code>zotonic<\/code> configuration,\n(so not to a site&#39;s configuration or the module configuration):<\/p>\n<table class=\"table\"><thead><tr><th>Setting<\/th><th>Default<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><code>development_editor<\/code><\/td><td><code>undefined<\/code><\/td><td>Trusted <code>{Executable, Args}<\/code> command. When set, takes precedence over editor environment variables during automatic detection.<\/td><\/tr><tr><td><code>development_editor_id<\/code><\/td><td><code>&lt;&lt;&quot;auto&quot;&gt;&gt;<\/code><\/td><td>Saved candidate ID. An explicit ID overrides automatic selection; an unavailable choice is reported instead of silently falling back.<\/td><\/tr><tr><td><code>development_editor_browser_only<\/code><\/td><td><code>false<\/code><\/td><td>Disables local discovery and launching, including shell helpers. Containers enforce this behavior regardless of the setting.<\/td><\/tr><\/tbody><\/table>\n<p>For example, a node configuration fragment can contain:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-erlang\">[{zotonic, [\n    {development_editor, {&quot;code&quot;, [&quot;--reuse-window&quot;, &quot;--goto&quot;, &quot;{file}:{line}:{column}&quot;]}}\n]}].\n<\/code><\/pre>\n<p>The executable can be a name on PATH or an absolute path. Executable paths and\narguments accept strings or UTF-8 binaries. Each list element is one argument;\npaths with spaces do not need embedded shell quotes. <code>{file}<\/code>, <code>{line}<\/code> and\n<code>{column}<\/code> are replaced within arguments, with positions starting at 1. When no\nargument contains <code>{file}<\/code>, the filename is appended. Commands are executed\nwithout a shell: shell variables, pipelines and command substitutions are not\nexpanded. Terminal editors need a supported remote client or session.<\/p>\n<p>Choose the local editor in Admin &gt; Development to save <code>development_editor_id<\/code>\nin <code>config.d\/zotonic-editor.config<\/code>. The choice applies immediately and is loaded\nagain on restart. Automatic detection saves <code>&lt;&lt;&quot;auto&quot;&gt;&gt;<\/code>; it does not remove a\ncustom <code>development_editor<\/code> command. Avoid defining the saved ID in multiple\nconfiguration files. Use <code>z_config_files:config_dir()<\/code> in the Erlang shell to\nfind the node configuration directory; deployments can override it with\n<code>ZOTONIC_CONFIG_DIR<\/code>. The generated file stores only the candidate ID.<\/p>\n<p>Browser URL presets, custom URLs and source-root mappings are stored separately\nin the browser for the site. They are not node configuration settings. In Docker,\nmap the source path inside the container to the corresponding checkout on the\nhost and install any required URL handler on that host. Shell helpers cannot\nopen the browser on the user&#39;s machine and return <code>{error, browser_only}<\/code>.<\/p>\n<h2>Language server (LSP) integration<\/h2>\n<p>The template language server provides editor support for <code>.tpl<\/code> files using a\nrunning site&#39;s module and template indexes. It complements an Erlang language\nserver; it does not provide language services for <code>.erl<\/code> files.<\/p>\n<p>Supported features include:<\/p>\n<ul><li>Syntax diagnostics for unsaved templates, without compiling or rendering them.<\/li><li>Go to definition for literal template references, <code>extends<\/code> and <code>overrules<\/code>,\nincluding the next template in module priority order and symlinked sources.<\/li><li>Definitions for filters, models, scomps, actions and literal delegates at\ntheir <code>event\/2<\/code> handler.<\/li><li>Hover information showing the reference type, site and matching source files,\nwith symlinks resolved. Markdown formatting is used when the editor requests\nit; plain text remains available.<\/li><li>Completion of template names, filters, models and built-in and custom tags.<\/li><\/ul>\n<p>Category includes list candidate templates: selecting the effective template\nrequires a resource\/category context. Formatting, rename and workspace\nreferences are not currently supported.<\/p>\n<h3>Model path completion<\/h3>\n<p>Completion after a model name follows literal <code>m_get\/3<\/code> path patterns and simple\nliteral alternatives in guards. Bracket expressions such as <code>m.rsc[id].title<\/code>\nare treated as arguments without evaluating them. Suggestions also include common\nand computed resource properties, request keys from <code>m_req<\/code>, declared module\nconfiguration keys, and system keys from <code>z_config<\/code>. Configuration values are\nnever fetched. Predicate names are suggested only with an explicitly selected site.<\/p>\n<p>Static descriptions are cached by the loaded module checksum and refreshed after\ncode reload. Models with dynamic paths or returned maps can supplement inferred\npaths with a <code>model_paths<\/code> attribute. Use binary keys and <code>any<\/code> for an argument:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-erlang\">-model_paths([\n    #{path =&gt; [&lt;&lt;&quot;result&quot;&gt;&gt;, any, &lt;&lt;&quot;title&quot;&gt;&gt;],\n      description =&gt; &lt;&lt;&quot;Title of the selected result.&quot;&gt;&gt;}\n]).\n<\/code><\/pre>\n<p>This describes <code>m.example.result[id].title<\/code>. Metadata describes names and optional\nplain-text documentation only; the language server never calls <code>m_get\/3<\/code> to\nprobe a path. Arbitrary helper calls, runtime map fields and resource-specific\ncustom properties are not inferred. Missing debug information falls back to the\navailable source file; paths without either source are omitted.<\/p>\n<h3>Start and select a site<\/h3>\n<p>Compile and start Zotonic, and enable <code>mod_development<\/code> on the desired site.\nConfigure the editor to start this stdio command:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-sh\">\/absolute\/path\/to\/zotonic\/bin\/zotonic-lsp\n<\/code><\/pre>\n<p>This launcher requires Python 3 on the editor host. It probes the local node\nfirst, then checks running Docker containers and infers source path mappings\nfrom bind mounts. Multiple matching containers require an explicit\n<code>--container NAME<\/code>. Discovery runs only at startup; the launcher replaces\nitself with the selected process and adds no ongoing proxy. Use\n<code>bin\/zotonic lsp<\/code> directly to skip discovery and connect to the local node.<\/p>\n<p>Semantic lookups use the selected site when one is configured. Otherwise,\nfilters, models and delegates are resolved across running development sites.\nTemplate references first use sites containing the current file; if no target\nis found, other running development sites are tried. Matching source locations\nand template priority orders are accepted without selecting a site. Conflicting\ntargets still require an explicit choice. Completion combines suggestions from\ncandidate sites, and syntax diagnostics do not require a site selection.<\/p>\n<h3>Editor setup<\/h3>\n<p>The VS Code client is in\n<code>apps\/zotonic_mod_development\/priv\/editors\/vscode<\/code>. Run <code>npm ci<\/code> there and load\nit with VS Code&#39;s <code>--extensionDevelopmentPath<\/code> option, or package and install\nit as a VSIX. Configure automatic runtime selection with:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-json\">{\n    &quot;zotonic.command&quot;: &quot;\/absolute\/path\/to\/zotonic\/bin\/zotonic-lsp&quot;,\n    &quot;zotonic.args&quot;: [],\n    &quot;zotonic.site&quot;: &quot;mysite&quot;\n}\n<\/code><\/pre>\n<p>Use <strong>Zotonic: Select Site<\/strong> or the status-bar item to save a site choice in the\nworkspace. <strong>Zotonic: Restart Language Server<\/strong> reconnects after a node restart.\nThe extension runs only in trusted workspaces.<\/p>\n<p>For Sublime Text, install the <strong>LSP<\/strong> package and copy the supplied\n<code>apps\/zotonic_mod_development\/priv\/editors\/sublime\/Zotonic.sublime-syntax<\/code> into <code>Packages\/User<\/code>. Configure the\nserver with <code>command<\/code> set to <code>[&quot;\/absolute\/path\/to\/zotonic\/bin\/zotonic-lsp&quot;]<\/code>,\n<code>selector<\/code> set to <code>text.html.zotonic<\/code>, and the desired site in\n<code>initialization_options.site<\/code> and <code>settings.zotonic.site<\/code>. An example server\nconfiguration is included beside the syntax file.<\/p>\n<p>The transport connects through the existing Erlang cookie and node environment;\nit is a trusted developer tool, not an HTTP API. For containers, the editor\ncontinues editing host files while the language server runs inside the\ncontainer. Explicit <code>pathMappings<\/code> can handle source mounts that cannot be\ninferred automatically. LSP settings belong to the editor workspace, separately\nfrom the source-editor launch settings on the admin page.<\/p>\n<p>See the <a href=\"https:\/\/github.com\/zotonic\/zotonic\/blob\/master\/doc\/technotes\/language-server.md\">language-server setup guide<\/a>\nfor complete editor configurations, Docker commands, path mappings, protocol\nlimits and verification instructions.<\/p>\n<h2>Template debugging<\/h2>\n<p>The template selection mechanism is quite complicated. It takes into account all modules, their priority, the user-agent\nclass (desktop, tablet, phone or text) and optionally the category of a resource.<\/p>\n<p>With this debugging tool you can optionally select a category, and fill in the name of the template. Per user-agent\nclass the selected template will be shown.<\/p>\n<p>The second debug option is a page with a live display of all templates being compiled. With this it is possible to get\ngreater insight in the template selection and compilation.<\/p>\n<h2>Dispatch rule debugging<\/h2>\n<p>With this it is possible to see for a request path which dispatch rules are matched and\/or how it is rewritten.<\/p>\n<h2>Function call tracing<\/h2>\n<p>The function tracing tool allows you to trace calls to a specific function in a module. You can specify the module name,\nfunction name and the number of calls to trace. The output will be sent to the page that started the trace, via MQTT.<\/p>\n<p>Function tracing can be enabled or disabled in the zotonic.config file. Per default it is enabled for the\ndevelopment and test environments. You can enable it runtime using:<\/p>\n<pre><code>bin\/zotonic setconfig zotonic function_tracing_enabled true\n<\/code><\/pre>\n<p>Or disable it with:<\/p>\n<pre><code>bin\/zotonic setconfig zotonic function_tracing_enabled false\n<\/code><\/pre>\n<p>In dispatch rules it is possible to protect certain requests from being traced. This is done by adding the\ndispatch rule option <code>sensitive<\/code>. This option is set for the authentication requests. On development\nenvironments this dispatch option is ignored.<\/p>\n<h2>Automatic recompilation<\/h2>\n<div class=\"admonition note\"><p class=\"first admonition-title\">Note<\/p><p class=\"last\">The system can only scan for changed files if either <code>inotify-tools<\/code> or <code>fswatch<\/code> is installed.<\/p><\/div>\n<p>The core Zotonic system starts either <code>inotify-tools<\/code> or <code>fswatch<\/code>, depending on which one is available. You have to\ninstall one of these to enable auto-compile and auto-load of changed files.<\/p>\n<p>See below for platform-specific installation instructions.<\/p>\n<p>If a changed file is detected then Zotonic will:<\/p>\n<ul><li>If an .erl file changes then the file is recompiled.<\/li><li>If a .scss or .sass file changes then <code>sassc<\/code> is called to compile it to its .css equivalent. If the changed <code>.sass<\/code> file starts with a <code>_<\/code> then all <code>.sass<\/code> files without a <code>_<\/code> will be compiled.<\/li><li>If a .less file changes then <code>lessc<\/code> is called to compile it to its .css equivalent.<\/li><li>If a .coffee file changes then <code>coffee<\/code> is called to compile it to its .js equivalent.<\/li><li>If a lib file changes then the module indexer will be called so that any removed or added templates will be handled correctly.<\/li><li>If a template file changes then the module indexer will be called so that any removed or added template will be handled correctly.<\/li><li>If a dispatch file changes then all dispatch rules are reloaded.<\/li><li>If a beam file changes then the module will be loaded. If the beam file is a Zotonic module then it will be automatically restarted if either the function exports or the <code>mod_schema<\/code> changed.<\/li><li>If the .yrl definition of the template parser changes, then the .erl version of the parser is regenerated. (This will trigger a compile, which triggers a beam load).<\/li><\/ul>\n<h3>Linux installation<\/h3>\n<p>On Linux this feature depends on the inotifywait tool, which is part of the <code>inotify-tools<\/code> package. For displaying\nnotifications, it uses <code>notify-send<\/code>:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-erlang\">sudo apt-get install inotify-tools libnotify-bin\n<\/code><\/pre>\n<h3>macOS installation<\/h3>\n<p>On macOS we use the external programs <code>fswatch<\/code> and <code>terminal-notifier<\/code>:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-erlang\">sudo brew install fswatch\nsudo brew install terminal-notifier\n<\/code><\/pre>\n<h2>Accepted Events<\/h2>\n<p>This module handles the following notifier callbacks:<\/p>\n<ul><li><code>observe_admin_menu<\/code>: Add development\/debug entries to the admin menu.<\/li><li><code>observe_filewatcher<\/code>: Catch filewatcher file change events, reloads css or the open pages using <code>m_config:get_value<\/code>.<\/li><li><code>observe_request_context<\/code>: Copy the database trace flag to a new (fresh) request process using <code>z_development_dbtrace:copy_from_session<\/code>.<\/li><\/ul>\n<p>Delegate callbacks:<\/p>\n<ul><li><code>event\/2<\/code> with <code>postback<\/code> messages: <code>log_client_enable<\/code>, <code>template_debug_enable<\/code>, <code>template_graph<\/code>, <code>template_trace_fetch<\/code>, <code>template_trace_path<\/code>, <code>template_trace_start<\/code>, <code>template_trace_stop<\/code>, <code>template_view<\/code>, <code>template_xref_check<\/code>.<\/li><li><code>event\/2<\/code> with <code>submit<\/code> messages: <code>function_trace<\/code>.<\/li><\/ul>","slug":"mod_development","doc_module_config":[{"default":"false","description":"Enable live reloading of CSS, JS and templates in the browser. This requires the mod_livereload module to be loaded.","has_default":true,"key":"livereload","module":"mod_development","type":"boolean"},{"default":"false","description":"Enable debugging of template includes, this will add markers for all template includes in rendered templates.","has_default":true,"key":"debug_includes","module":"mod_development","type":"boolean"},{"default":"false","description":"Enable debugging of template blocks, this will add markers for all template blocks in rendered templates.","has_default":true,"key":"debug_blocks","module":"mod_development","type":"boolean"},{"default":"false","description":"If set, then the button to show a template trace is never shown.","has_default":true,"key":"hide_trace_button","module":"mod_development","type":"boolean"},{"default":"false","description":"If set, then the button to show a template trace can be shown on acceptance and production.","has_default":true,"key":"trace_button","module":"mod_development","type":"boolean"},{"default":"false","description":"Enable the APIs for mod_development, this allows the unauthenticated use of the development APIs.","has_default":true,"key":"enable_api","module":"mod_development","type":"boolean"},{"default":"false","description":"If set, then separate script and style tags are generated for all css and js files.","has_default":true,"key":"libsep","module":"mod_development","type":"boolean"},{"default":"false","description":"If set, disable caching by the &lt;tt&gt;{% cache %}&lt;\/tt&gt; tag.","has_default":true,"key":"nocache","module":"mod_development","type":"boolean"}],"is_protected":false,"visible_for":0,"tz":"UTC","language":["en"],"doc_source_hash":"acb1c1b07ea795d9d9a4a01cc903fcd8b63e163a3d7da48717393b84a1d26d33","is_featured":false,"content_group_id":{"id":2551,"is_a":["meta","content_group"],"name":"content_group_imported_docs","title":"Imported documentation","uri":"https:\/\/zotonic.com\/id\/content_group_imported_docs"},"category_id":{"id":320,"is_a":["meta","category"],"name":"module","title":"Modules","uri":"https:\/\/test.zotonic.com\/id\/320"},"doc_source_path":"apps\/zotonic_mod_development\/src\/mod_development.erl","publication_start":"2023-06-24T08:18:02Z","github_url":"https:\/\/github.com\/zotonic\/zotonic\/blob\/master\/apps\/zotonic_mod_development\/src\/mod_development.erl","pivot_location_lng":null,"doc_source_kind":"module","name":"doc_module_mod_development","is_unfindable":false,"is_published":true,"pivot_geocode":null,"created":"2020-05-30T05:47:22Z","uri":null,"doc_status":"current","is_dependent":false,"erlang_app":"zotonic_mod_development","publication_end":"9999-06-01T00:00:00Z","modifier_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"privacy":0,"doc_source_commit":"24c4cc246487bd1a1d6108e2b090920c72f34109\n","creator_id":{"id":336,"is_a":["person","robot"],"name":"gitbot","title":"Git","uri":"https:\/\/zotonic.com\/id\/336"},"modified":"2026-10-27T10:30:03Z","title_slug":"mod_development"},"uri":"https:\/\/zotonic.com\/id\/1457","uri_template":"https:\/\/zotonic.com\/id\/:id","websub":{"hub":"https:\/\/zotonic.com\/.zotonic\/websub","topic":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1457"}},"status":"ok"}