Your diff has a demo now with Junie /demo JetBrains launched Junie /demo, a new mode in Junie CLI that builds and launches an app, interacts with its UI, and records the run as an HTML report with screenshots and video. Inside JetBrains, the demo agent has been connected to GitHub Actions and run on more than 1,500 unique PRs, producing over 2,100 demo videos. The company also said it is experimenting with the capability in Junie Live, its Slack agent. Agentic AI https://blog.jetbrains.com/junie/category/agentic-ai/ AI https://blog.jetbrains.com/junie/category/ai/ Coding https://blog.jetbrains.com/junie/category/coding/ Testing https://blog.jetbrains.com/junie/category/testing/ Your diff has a demo now with Junie /demo You have the change ready and the tests are green. Now someone has to launch the app, find the right screen, and check the flow. Often, that someone is still you, even when an agent helped write the code. You should be able to delegate that part too. Junie /demo is a new mode in Junie CLI. Describe what you want to check, and Junie builds and launches your app, interacts with its UI, and records what happens. You get an HTML report, screenshots, and a video you can review or share. The useful part is getting the routine clicking off your plate while keeping the result open to inspection. You decide whether the change is ready to ship. Set up Junie /demo and run your first check Let’s use a small issue tracker as our example. You have added bulk status updates: select two issues, mark them “Done”, and see the counters change. You also want to check that the update survives a reload. First time in this repository? Start Docker and ask Junie to set up /demo . It analyzes your project and proposes a build and launch plan. Once you confirm the plan, Junie fills in the configuration for you. Review the generated files, then run: /demo Choose the changes from your branch, session, working tree, or last commit. For a specific check, enter a request in the prompt field: Reset the sample data. Select PB-101 and PB-102 and mark them Done.Check that Open drops from 3 to 1 and Done rises from 1 to 3.Reload the page and verify that both issues are still Done. Review the prompt and let the agent work: You can watch the live run as it moves through the UI and inspect what it actually does: A request with an expected result gives the run a clear target. “Check the feature” leaves more room for interpretation than naming the action, the expected state, and the condition that should survive a reload. The explanation travels with the video A screen recording is much easier to review when you know what you are looking at. Each demo video starts with a slide introducing the demonstration. If the run covers several scenarios, each gets its own introductory slide. A final slide sums up the results. A model helps prepare that structure. During post-processing, it examines the captured screenshots, identifies the scenarios, and writes the explanatory slides. These are added to the recording as the final video is assembled. The video also has explanatory subtitles, which you can turn on or off in the player. Voice-over may follow in a future update. The HTML report brings together the request, the result, the video, and the screenshots. You can inspect the steps that ran and see which checks passed, failed, or remained incomplete. That is useful for a reviewer, a QA engineer, or a teammate asking how a feature works. We are also experimenting with this in Junie Live, our Slack agent, to answer suitable feature questions with a demonstration. Give reviewers something they can watch A diff explains the code change. A demo adds the behavior you can see: which screen opens, what changes after a click, and whether the flow reaches the expected result. Inside JetBrains, we connected the demo agent to GitHub Actions. In our agent repository, we have run it for more than 1,500 unique PRs and created over 2,100 demo videos. The first workflow example follows the same idea. It checks whether a PR contains behavior worth demonstrating, runs the demo when it does, and adds a comment linking to the available artifacts. The prompts are inside the YAML, so you can read and adapt the whole example in one file. You can read the full demo-pr-changes.yml https://junie.jetbrains.com/blog/demo-agent/demo-pr-changes.yml and adapt it to your repository. This is most useful when a change has an interface to exercise. A backend change may also be demonstrated through an existing Swagger UI, for example. The value depends on what the run can actually observe. Move repeatable checks into CI We also use the demo agent for release smoke tests. Our internal workflow runs 22 scenarios on pushes to release branches and keeps a result and video for each. Across our internal release branches, we have used the agent for more than 1,300 smoke tests. The second example starts small: two independent scenarios, triggered by a push or a manual run. Replace the prompts with your own steps and expected results. A commented schedule shows how to add regular runs. You can read the full demo-release-tests.yml https://junie.jetbrains.com/blog/demo-agent/demo-release-tests.yml and replace the scenarios with your own. There is one detail worth keeping: a completed agent process does not tell you whether a check passed. In this example, the prompt asks Junie to write an explicit verdict. Only PASS passes the result check. FAIL, PARTIAL, and missing or invalid results fail it. Other scenarios can still finish and upload their evidence. Both examples use GitHub Artifacts, so there is no separate video hosting service to configure. What runs under the hood The demo environment is a Docker container based on Debian Bookworm. The base image includes Chromium, Node.js, xterm, a virtual desktop provided by Xvfb and a window manager, plus screenshot tools, xdotool, and ffmpeg. A model with Computer Use support drives the app through clicks, keystrokes, and screenshots. Your Dockerfile adds the project’s dependencies; .junie/demo.md describes its build and launch steps. A complex repository can have several VM templates. For a monorepo with a backend and several frontends, each environment can have its own Dockerfile under .junie/vms/ and its own launch settings. Describe which template to use, which services it needs, and how to start them in .junie/demo.md . Junie can then choose the right environment for the requested demo. Junie keeps your active model if it supports Computer Use and is available. Otherwise, it selects the first available model in this order: GPT-5.6 SOL, GPT-6 Astra, GPT-5.5, then GPT-5.4. All models run with High reasoning effort in /demo , regardless of your selected effort level. The run cannot start without a supported model. The Junie /demo documentation https://junie.jetbrains.com/docs/junie-cli-demo.html covers the environment and configuration in detail. In CI, the same mode is available through --demo : junie --auth="$JUNIE API KEY" --demo -p . \ --task "Open the app and demonstrate the bulk status update." Budget for the run In our internal 22-case comparison, GPT-5.6 SOL had the lowest average time and cost among the three models we measured. The full set cost $19.94 on SOL. In the subscription conversion used for these figures, $1 equals one AI Credit. These are internal measurements on our scenarios, so your app, build steps, and prompts will affect the result. Budget for CI runner usage separately. The team also found SOL faster in these runs without a noticeable drop in observed quality. That observation comes from our own workloads and helps explain the model preference. A run still takes minutes. The benefit is that you can hand over the routine interaction and come back to something you can inspect. Try it on your next change Set up /demo once in your repository, check the generated configuration, and start with a small feature or fix. For CI, commit that configuration and add a JUNIE API KEY repository secret before copying either workflow. Pick the change you were about to click through yourself. Ask Junie to demonstrate it, watch the output, and decide what needs a closer look. Subscribe to Junie blog updates