{"id":2505,"date":"2026-02-19T18:54:21","date_gmt":"2026-02-19T17:54:21","guid":{"rendered":"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/"},"modified":"2026-02-19T19:00:30","modified_gmt":"2026-02-19T18:00:30","slug":"codegeist-2025-forge-log-dashboards-for-bitbucket","status":"publish","type":"post","link":"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/","title":{"rendered":"What We Built for Codegeist 2025: Forge Log Dashboards for Bitbucket"},"content":{"rendered":"<p>In 2025, we joined <strong>Codegeist<\/strong> again and used the opportunity to build something that had been on my mind for a while: better observability for Forge apps without immediately spinning up a full external stack.<\/p>\n<p>Our project is <strong>Forge Log Dashboards for Bitbucket<\/strong> (Devpost entry: <a href=\"https:\/\/devpost.com\/software\/advanced-dashboards-for-forge-logs\" target=\"_blank\" rel=\"noopener\">Advanced Dashboards for Forge Logs<\/a>).<\/p>\n<p>The core question behind it was simple: when a Forge app grows beyond \u201csmall utility,\u201d how do you investigate behavior quickly without context-switching all the time?<\/p>\n<h2>Why we built this during Codegeist<\/h2>\n<p>In day-to-day app work, logs are usually where debugging and incident analysis starts. Forge gives you built-in logging, which is great. But as soon as complexity increases, you start needing richer filtering, comparisons over time, and repeatable views for your team.<\/p>\n<p>For this hackathon, I wanted to explore a middle ground: keep analysis close to development work, inside Atlassian tooling, and still get more analytical depth than plain log browsing.<\/p>\n<h2>What we built<\/h2>\n<p>We built dashboards directly inside Bitbucket with widget-based visualizations and query-driven exploration.<\/p>\n<ul>\n<li>Dashboard widgets can be added, moved, resized<\/li>\n<li>Log data can be explored with SQL-style queries<\/li>\n<li>Dashboards can be shared\/exported as JSON<\/li>\n<li>Starter content helps with onboarding and testing<\/li>\n<\/ul>\n<p>Technically, the solution combines Forge backend components with a frontend-heavy analysis approach for responsiveness.<\/p>\n<h2>What I personally learned from this project<\/h2>\n<p><strong>1) Log quality matters more than log quantity.<\/strong><br \/>\nThe biggest improvement is often not \u201cmore logs,\u201d but cleaner and more structured logs. Once fields are consistent, analysis gets dramatically easier.<\/p>\n<p><strong>2) Developer UX is a feature, not a luxury.<\/strong><br \/>\nIf dashboards are slow or clunky, people stop using them. Fast feedback loops are essential for real debugging workflows.<\/p>\n<p><strong>3) Good defaults reduce friction.<\/strong><br \/>\nDemo data and starter dashboards made it much easier to explain and test the concept quickly.<\/p>\n<p><strong>4) Platform limits shape architecture early.<\/strong><br \/>\nRequest\/payload constraints force good engineering decisions around data transport, caching, and incremental loading.<\/p>\n<h2>The hackathon reality<\/h2>\n<p>Like many hackathon projects, this one had a chaotic side as well \u2014 and for us it got very real in the final stretch. Shortly before the deadline, one developer laptop crashed and we suddenly had to recover parts of our work under serious time pressure. That changed the mood from &#8220;let\u2019s polish&#8221; to &#8220;let\u2019s rescue what matters most&#8221;: stabilize the core flow, keep the demo working, and make hard trade-offs about what to cut.<\/p>\n<p>In hindsight, that moment was frustrating, but also one of the most valuable parts of the whole experience. It forced us to communicate clearly, prioritize brutally, and focus on what actually delivers value to users \u2014 not what looks fancy in a hackathon demo. That pressure test taught us more about our architecture and team workflow than a smooth week ever could.<\/p>\n<p><iframe loading=\"lazy\" title=\"Forge Log Dashboards for Bitbucket - Codegeist 2025 Demo\" src=\"https:\/\/www.youtube.com\/embed\/Uzjxeks70qc\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<h2>What\u2019s next<\/h2>\n<p>If we continue this project, the next priorities are clear:<\/p>\n<ul>\n<li>Cleaner dashboard scoping by repository\/workspace<\/li>\n<li>More prebuilt widgets for common troubleshooting tasks<\/li>\n<li>Further hardening around ingestion and edge cases<\/li>\n<\/ul>\n<p>Codegeist was a great forcing function to test this idea in a short, focused cycle. I\u2019m happy with what we learned, and even more interested in where this can go next.<\/p>\n<p>If you\u2019re curious, here is the project page again:<br \/>\n<a href=\"https:\/\/devpost.com\/software\/advanced-dashboards-for-forge-logs\" target=\"_blank\" rel=\"noopener\">https:\/\/devpost.com\/software\/advanced-dashboards-for-forge-logs<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In 2025, we joined Codegeist again and used the opportunity to build something that had been on my mind for a while: better observability for Forge apps without immediately spinning up a full external stack. Our project is Forge Log Dashboards for Bitbucket (Devpost entry: Advanced Dashboards for Forge Logs). The core question behind it was simple: when a Forge &#8230; <a href=\"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/\" class=\"more-link\">Read More<\/a><\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-2505","post","type-post","status-publish","format-standard","hentry","category-news","no-post-thumbnail"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>What We Built for Codegeist 2025: Forge Log Dashboards for Bitbucket - CraftCoders.app<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What We Built for Codegeist 2025: Forge Log Dashboards for Bitbucket - CraftCoders.app\" \/>\n<meta property=\"og:description\" content=\"In 2025, we joined Codegeist again and used the opportunity to build something that had been on my mind for a while: better observability for Forge apps without immediately spinning up a full external stack. Our project is Forge Log Dashboards for Bitbucket (Devpost entry: Advanced Dashboards for Forge Logs). The core question behind it was simple: when a Forge ... Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/\" \/>\n<meta property=\"og:site_name\" content=\"CraftCoders.app\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-19T17:54:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-19T18:00:30+00:00\" \/>\n<meta name=\"author\" content=\"Daisy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daisy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/\",\"url\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/\",\"name\":\"What We Built for Codegeist 2025: Forge Log Dashboards for Bitbucket - CraftCoders.app\",\"isPartOf\":{\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#website\"},\"datePublished\":\"2026-02-19T17:54:21+00:00\",\"dateModified\":\"2026-02-19T18:00:30+00:00\",\"author\":{\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/8776a744b287ab1f321ab98ad34d49a1\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#website\",\"url\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/\",\"name\":\"CraftCoders.app\",\"description\":\"Jira and Confluence apps\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/8776a744b287ab1f321ab98ad34d49a1\",\"name\":\"Daisy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/556a3ced7f572411c02227dd3418cb627a403c0ce50e93d39f1f730552d84c1d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/556a3ced7f572411c02227dd3418cb627a403c0ce50e93d39f1f730552d84c1d?s=96&d=mm&r=g\",\"caption\":\"Daisy\"},\"url\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/author\/daisy-bot\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"What We Built for Codegeist 2025: Forge Log Dashboards for Bitbucket - CraftCoders.app","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/","og_locale":"en_US","og_type":"article","og_title":"What We Built for Codegeist 2025: Forge Log Dashboards for Bitbucket - CraftCoders.app","og_description":"In 2025, we joined Codegeist again and used the opportunity to build something that had been on my mind for a while: better observability for Forge apps without immediately spinning up a full external stack. Our project is Forge Log Dashboards for Bitbucket (Devpost entry: Advanced Dashboards for Forge Logs). The core question behind it was simple: when a Forge ... Read More","og_url":"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/","og_site_name":"CraftCoders.app","article_published_time":"2026-02-19T17:54:21+00:00","article_modified_time":"2026-02-19T18:00:30+00:00","author":"Daisy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Daisy","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/","url":"https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/","name":"What We Built for Codegeist 2025: Forge Log Dashboards for Bitbucket - CraftCoders.app","isPartOf":{"@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#website"},"datePublished":"2026-02-19T17:54:21+00:00","dateModified":"2026-02-19T18:00:30+00:00","author":{"@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/8776a744b287ab1f321ab98ad34d49a1"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/craft-coders.de\/3bpizkrx8k\/codegeist-2025-forge-log-dashboards-for-bitbucket\/"]}]},{"@type":"WebSite","@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#website","url":"https:\/\/craft-coders.de\/3bpizkrx8k\/","name":"CraftCoders.app","description":"Jira and Confluence apps","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/craft-coders.de\/3bpizkrx8k\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/8776a744b287ab1f321ab98ad34d49a1","name":"Daisy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/556a3ced7f572411c02227dd3418cb627a403c0ce50e93d39f1f730552d84c1d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/556a3ced7f572411c02227dd3418cb627a403c0ce50e93d39f1f730552d84c1d?s=96&d=mm&r=g","caption":"Daisy"},"url":"https:\/\/craft-coders.de\/3bpizkrx8k\/author\/daisy-bot\/"}]}},"_links":{"self":[{"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/posts\/2505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/comments?post=2505"}],"version-history":[{"count":2,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/posts\/2505\/revisions"}],"predecessor-version":[{"id":2507,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/posts\/2505\/revisions\/2507"}],"wp:attachment":[{"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/media?parent=2505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/categories?post=2505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/tags?post=2505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}