HowTo

AJIR in a nutshell

Welcome to AJIR, a simple place where you can manage products and projects, document them, track bugs and feedbacks, track time and timesheet automatically.

Core goals & values

AJIR Features

Product

In AJIR, everything begins with a Product. As a user, you are part of a company and can access its root products here.

Products can have sub-products. Each Product has a single owner.

A documentation can be nicely formatted and added to Products. The link to it will be available at the end of the description.

API documentation

API documentation in OpenAPI format can also be uploaded, a dedicated linked will be generated and the documentation will be rendered in 3 different styles (Swagger, Swagger dark and ReDoc). You can then simply add the link to the Product's documentation.

GitHub repository

You can add an Url to the corresponding repository. It will be display on the Product's page. Additionally, you can add an API access token. Please read the GitHub link section below.

Feature

Each Product can have Features.

Together with Products, Features describe what the users can achieve with it.

A Feature has a status, either planned, functional or obsolete.

The description field will go something like this:

[Product/Feature] users can do something.

A Feature can 'use' other Features, from the same or other Products. Dependencies are then retrieved dynamically, in both ways (is using / is used by) and can be consulted at the Feature and Product levels.

A documentation can be added to Features.

Bulk actions

From Feature lists across the application, you can bulk group Tasks into a Product and bulk create a common Task. The bulk actions are available in a drop down menu by clicking on the 3 dots and Feature selection is done with the card's checkboxes.

Task

Tasks belong to features and represent what has to be done in order to build the Products and its Features.

A Task has a status, either todo, in progress or done.

Each task has a single owner and Tasks receive an estimation of the work to be done, in hours.

A Task can depend on other Tasks. Dependencies are then retrieved dynamically, in both ways (blocks / is waiting on).

Bulk actions

From Task lists across the application, you can bulk group Tasks into a Task Plan (see below) and bulk remove the current Task Plan. The bulk actions are available in a drop down menu by clicking on the 3 dots and Task selection is done with the card's checkboxes.

You can get summaries at different levels in the application and get estimations about the work that is left to do.

Flag

You can toggle a Flag on Features, Tasks, and Task Plans. Flagged objects will appear on top of the lists across the application.

Technology

Technologies are used by your Features and you can get a summary of their use across your company on their dedicated page.

Milestone

A Milestone is a group of Tasks. It has a single owner and is optionally linked to a Product.

You can retrieve associated Tasks and follow your plan's execution on the dedicated page.

Note

A Note is a quick note (no surprise 😎), to be reminded. You can add Notes to Products, Features, Tasks and Users.

Work Sessions

A Work Session is some time spent on a Task by a User.

When you start working on a Task, click on the Start button and AJIR will automatically account for the time spent on it. It will stop as soon as you Log out, click on the Stop button or the Done button.

You can get summaries at different levels in the application by clicking on the Work Sessions link in the 3 dots dropdown.

Billing group

Billing groups are a way to group Work Periods. Each Task has an optional Billing Group. You can set defaults at the Product and Feature level. Newly created Tasks will inherit from their defaults

GitHub link

Once you added the repository Url and an access token at the Product level, Products/Features/Tasks will automatically be linked to pushed commits if they mention the key in the commit message. AJIR will try to retrieve a link and a token anywhere in the Product tree (i.e. it can be a parent Product, or a parent of a parent).

git commit -m 't-19 display user name and link'

You can mention as many objects as you want in a commit message.

Alternative method by branch name

When creating a git branch to work on a Task, you can also set the new branch name at the Task level (edit Task) for subsequent commits to be linked to the Task automatically, without having to mention the Task in each commit message.

In local repo, make sure it is up to date with remote:

git checkout master
git fetch origin
git reset --hard origin/master

Create the new branch to work on a specific task and push to remote

git checkout -b branch-name master
git push -u origin branch-name

In AJIR, you can now edit the Task and add the branch name. Future pushed commits will be automatically linked (repository Url and access token must be setup at the Product level, somewhere in the upper Product tree).

Work normally in local repo:

git checkout branch-name
git add *
git commit -m 'message without the need to mention the Task'
git push

Once the Task is done, and you are ready to merge it into the master branch:

git checkout master
git pull
git pull origin branch_name
git push

You can also merge via a Pull Request on GitHub.

Once the branch is merged into the remote repo master branch, you can delete it both in remote and local repos.

git branch --delete branch-name

Job

Coming soon...

Feedback

Feedbacks are created by your products code and assigned to Features, thanks to an easy to use API. It allows your to monitor user feedbacks, bugs and feature requests.

You can create Routes at the Feature level, in order to automatically match Feedbacks to Features with less boilerplate code.

Example in Django Python with a custom 500 handler method:

# store your AJIR token in an environment variable and fetch it in the settings
headers = {
    "Authorization": settings.AJIR_API_KEY,
}

def custom_server_error(request):
    # get named url from path info
    origin_app = resolve(request.path_info).app_name
    origin_url = resolve(request.path_info).url_name
    origin = f"{origin_app}:{origin_url}"
    # get host from absolute Url
    url = request.build_absolute_uri()
    host = request.get_host()
    if host == 'www.prod.com':
        environment = 'prod'
    else:
        environment = 'test'
    
    # POST to the AJIR API with the named Url as origin
    # If this origin has been added to a AJIR Feature, 
    # it will be automatically linked to it. 
    # If not, it will fallback to the feature
    requests.post(
        "https://app.ajir.app/api/feedbacks/",
        headers=headers,
        data={
            "feature": <your fallback feature id>,
            "origin": origin,
            "text": origin,
            "user_id": str(request.user.id),
            "user_email": request.user.email,
            "url": url,
            "feedback_type": "bug",
            'environment': environment,
        },
    )
    return server_error(request)

Help desk

With the same simple API, you can manage your Help desk from AJIR.

When POSTing to AJIR API, just change the feedback_type to 'bug', and ideally fill in the user_email field so you can interact with the user in need of help.

For example, if you create a Task from a Feedback with a user_email, the user will be notified that you took his pain seriously !

If a help desk email is configured for your company, automatic emails will be sent from this email, so that the user can directly answer and interact with your support (company settings available on the home page if you are a superuser for your company).

User feedback and feature request

You can also build a front-end feature to collect feedbacks from your users and send them directly to AJIR via the API, changing the feedback_type to 'feedback' (the default) or 'feature'.

API

Your company's API Token can be found at the bottom of the root products page.

browsable api

documentation

Lionel - April 3, 2023