Profanity Illustration

User Guide

Code Overview


This page gives an overview of the code base, the various modules and their responsibilities.

It was originally written in 2015 and might not be up to date, but can help you navigate the profanity codebase nevertheless.

The main loop

Everything in Profanity happens within a simple loop. When you run:


The main() function is called in:


At the end of main(), a call is made to prof_run() which can be found in:


At time of writing, this function is as follows:

prof_run(const int disable_tls, char *log_level, char *account_name)
    _init(disable_tls, log_level);

    log_info("Starting main event loop");

    char *line = NULL;
    while(cont) {

        line = ui_readline();
        if (line) {
            ProfWin *window = wins_get_current();
            cont = cmd_process_input(window, line);
            line = NULL;
        } else {
            cont = TRUE;


The important sequence of events in the main loop are:

- Check if the user entered a line (ui_readline() at src/ui/core.c).
- If they did, attempt to process the input (cmd_process_input() at src/command.c).
- Check for and handle any incoming XMPP events (jabber_process_events() at src/xmpp/connection.c).
- Refresh the UI (ui_update() at src/ui/core.c).
- Loop



All code related to running user entered commands, for example /who.

Location: src/command

src/command/cmd_defs.c - Command definitions.
src/command/cmd_ac.c - Command autocompletion rules.
src/command/cmd_funcs.c - Command implementation functions


Code related to looking up and storing information in configuration files.

Location: src/config

src/config/account.c - Data structure representing an account.
src/config/accounts.c - Access to the accounts config file.
src/config/preferences.c - Access to the profrc config file.
src/config/theme.c - Access to themes.


Work in progress. The intention is to move all events that could involve a plugin hook into this directory. Currently only a small number of functions have been moved here.

Location: src/event

src/event/client_events.c - Events initiated by Profanity, e.g. connecting, or sending a message.
src/event/server_events.c - Events received from the XMPP server, e.g. an incoming message.
src/event/common.c - Common functions used in both client and server events.

Off The Record Encryption

Code to deal with OTR encryption using the libotr library. Hides the different library version API's from the core Profanity code.

Location: src/otr

OpenPGP Encryption

Code to handle PGP encryption.

Location: src/pgp

OMEMO Encryption

Code to handle OMEMO encryption.

Location: src/omemo

Common Tools

Basic utility functions and common code such as autocomplete implementation.

Location: src/tools

User Interface

All User Interface code, input handling, window rendering etc.

Location: src/ui

src/ui/buffer.c - Buffer of all output, used for redrawing the UI on resize.
src/ui/console.c - Display functions for the console window.
src/ui/core.c - Display functions for most other operations involving the main window area.
src/ui/inputwin.c - Functions to handle the input window (where the user types).
src/ui/notifier.c - Desktop notification functions.
src/ui/occupantswin.c - Functions for rendering the Occupants panel in chat rooms.
src/ui/rosterwin.c - Functions for rendering the Roster panel in the console window.
src/ui/statusbar.c - Drawing the status bar (above the input line).
src/ui/titlebar.c - Drawing the title bar (the top line).
src/ui/window.c - Data structures representing different window types and functions to manipulate them.