← Back to the blog

Three repositories, one goal with a deadline: initiatives and products in a real case

A team with its API, website and app in separate repositories organises a goal that cuts across all three. How the projects are set up in Hilbana and what happens to each issue, from the product, from the initiative and from the agents.

Equipo HilbanaProducto

Tutorial · Projects · Agents

Three repositories, one goal with a deadline: initiatives and products in a real case

Sooner or later, every team with more than one repository runs into the same question: where do I create this issue? Create it in the API project and whoever follows the goal can’t see it. Create it in the goal’s project and whoever maintains the API doesn’t have it on their board. And if it touches both, you create it twice and hope nobody closes one without the other.

That’s why we’ve added project kinds to Hilbana: initiatives and products. This article walks through a complete case, from setup to day-to-day work, with a screenshot of every step and a short video at the key moments.

The case: one team, three repositories

Acme builds booking software for clinics. It’s a small team: Lucy runs the product, two AI agents work on the code and an external studio maintains the website. The code lives in three repositories, each with its own pace:

Each repository has its usual work: updating dependencies, a footer that breaks in Safari, the app’s dark mode. That never ends.

This quarter there’s also a goal with a deadline: Online booking, so patients can book and pay for their appointment on the website and the app without calling the clinic. It has two phases and touches all three repositories. And a smaller one, Reminders: notices before the appointment so people don’t miss it.

What wasn’t working

With one project per repository, nobody could say how much was left on Online booking: its issues were spread across three boards. With an “Online booking” project, the API team didn’t see the payments endpoint on their board, and their v2.3 didn’t count it. Labels half-solved it, until someone forgot to add them.

And there were two new problems. The agent working on the website picked up the payment form before the endpoint it depends on existed. And for the web studio to see its issues, it had to be given access to the whole goal, API and app issues included.

The idea: work lives in the initiative and is delivered to the product

Hilbana tells two kinds of project apart:

Each issue lives in the initiative, where you decide what needs doing, and is delivered to the product where it’s built. You follow the goal from the initiative and what needs coding from the product. It’s a single issue and keeps its identifier, so branches and PRs link exactly as before.

If your team works with a single repository, you don’t need to do anything: a project with no kind works as it always has.

1. Give each project its kind

Right-click a project in the sidebar and its menu has Project kind: Initiative or Product.

Project menu with the project kind: Initiative or Product

Before applying it, Hilbana warns you that the kind is final: it can’t be changed or removed. That’s because deliveries depend on it; a product that stopped being one would leave the issues delivered to it with nowhere to go. Before choosing, ask yourself whether that project is a goal that will end or a repository that will still be there.

Warning before turning a project into a product: the kind is final

Acme marks the API, the website and the app as products, and Online booking and Reminders as initiatives. In the sidebar, each initiative gets a target and each product, a box.

Giving three projects their kind, in 46 seconds.

2. Declare each product’s repository

On each product’s page, the Repos row says which GitHub or Bitbucket repositories belong to it. The API declares acme/api, the website acme/web and the app acme/app. A repository can only belong to one product. You’ll see what it’s for further down.

Bookings API product page: locked Product kind, the acme/api repository and its versions v2.3 and v2.4

Look at the API’s milestones: v2.3 is at 2 of 4 issues. Two of them weren’t created in the API: they came from Online booking.

3. Deliver each issue to its product

An issue in an initiative gets a Product field, chosen in two steps. First, the product where it’s built:

Product picker on the issue page: the three products in the workspace

Then, if that product has milestones, which one it goes into. They’re the product’s milestones, not the initiative’s:

Second step: the Bookings API milestone, v2.3 or v2.4

The field shows both together. The issue stays in its initiative phase (Phase 2) and, at the same time, in the product’s version (v2.4). It counts in both milestones.

The Product field with the Bookings API and v2.4, next to the initiative's Phase 2 milestone

If you already know where an issue goes when you create it, the quick-create form on the initiative’s list has its own product picker.

Delivering an issue to the API and seeing it on its board.

4. If it touches two repositories, split it

“Cancel a booking from the email” touches the API (the link and its token) and the website (the cancellation page). An issue is delivered to a single product, so this one gets split: the Split by repository button on its page asks which products it affects.

Split by repository dialog with the public website and the bookings API checked

It creates one sub-issue per product, already delivered to it, under the original issue. The original stays in the initiative as the umbrella; each part is built by whoever owns that repository.

The two sub-issues created: one for the public website and one for the bookings API

One sub-issue per repository, in one click.

5. The product sees its own work and what it receives

On the API board, its maintenance issues sit next to the ones delivered by initiatives. Those carry an origin tag, “from Online booking” or “from Reminders”, and keep their identifier (RES-23, REC-32).

Bookings API board with its own and delivered issues, tagged with their initiative of origin

The All / Own / Delivered filter separates one from the other. With “Delivered”, the API sees at a glance everything the initiatives are asking of it:

API list filtered by Delivered: only the issues coming from initiatives

And the product’s version counts both. The API’s v2.3 includes the dependency update (its own) and the payments endpoint (from Online booking). The version’s progress, token usage and AI summary are built from all of them.

API milestone v2.3: own and delivered issues, with their origin tag

6. Dependencies across repositories, for agents too

The payment form (website) needs the payments endpoint (API). In the initiative they’re linked with blocks: the website issue is “Blocked by RES-23”.

Payment form issue, delivered to the website, blocked by RES-23 Payments endpoint

So far, nothing new for a person. The difference is with agents. The API agent is working on the endpoint:

Payments endpoint in progress by the API agent

The website agent asks the MCP for work in its product and the queue doesn’t hand it the form, even though it’s marked ready for agent. If it asks for it by name, Hilbana refuses and tells it why:

next_ready_issue { "projectId": "<Public website>" }
→ null

claim_issue { "id": "RES-24" }
→ 409: the issue is blocked by RES-23 (In Progress): it can't be
  claimed until they are done or canceled

As soon as the API agent moves the endpoint to Done, the form enters the website’s queue. Nobody has to tell anyone.

The website agent waits until the API is ready.

7. The external studio only sees the website

Mark works at a design studio that maintains the website. In Hilbana he’s a guest with access to a single project: Public website. There’s nothing else in his sidebar.

Even so, the website’s list shows him the issues Online booking has delivered to it:

Guest view: the public website list with its own issues and the ones delivered from Online booking

He sees those issues, not the whole initiative. On the issue page, Online booking appears by name, without a link, and the initiative’s milestone isn’t shown to him. He can change the status, comment and log time, because he’s the one building it, but he can’t rewrite the issue. That belongs to whoever runs the initiative.

Issue page seen by the guest: read-only properties and the initiative without a link

8. Let the PR deliver the issue

“Booking confirmation email” was created in the initiative without deciding where it would be built. Lucy doesn’t have to come back to it: as soon as someone opens a PR from acme/api with the issue’s branch, Hilbana sees that the repository belongs to the API and delivers it to the API, moves it to in progress and attaches the PR.

The issue with the Bookings API product set by itself and PR #214 open

If the issue was already going to another product, it isn’t changed: a comment is left for someone to review it.

The repository's PR delivers the issue to its product.

9. And the initiative, at a glance

Back to the question we started with: how much is left on Online booking? It now has an answer in one place. The initiative’s overview adds up all its issues, wherever they’re built. Phase 1 is at 1 of 6, and with 70 days to go and 10% done, Hilbana flags it at risk.

Online booking initiative overview: progress, date risk and phases 1 and 2

The initiative’s list shows the whole goal: API, website and app issues, and the ones that aren’t code too, like the cancellation policy. The Product column tells you which repository each one goes to and which version it lands in; the ones still undecided stand out right away. On the initiative’s board, every card carries the same tag.

Online booking initiative list: each issue with its product and version in the Product column

In short

All the details, permissions and the MCP included, are in the initiatives and products documentation.

Create your free workspace at app.hilbana.com/signup and try splitting your next goal by repository.

← Back to the blog