Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

Vibecoding with Rovo: How I Built a Confluence App by Mostly Just Complaining

Me: I’m not a developer, I cannot code a prototype…

Member of the Patent Review Board: You don’t need a functional prototype and you don't have to be a developer. But you need to be able to describe your invention in such a way that an Engineer can build it or a Developer can code it.

Hey everyone! I recently decided to try my hand at "vibecoding" – which is a fancy new way of saying I asked Atlassian's Rovo to build a Forge app for me while I sat back, drank coffee, and occasionally pointed out when things were broken.

The Plan

My grand vision? A simple word count macro for Confluence.

I may be an inventor but I’m by no means a coding developer, so my strategy was basically to throw vague prompts at the AI and see what happened. Here is a log of my journey, wherein Rovo does all the heavy lifting and I play the role of a slightly demanding end-user.

Building a Rovo Studio App.png

Phase 1: The "Zero Words" Phenomenon

  • Me: "I want to build a word count Confluence app."

  • Rovo: [Generates a flurry of code]

  • Me: "The app says 'NO data available' despite the fact there’s a giant chunk of text right there on the page."

  • Rovo: Calmly figures out that it was looking for the page ID in the wrong place. It correctly repoints to context.extension.content.id. It also realizes the macro was crashing because I hadn't explicitly saved a configuration yet, so it graciously added sensible defaults so the app would work immediately upon insertion.

Phase 2: The Authentication Wall

  • Me: "Another problem. Now it's throwing an error: Failed to fetch word count statistics: Authentication Required."

  • Rovo: Realizes it was trying to use user-level credentials, which require extra permissions I hadn't set up. It casually switches to app-level credentials to work with the read:confluence-content.all scope. Crisis averted.

Phase 3: The Scope Awakening

  • Me: "Nope, still broken. Error 401 - Unauthorized; scope does not match."

  • Rovo: Patiently explains the difference between classic scopes and granular scopes. It turns out the endpoint for fetching page content requires the granular read:content-details:confluence scope. Rovo rewrites the manifest for me and reminds me to accept the new permissions on republish. I nod at my screen as if I knew that all along.

Phase 4: The Executive Decision

  • Me: "Actually, remove the 'Estimated Read Time' field entirely. I changed my mind."

  • Rovo: Without a single digital sigh, it completely purges the Reading Time checkbox, the words-per-minute input from the config panel, and all the backend calculation logic. It then casually drops: "All 49 tests are passing." Show-off.

The Verdict

In the end, I now have a fully functioning Word Count, Character Count, and Paragraph Count macro. My technical contribution consisted almost entirely of copy-pasting error messages and moving the goalposts on the UI. Rovo handled the Forge context objects, the API credential scopes, and the unit tests.

If vibecoding means I get to play the role of a slightly annoying product manager while Rovo writes the code, I think I've finally found my true calling.

Has anyone else tried building apps this way yet? I'd love to hear if your AI partner was as patient as mine!

Full Disclosure

This text is an AI dramatization. I fed the brief log to AI, set sarcasm to 6 (out of 10) and asked for a mildly self-deprecating tone :) 

  • The experience is real.
  • The app is real.
  • The actual logs are in the comment. 

The opening quote (dialogue) is real. And it’s probably the best advice I've gotten since I entered the IT world full time in 2012.

1 comment

Kris Klima _K15t_
Community Champion
March 23, 2026

Me: I want to build a word count Confluence app

Rovo: [Does stuff]

Me: The app says NO data available despite the fact there’s a chunk of text on the page

Rovo:

  • The app was looking for the page ID in the wrong place in the context object. It now correctly reads it from context.extension.content.id, which is where Confluence macro contexts provide it.

  • The macro was stopping early if no config had been saved yet, meaning it showed no data on first use. It now uses sensible defaults so word count displays immediately after inserting the macro.

Me: Another problem.

Error loading word count
Failed to fetch word count statistics: Authentication Required

Rovo:

  • The app was using user-level credentials to call the Confluence API, which requires an extra permission that wasn't configured. It now uses app-level credentials, which work correctly with the existing read:confluence-content.all scope.

Me:

Error loading word count
Failed to fetch word count statistics: Confluence API error: 401 - Unauthorized; scope does not match

Rovo:

  • The app was using a classic scope (read:confluence-content.all) but the Confluence API endpoint for fetching page content requires the granular scope read:content-details:confluence. This mismatch caused the 401 Unauthorized error.

  • The manifest has been updated to use the correct granular scope. Since the permissions changed, the app will prompt users to accept the updated permission when the app is republished.

Me: Remove the Estimated Read Time field

Rovo:

  • The macro now shows only Word Count, Character Count, and Paragraph Count.

  • The Reading Time checkbox and Reading Speed (words per minute) input have been removed from the config panel.

  • All reading time calculation logic and related parameters have been removed from the backend. All 49 tests are passing.

Comment

Log in or Sign up to comment
TAGS
AUG Leaders

Atlassian Community Events