Inspiration

This year, we built extensively with Atlassian Forge. As our apps moved beyond “toy” complexity, we ran into a familiar challenge: observability.

Forge provides built-in logging and a log explorer in the developer console, which works well for small apps. For larger apps and deeper analysis, Atlassian recommends external tools such as Datadog, Grafana, Splunk, or ELK.

We asked ourselves whether there was a middle ground: a solution that keeps log data inside the Atlassian ecosystem, integrates directly with Bitbucket, and provides the analytical power of tools like Grafana or Kibana—while also extending log retention beyond Forge’s 14-day limit.

We envisioned a tool that feels like an F1 pit wall: a single dashboard showing real-time insights into your Forge app

We wanted answers to questions like:

  • What changed after the last deployment?
  • Are errors trending up or down?
  • Which function or module is generating noise?
  • Can issues be correlated across invocations without switching tools?
  • How can log data be researched quickly for customer tickets?

What we built

Forge Log Dashboards for Bitbucket brings interactive, SQL-powered log dashboards directly into a Bitbucket repository.

Architecture

To account for Forge’s stateless nature and to minimize backend load, most processing happens on the frontend.

Frontend (React)

  • Uses DuckDB-Wasm, a WebAssembly build of DuckDB, optimized for analytical queries, time-series data, and visualizations.
  • Persists dashboards in OPFS (browser storage) for fast reloads.
  • Tracks loaded log ranges to avoid redundant backend requests.

Backend (Forge app)

  • Fetches logs via Forge APIs and caches them in key-value storage (kvs).
  • Compresses log data using Brotli, achieving very high compression ratios (in our testing up to 10000x).
  • Uses a custom algorithm to remap and repack paged log data efficiently for frontend consumption.
  • Designed to migrate to Forge Object Storage for improved scalability once available.

Dashboards and widgets are stored as JSON in kvs for persistence and easy sharing.

Key features

  • Dashboards live next to the repo
    Versionable, shareable, and reviewable alongside the code they observe.

  • Grid-based widgets
    Widgets can be added, moved, and resized freely.

  • SQL-powered widgets (core feature)

    • Write arbitrary SQL queries, not just predefined filters.
    • Express complex aggregations and correlations directly in SQL.
    • Iterate quickly, as queries run locally in the browser database.
  • Global filters
    Instantly update all widgets.

  • Timezone switching
    Analyze data in UTC, your timezone or in the timezone of your customers.

  • Clone, export, and import dashboards
    JSON-based portability.

  • Live editing for debugging

    • Changes apply immediately for fast feedback.
    • Persistence is explicit by design (save/export when ready).

Getting started

After installation, each Bitbucket project gains a new Dashboards menu entry.

To simplify onboarding, we include:

  • A demo data module that generates synthetic Forge-like log data.
  • Two example dashboards:
    • My Racing Example, tailored to the demo data and showcasing highly specific visualizations.
    • My Dashboard Example, designed as a base to work with any Forge log data.

Security & privacy notes

  • Classic SQL injection is not the primary concern

    • Users intentionally write their own queries.
    • Queries execute locally in DuckDB-Wasm, isolated in the browser or worker context.
    • There is no shared server-side SQL engine.
  • Primary hardening focus: untrusted log content

    • Log lines are treated as input data (future).
    • Unsafe parsing or escaping could enable “injection via logs.”
  • Platform constraints help

    • Forge and Atlassian security boundaries limit arbitrary outbound connectivity compared to self-hosted solutions.

Challenges we faced

  • Forge request and payload limits

    • Platform constraints strongly influenced log retrieval and transport.
    • Compression, paging, and caching were essential.
  • Performance at scale

    • Maintaining fast queries and responsive filters required careful optimization.
  • Hackathon reality

    • One developer’s laptop crashed a day before the deadline. This was a very real (and painful) challenge in the final stretch.
    • Code had to be partially recovered from source maps, which was painful but ultimately successful.

Accomplishments we’re proud of

  • Runs entirely on Atlassian

    • No external observability stack required.
    • No third-party infrastructure to provision or operate.
  • SQL over logs inside Bitbucket

    • Dashboards embedded next to the code they monitor.
    • Flexible queries instead of rigid templates.
  • A real investigation workflow

    • Fast iteration, interactive exploration, and shareable dashboards.

Limitations

  • Dashboards are currently global

    • They are not yet cleanly scoped per repository or workspace.
  • Safari is not supported

    • Required browser features (notably modern storage and runtime APIs) are unreliable or unavailable.
  • Privacy-first by design

    • Data stays inside Atlassian and the browser.
    • This is not a “ship logs everywhere” solution.
  • Live editing favors investigation

    • Ideal for debugging and exploration.
    • Persistence is explicit rather than automatic.

What we learned

  • Logs need structure to become actionable; queryable data beats raw text.
  • Consistent schemas enable correlation and reusable dashboards.
  • In-browser databases are a strong fit for exploratory observability.
  • UX matters: observability only works when it is fast and pleasant to use.

Outlook

  • Proper scoping of dashboards (per project, per workspace).
  • Additional widget types (percentiles, anomaly detection, top offenders).
  • Further security hardening, especially around log ingestion.
  • Background jobs to prefetch logs for faster initial load times.
  • Support for additional log sources.
  • Dataset export (CSV or Parquet) directly from the browser database.

Built With

Share this project:

Updates

posted an update

Note on Edge with Enhanced Security enabled

If Enhanced Security is turned on in Microsoft Edge (common in corporate setups), it can slow down the dashboard a lot — to the point of being unusable (do to the impact on WebAssembly performance). We recommend to use Chrome, Firefox, or Edge with Enhanced Security turned off (factory default in Windows).

Known Issue (when using data from a real app)

If you fetch logs for any full hour (from :00 to :59:59, including the current hour) with zero logs, the dashboard will hang with “Waiting for api.atlassian.com to accept new requests ...” for about 5 minutes before timing out. This is a known bug and a quick fix, but we’re not deploying it now to stick to hackathon rules.

To avoid this, don’t request logs for hours with no data, or be ready to wait for the timeout. The bug will repeat every time you try to refetch the same period.

Why? The frontend loads data in one-hour chunks. If a chunk is empty, the backend sends an empty response, but the frontend keeps retrying until it gives up after a few minutes.

This is a hackathon beta, so some bugs are expected I guess. If you spot any others, please let us know!

This issue does not happen with the demo data module.

Installation link (try it yourself)

https://developer.atlassian.com/console/install/2442a15c-047a-471f-83f7-a61ab1f25732?signature=AYABeIsyhiX76Y1SK%2FjS3mXdUFIAAAADAAdhd3Mta21zAEthcm46YXdzOmttczp1cy13ZXN0LTI6NzA5NTg3ODM1MjQzOmtleS83MDVlZDY3MC1mNTdjLTQxYjUtOWY5Yi1lM2YyZGNjMTQ2ZTcAuAECAQB4IOp8r3eKNYw8z2v%2FEq3%2FfvrZguoGsXpNSaDveR%2FF%2Fo0BCPClRK6GvQOQbaSM1uLKRAAAAH4wfAYJKoZIhvcNAQcGoG8wbQIBADBoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHNw7%2FWJbXfZkygLfQIBEIA7reN8SQ3ZBRNSW28QI1Ad37SeevwdYwBR2%2FyR0XyP7%2BEEqFpSw8w0Wt%2FdQCN7xpx2kqrA9rL74LrOOT4AB2F3cy1rbXMAS2Fybjphd3M6a21zOmV1LXdlc3QtMTo3MDk1ODc4MzUyNDM6a2V5LzQ2MzBjZTZiLTAwYzMtNGRlMi04NzdiLTYyN2UyMDYwZTVjYwC4AQICAHijmwVTMt6Oj3F%2B0%2B0cVrojrS8yZ9ktpdfDxqPMSIkvHAHEow4HLmPS4r1nIe7xzRcnAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMSWj1Cjy4eww155rhAgEQgDv51zdksYTzTMjvH%2FRFAxJPHxKHslsPvYP5emaSTjsz8qNPJ02xcNjX%2FW%2Bso97xCMyA%2BM%2FATP1T6%2BXurwAHYXdzLWttcwBLYXJuOmF3czprbXM6dXMtZWFzdC0xOjcwOTU4NzgzNTI0MzprZXkvNmMxMjBiYTAtNGNkNS00OTg1LWI4MmUtNDBhMDQ5NTJjYzU3ALgBAgIAeLKa7Dfn9BgbXaQmJGrkKztjV4vrreTkqr7wGwhqIYs5AfkStwy8R0wzN2KvG5YWTGsAAAB%2BMHwGCSqGSIb3DQEHBqBvMG0CAQAwaAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxARYcFr2%2BSw8Jl1tICARCAO%2Fht0T%2BUpG6%2FX2%2Bok0QEOsYd8ndpdQtxuFn9wgFPO8oPfc%2BsCv1kOll0hSM1371nW7pacUSmeTiLsJA0AgAAAAAMAAAQAAAAAAAAAAAAAAAAACFvCEHyJnH8t%2BOuz9oAIqb%2F%2F%2F%2F%2FAAAAAQAAAAAAAAAAAAAAAQAAADKcCpSRBBFp1%2BvZgRrbRzpjvkvYG6nyX%2FNk1FrgxMawHiFaky%2FExId%2F%2B92aCTvKpKQ25cwrv2QDfsyiONBOXl9jxTg%3D&product=bitbucket

Log in or sign up for Devpost to join the conversation.

posted an update

If Enhanced Security is enabled in Microsoft Edge, it can negatively impact performance, which is often the case in corporate environments. Features like virus scans can significantly slow down WebAssembly (WASM) execution, causing the dashboard to feel sluggish. As browser performance is crucial for our app, we recommend using Chrome, Firefox, or Microsoft Edge with Enhanced Security disabled.

Log in or sign up for Devpost to join the conversation.

posted an update

https://developer.atlassian.com/console/install/2442a15c-047a-471f-83f7-a61ab1f25732?signature=AYABeIsyhiX76Y1SK%2FjS3mXdUFIAAAADAAdhd3Mta21zAEthcm46YXdzOmttczp1cy13ZXN0LTI6NzA5NTg3ODM1MjQzOmtleS83MDVlZDY3MC1mNTdjLTQxYjUtOWY5Yi1lM2YyZGNjMTQ2ZTcAuAECAQB4IOp8r3eKNYw8z2v%2FEq3%2FfvrZguoGsXpNSaDveR%2FF%2Fo0BCPClRK6GvQOQbaSM1uLKRAAAAH4wfAYJKoZIhvcNAQcGoG8wbQIBADBoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHNw7%2FWJbXfZkygLfQIBEIA7reN8SQ3ZBRNSW28QI1Ad37SeevwdYwBR2%2FyR0XyP7%2BEEqFpSw8w0Wt%2FdQCN7xpx2kqrA9rL74LrOOT4AB2F3cy1rbXMAS2Fybjphd3M6a21zOmV1LXdlc3QtMTo3MDk1ODc4MzUyNDM6a2V5LzQ2MzBjZTZiLTAwYzMtNGRlMi04NzdiLTYyN2UyMDYwZTVjYwC4AQICAHijmwVTMt6Oj3F%2B0%2B0cVrojrS8yZ9ktpdfDxqPMSIkvHAHEow4HLmPS4r1nIe7xzRcnAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMSWj1Cjy4eww155rhAgEQgDv51zdksYTzTMjvH%2FRFAxJPHxKHslsPvYP5emaSTjsz8qNPJ02xcNjX%2FW%2Bso97xCMyA%2BM%2FATP1T6%2BXurwAHYXdzLWttcwBLYXJuOmF3czprbXM6dXMtZWFzdC0xOjcwOTU4NzgzNTI0MzprZXkvNmMxMjBiYTAtNGNkNS00OTg1LWI4MmUtNDBhMDQ5NTJjYzU3ALgBAgIAeLKa7Dfn9BgbXaQmJGrkKztjV4vrreTkqr7wGwhqIYs5AfkStwy8R0wzN2KvG5YWTGsAAAB%2BMHwGCSqGSIb3DQEHBqBvMG0CAQAwaAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxARYcFr2%2BSw8Jl1tICARCAO%2Fht0T%2BUpG6%2FX2%2Bok0QEOsYd8ndpdQtxuFn9wgFPO8oPfc%2BsCv1kOll0hSM1371nW7pacUSmeTiLsJA0AgAAAAAMAAAQAAAAAAAAAAAAAAAAACFvCEHyJnH8t%2BOuz9oAIqb%2F%2F%2F%2F%2FAAAAAQAAAAAAAAAAAAAAAQAAADKcCpSRBBFp1%2BvZgRrbRzpjvkvYG6nyX%2FNk1FrgxMawHiFaky%2FExId%2F%2B92aCTvKpKQ25cwrv2QDfsyiONBOXl9jxTg%3D&product=bitbucket

Log in or sign up for Devpost to join the conversation.