# Information Hub

*Last updated: 26 May 2026*

Information Hub is a research data management platform for collecting, storing, analysing, and sharing data. It brings all your project resources into one place so your team can collaborate without moving data between tools.

<figure><img src="/files/kLa2BGU1qro2cMwE3XvB" alt="The Information Hub home screen"><figcaption><p>The Information Hub home screen</p></figcaption></figure>

## Key Features

* **Projects** -- The central building block. Each project groups your data, files, team members, and tools together under one roof.
* **Forms** -- Build mobile-friendly surveys and data capture forms. Collect data in the field, online or offline.
* **Tables** -- Store and manage structured data. Import spreadsheets, edit records, and export in common formats.
* **Dashboards** -- Create visual reports and charts from your tables and forms.
* **Storage** -- Upload and organise files such as images, documents, and datasets.
* **Manager** -- Plan and track work with kanban-style task boards.
* **Wiki** -- Write and share project documentation using rich text and Markdown.
* **Apps** -- Publish shareable, public-facing views of your dashboards, forms, and wiki pages for end-users who do not need a full account.

## How to Access

Information Hub is available as:

* **Web app** -- [app.informationhub.io](https://app.informationhub.io) (works in any modern browser)
* **Progressive Web App (PWA)** -- Install directly from your browser on desktop or mobile
* **Native mobile apps** -- Download "IH" (full app) or "IH Go" (lite, for end-users) from the Google Play Store or Apple App Store

|                    |                                                                     |
| ------------------ | :-----------------------------------------------------------------: |
| Information Hub    | <img src="/files/Z1f2BgRMp8FuWHSc1oHX" alt="" data-size="original"> |
| Information Hub Go | <img src="/files/B0W6oFlZpJjI9kQd3Mfg" alt="" data-size="original"> |

## Quick Links

{% content-ref url="/pages/o4a2yPKUatEb7FWJvc50" %}
[Getting Started](/getting-started)
{% endcontent-ref %}

{% content-ref url="/pages/nkAHo9onJrs2KX4QmTGM" %}
[Home](/home)
{% endcontent-ref %}

{% content-ref url="/pages/tRlmxhYT90VEKoHgqDZW" %}
[Project](/project)
{% endcontent-ref %}

## For AI Agents and LLMs

This documentation is available in machine-readable formats for AI tools and coding agents:

* **llms.txt** -- An index of all documentation pages with titles and URLs. Use this to discover relevant pages quickly.\
  [docs.informationhub.io/llms.txt](https://docs.informationhub.io/llms.txt)
* **llms-full.txt** -- The full content of the entire documentation site in a single file, ready for ingestion as context.\
  [docs.informationhub.io/llms-full.txt](https://docs.informationhub.io/llms-full.txt)
* **Markdown pages** -- Append `.md` to any page URL to retrieve its content as Markdown. For example:\
  `https://docs.informationhub.io/project/forms.md`
* **MCP Server** -- Connect your AI tool (Claude Desktop, Cursor, VS Code, etc.) to the Model Context Protocol endpoint for structured access to these docs:\
  `https://docs.informationhub.io/~gitbook/mcp`

These are provided automatically by GitBook and stay in sync with the published documentation. No configuration is required.

## Contact

For questions or support, reach out at <info@informationhub.io>.

* Website: [informationhub.io](https://www.informationhub.io)
* Privacy Policy: [app.informationhub.io/privacy-policy](https://app.informationhub.io/privacy-policy)
* Terms of Service: [app.informationhub.io/terms-and-conditions](https://app.informationhub.io/terms-and-conditions)


# Getting Started

Welcome to Information Hub. This section covers everything you need to create an account and start using the platform.

## What You Need

* A modern web browser (Chrome, Firefox, Safari, or Edge)
* An internet connection

That is all -- there is nothing to install if you use the web app.

## The Welcome Screen

When you open [app.informationhub.io](https://app.informationhub.io) for the first time, you will see a welcome screen with four options:

| Option                     | What it does                                                               |
| -------------------------- | -------------------------------------------------------------------------- |
| **Login with Email**       | Takes you to the login page where you sign in with your email and password |
| **Register a new Account** | Takes you to the registration page to create a new account                 |
| **Continue with Google**   | Signs you in (or registers you) using your existing Google account         |
| **Continue with Apple**    | Signs you in (or registers you) using your existing Apple account          |

Choose whichever option suits you best. If this is your first time, select **Register a new Account** or one of the social sign-in options.

## Mobile Access

You can also use Information Hub on your phone or tablet:

* **Install as a PWA** -- Open [app.informationhub.io](https://app.informationhub.io) in your mobile browser and use your browser's "Add to Home Screen" or "Install App" option.
* **Download the native app** -- Search for "Information Hub" (full app) or "Information Hub Go" (lite version for end-users) in the Google Play Store or Apple App Store.

## Next Steps

{% content-ref url="/pages/uks8SzSI7vEuvGFC4aLQ" %}
[Create an Account](/getting-started/register)
{% endcontent-ref %}

{% content-ref url="/pages/J0NrwFf18OknfpLdoExX" %}
[Log In](/getting-started/login)
{% endcontent-ref %}


# Create an Account

To use Information Hub you need to create a free account. Follow the steps below to register.

## How to Register

1. Go to [app.informationhub.io](https://app.informationhub.io).
2. Click **Register a new Account** on the welcome screen.
3. Fill in the registration form:
   * **Display Name** - the name other users will see (between 6 and 64 characters)
   * **Email address** - used to log in and receive notifications
   * **Username** - a unique handle for your account (between 6 and 64 characters)
   * **Password** - choose a strong password (between 6 and 64 characters)
4. Use the **eye icon** on the password field to show or hide your password as you type.
5. Click **Register** to create your account.

<figure><img src="/files/fdTSIy2VaO7G2d2j4Rwy" alt="The registration form"><figcaption><p>The registration form</p></figcaption></figure>

{% hint style="info" %}
By clicking **Register** you agree to the Information Hub [Terms of Service](https://app.informationhub.io/terms-and-conditions) and [Privacy Policy](https://app.informationhub.io/privacy-policy). Links to both documents are shown at the bottom of the registration form.
{% endhint %}

Already have an account? Click the **Login** link at the bottom of the form to go to the login page instead.

## Sign Up with Google or Apple

If you prefer, you can register using your existing Google or Apple account instead of filling in the form manually. Click the **Continue with Google** or **Continue with Apple** button on the welcome screen and follow the prompts.

## After Registration

After you submit the form, Information Hub sends a verification email to the address you provided. You will see a verification page confirming that the email has been sent - check your inbox and click the link in the email to verify your address.

{% hint style="info" %}
If you do not see the verification email, check your spam or junk folder.
{% endhint %}

Once your account is verified you can log in and start using Information Hub.

{% content-ref url="/pages/J0NrwFf18OknfpLdoExX" %}
[Log In](/getting-started/login)
{% endcontent-ref %}


# Log In

Once you have an account, you can log in to Information Hub at any time.

## How to Log In

1. Go to [app.informationhub.io](https://app.informationhub.io).
2. Click **Login with Email** on the welcome screen.
3. Enter your **email address** and **password**.
4. Use the **eye icon** on the password field to show or hide your password as you type.
5. Click **Login**.

<figure><img src="/files/2IZeUtMwBEJ8Dq7KgbzM" alt="The login screen"><figcaption><p>The login screen</p></figcaption></figure>

Do not have an account yet? Click the **Register** link at the bottom of the login form to create one.

## Sign In with Google or Apple

You can also sign in using the **Continue with Google** or **Continue with Apple** button on the welcome screen. This works if you originally registered with one of those providers, or if your account email matches.

## Forgot Your Password?

If you have forgotten your password:

1. Click the **Reset** link next to "Forgot password?" on the login screen.
2. Enter the email address linked to your account.
3. Click **Send password reset link**.
4. Check your inbox for a password reset email and click the link inside it.
5. On the reset password page, enter your new password. Use the **eye icon** to show or hide it as you type.
6. Click **Reset password** to confirm. You can then log in with your new password.

{% hint style="info" %}
If you do not see the reset email, check your spam or junk folder.
{% endhint %}

## Verifying Your Email Address

If you arrive at Information Hub by clicking the verification link in your registration email, you will see a confirmation screen letting you know your email address has been verified. From there you can click **Go Back** to return to the welcome screen and log in normally.

## After Login

After signing in you will see your home screen, which shows your projects, organisations, and other resources. From here you can open an existing project or create a new one.

{% content-ref url="/pages/uks8SzSI7vEuvGFC4aLQ" %}
[Create an Account](/getting-started/register)
{% endcontent-ref %}


# Home

After logging in, the home screen is your central hub for navigating Information Hub. From here you can access your recent projects, manage organisations and groups, explore the marketplace, and adjust your account settings.

<figure><img src="/files/kLa2BGU1qro2cMwE3XvB" alt="The home screen"><figcaption><p>The home screen</p></figcaption></figure>

## The home screen

The home screen displays your recent and pinned projects, giving you quick access to the work that matters most. Use the **search bar** at the top to find any project by name.

## Sidebar header

At the very top of the left sidebar, a persistent header is visible on every page while you are logged in:

* **Information Hub logo** - click this at any time to return to your home screen.
* **Connectivity indicator** - a wi-fi icon that shows your current network status. It turns green when you are online and yellow when you are offline. You can also click it to manually toggle the network status.
* **Offline warning icon** - an alert icon that appears when you are collecting data in offline mode (for example, filling a shared form without an internet connection). Click the icon to see information about how to sync your data once you are back online, including a link to the Jobs page where uploads are managed.

## Sidebar navigation

The left sidebar links to all home-level sections:

| Section           | Description                                                                                                              |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------ |
| **Projects**      | View and create projects                                                                                                 |
| **Organisations** | Manage organisations you belong to                                                                                       |
| **Groups**        | Manage groups within organisations                                                                                       |
| **Marketplace**   | Browse and use project templates                                                                                         |
| **Apps**          | Quick access to apps across all your projects                                                                            |
| **Settings**      | Update your profile, password, and API keys                                                                              |
| **Jobs**          | Monitor background tasks like offline data uploads                                                                       |
| **Tutorial**      | Start a guided walkthrough of the current page - this item only appears when a tour is available for the page you are on |
| **Need Help?**    | Opens the Information Hub documentation site in a new tab                                                                |

## Learn more

{% content-ref url="/pages/NoRyRFQ6Lk7sOyLdqoMs" %}
[Projects](/home/projects)
{% endcontent-ref %}

{% content-ref url="/pages/35GDCKUocy8l3PCLM2ix" %}
[Organisations](/home/organisations)
{% endcontent-ref %}

{% content-ref url="/pages/oTlo0LNVtuSt0aZYHkqL" %}
[Groups](/home/groups)
{% endcontent-ref %}

{% content-ref url="/pages/Zmx1YXGM7HtebcIwY2e4" %}
[Marketplace](/home/marketplace)
{% endcontent-ref %}

{% content-ref url="/pages/KkGGtLsNPd5faFJKdUfr" %}
[Apps](/home/apps)
{% endcontent-ref %}

{% content-ref url="/pages/oMzjeDlSqdkk9YAguxuI" %}
[Settings](/home/settings)
{% endcontent-ref %}

{% content-ref url="/pages/j0DZ2vxIWXFKtp1NyPZN" %}
[Jobs](/home/jobs)
{% endcontent-ref %}


# Projects

The Projects page shows all the projects you have access to. This includes projects you own, projects shared with you through organisations or groups, and public projects you have joined.

<figure><img src="/files/kLa2BGU1qro2cMwE3XvB" alt="The projects list on the home screen"><figcaption><p>Your projects on the home screen</p></figcaption></figure>

## Browsing projects

Your projects appear as cards on the home screen. Click on any project card to open it and access its data, forms, tables, and other features.

Use the **search bar** at the top of the page to filter projects by name. This is helpful when you have many projects and need to find a specific one quickly.

In the top-right corner of the page toolbar you will also find:

* **User avatar button** - click your avatar to quickly access your account settings.
* **Connectivity indicator** - shows whether you are currently online or offline. This matches the indicator in the sidebar header and updates automatically as your network status changes.

## Creating a new project

To create a new project:

1. Click the **+** button on the Projects page.
2. Enter a **name** for your project.
3. Select the **owner** — this can be yourself, an organisation, or a group.
4. Set the **visibility** to either public or private.
5. Optionally add a **description** to help others understand the purpose of the project.
6. Click **Create**.

<figure><img src="/files/g5rymWpt4Lki8sD2DMsa" alt="The create project dialog"><figcaption><p>Creating a new project</p></figcaption></figure>

## Project visibility

* **Public** projects are visible to all Information Hub users. Anyone can find and view them.
* **Private** projects are only visible to members who have been explicitly added.

{% hint style="info" %}
You can change a project's visibility later in its settings.
{% endhint %}

## Accessing a project

Click on a project card to open it. Once inside a project, you will see a separate sidebar with project-level navigation including forms, tables, dashboards, and more.


# Organisations

Organisations are groups of users that can own and manage projects together. They are useful for research teams, departments, or any group of people who need to collaborate on shared projects.

<figure><img src="/files/WI2UPvzm8ILMCXNQyOL8" alt="The organisations page"><figcaption><p>The organisations page</p></figcaption></figure>

## Viewing your organisations

The Organisations page shows all the organisations you belong to. Use the **Search Organisations...** bar to filter the list by name as you type. Pull down on the list to refresh it and load the latest data.

If you have not joined any organisations yet, the page shows an empty state with a **Create new organisation** button to get started.

## Creating an organisation

To create a new organisation:

1. On the Organisations page, click the **Create Organisation** button (the plus icon in the top toolbar).
2. Enter an **Organisation Name** - between 3 and 64 characters.
3. Choose a **Visibility** setting (see below).
4. Optionally add a **Description** to explain the organisation's purpose (up to 2048 characters).
5. Click **Create** to finish, or **Cancel** to go back without saving.

### Visibility options

| Option        | Who can see it                                                                                      |
| ------------- | --------------------------------------------------------------------------------------------------- |
| **Private**   | Only members can see the organisation and its content. It will not appear in public search results. |
| **Public**    | Anyone on the platform can find and view the organisation. Other users can request to join.         |
| **Protected** | The organisation is visible in search results, but membership requires an invitation or approval.   |

{% hint style="warning" %}
Organisations cannot be deleted once created. Choose your organisation name and visibility carefully before clicking Create.
{% endhint %}

## Browsing public organisations

To discover organisations you are not yet a member of:

1. On the Organisations page, click the **Browse** button (the compass icon).
2. Use the search bar to filter organisations by name.
3. Pull down to refresh the list at any time.
4. When you find an organisation you want to join, click **Request to join** on that row. Your request will be sent to the organisation's administrators for approval.

{% hint style="info" %}
The Request to join button only appears on rows where you are not already a member.
{% endhint %}

## Organisation settings

If you have the right permissions, you can open the organisation's settings page to update its profile and manage custom roles.

### Updating the organisation profile

**To change the logo:**

* If no logo is set, click **Upload** to choose an image file.
* If a logo is already set, click **Remove** to clear it, or **Upload** to replace it.

**To update the name, visibility, or description:**

1. Edit the **Organisation Name**, **Visibility**, or **Description** fields as needed.
2. Click **Save** to apply your changes, or **Cancel** to revert to the previously saved values.

### Custom roles

The **Role Options** card on the settings page lets you create and manage custom permission roles for your organisation. This card is only shown to users who have the relevant permissions.

**Creating a new role:**

1. Click **Create New Role**.
2. Enter a name for the role in the **New Role Name** field.
3. Click **Create** to save, or **Cancel** to dismiss.

**Updating an existing role:**

1. Click **Update Role**.
2. Select the role you want to edit from the dropdown list - its current permissions will load automatically.
3. Edit the **Role Name** if needed.
4. Toggle individual permissions on or off using the checkboxes.
5. Click **Save** to apply changes, or **Cancel** to dismiss.

**Deleting a role:**

1. Click **Delete Role**.
2. Select the role you want to remove from the dropdown list.
3. Click **Delete** to permanently remove it, or **Cancel** to go back.

{% hint style="warning" %}
Deleting a role is permanent. Make sure no members rely on that role before removing it.
{% endhint %}

## Managing organisation members

Open the **Members** section of your organisation to see everyone who belongs to it.

* Use the **Search Organisation Users...** bar to filter members by name in real time.
* Pull down to refresh the list.
* Click on any member's name or avatar to navigate to their profile page.

### Changing a member's role

1. Find the member in the list and click the **ellipsis (...)** icon on their row.
2. Select **Edit Role** from the menu.
3. In the modal that opens, select the new role from the **Organisation Role** dropdown.
4. Click **Update** to save, or **Cancel** to dismiss.

### Removing a member

1. Find the member in the list and click the **ellipsis (...)** icon on their row.
2. Select **Remove** from the menu.
3. In the confirmation modal, click **Remove** to confirm, or **Cancel** to go back.

{% hint style="info" %}
The ellipsis menu only appears if you have permission to manage members.
{% endhint %}

## Inviting a user to your organisation

1. From the Members section, click the **Add User** button (the plus icon in the toolbar).
2. On the Add User page, start typing the person's name or email address in the **User Info / email address** field. A suggestion list appears as you type.
3. Click the correct person in the suggestion list to select them. The input field will be replaced by their details.
4. If you selected the wrong person, click **Reset** to clear the selection and start again.
5. Click **Add User** to send the invitation.

{% hint style="info" %}
The Add User button is only visible to users with permission to add members to the organisation.
{% endhint %}

## Organisation groups

Organisations can contain groups - sub-teams that help you control access to specific projects. To view the groups in an organisation, open the **Groups** section.

* Use the **Search Organisation Groups...** bar to filter by name.
* Pull down to refresh the list.
* Click on any group to open it.

### Creating a group within an organisation

1. Click the **Create Group** button (the plus icon in the toolbar).
2. Enter a **Group Name** - between 3 and 64 characters.
3. Optionally add a **Description**.
4. Choose a **Visibility** - Private, Public, or Protected (same options as for organisations, described above).
5. Click **Create** to save, or **Cancel** to go back.

### Requesting to join a group

If you are not already a member of a group listed in the organisation, a **Request to join** button will appear on that row. Click it to send a join request to the group's administrators.

{% content-ref url="/pages/oTlo0LNVtuSt0aZYHkqL" %}
[Groups](/home/groups)
{% endcontent-ref %}


# Groups

Groups are sub-teams within organisations. They let you organise members into smaller teams and control which users have access to specific projects.

<figure><img src="/files/0c4LEGR9PUQK5senXslX" alt="The groups page"><figcaption><p>The groups page</p></figcaption></figure>

## How groups work

Every group belongs to an organisation. Groups are useful when an organisation has many members and different people need access to different projects. You can create custom roles, manage membership, and control who can see the group using visibility settings.

***

## Viewing your groups

Navigate to **Groups** in the home sidebar to open the groups list at `/home/groups`. This page shows all the groups you currently belong to.

* Use the **Search Groups** bar to filter the list by name in real time.
* Pull down on the list to refresh it and pick up any recent changes.
* Click any group in the list to open it.

***

## Creating a group

You can create a group from the home Groups page. If you are already inside an organisation, you can also create a group directly from that organisation's Groups tab - see the note at the bottom of this section.

### From the home Groups page

1. On the Groups page, click the **Create Group** button (the plus icon in the top toolbar).
2. In the **Owner** field, select the organisation that will own this group. The dropdown lists all organisations you belong to.
3. Enter a **Group Name** (3 to 64 characters).
4. Choose a **Visibility** setting:
   * **Private** - only members of the group can see it. It will not appear in public browse results.
   * **Public** - anyone can find and view the group. Other users can request to join.
   * **Protected** - the group is visible in search results, but joining requires an invitation from a group manager.
5. Add an optional **Description** (up to 2048 characters) to explain the group's purpose.
6. Click **Create** to finish, or **Cancel** to go back without saving.

{% hint style="info" %}
The **Create** button stays disabled until you have filled in all required fields. If it appears greyed out, check that you have selected an owner and entered a valid group name.
{% endhint %}

### From an organisation's Groups tab

You can also create a group from inside an organisation. Open the organisation, go to its **Groups** tab, and click **Create Group**. The form works the same way, except there is no Owner field - the organisation is already set automatically.

***

## Browsing public groups

To discover groups you are not yet a member of, click the **Browse** button (compass icon) on the Groups page. This opens the public groups browser.

* Use the search bar to filter groups by name.
* Pull down to refresh the list.
* If you find a group you want to join, click **Request to join** next to it. The group's managers will be notified and can approve or decline your request.

{% hint style="info" %}
The **Request to join** button only appears for groups you are not already a member of.
{% endhint %}

***

## Group settings

To open a group's settings, navigate into the group and select **Settings**.

### Group logo

* If no logo has been set, click **Upload** to choose an image file.
* If a logo is already set, click **Remove** to delete it.

### General details

You can update the group's **Name**, **Visibility**, and **Description** at any time. The same visibility options apply as when creating a group (Private, Public, Protected).

Click **Save** to apply your changes, or **Cancel** to revert to the last saved state.

### Custom roles

The **Role Options** card lets you create and manage custom roles for the group. Custom roles allow you to define exactly which actions each type of member can perform.

**Create a new role**

1. Click **Create New Role**.
2. Enter a name for the role in the **New Role Name** field.
3. Click **Create**.

**Update an existing role**

1. Click **Update Role**.
2. Select the role you want to edit from the dropdown.
3. Edit the **Role Name** if needed.
4. Use the checkboxes to turn individual permissions on or off.
5. Click **Save**.

**Delete a role**

1. Click **Delete Role**.
2. Select the role you want to remove from the dropdown.
3. Click **Delete** to confirm.

{% hint style="warning" %}
Deleting a role is permanent. Make sure no members are relying on that role before you remove it.
{% endhint %}

### Delete group

At the bottom of the settings page is the **Delete Group** section. Clicking **Delete** permanently removes the group and all its membership data. This action cannot be undone.

{% hint style="warning" %}
Deleting a group is irreversible. All members will lose access immediately.
{% endhint %}

***

## Managing group members

Open the group and navigate to the **Users** tab to see the full list of members.

* Use the **Search Group Users** bar to find a specific member.
* Pull down to refresh the list.
* Click a member's name or avatar to go to their profile page.

### Changing a member's role

1. Find the member in the list and click the **ellipsis (...)** icon next to their name.
2. Select **Edit Role** from the menu.
3. In the modal that opens, choose a new role from the dropdown.
4. Click **Update** to save, or **Cancel** to close without making changes.

### Removing a member

1. Find the member in the list and click the **ellipsis (...)** icon next to their name.
2. Select **Remove** from the menu.
3. Confirm the action in the modal by clicking **Remove**, or click **Cancel** to go back.

{% hint style="warning" %}
Removing a member revokes their access to all projects associated with the group immediately.
{% endhint %}

***

## Inviting a user to a group

1. On the group's **Users** tab, click the **Add user** button.
2. On the Add User page, start typing the person's name or email address. A suggestion list appears as you type.
3. Click the correct person in the suggestion list to select them. The search field will be replaced with the selected user's details.
4. If you selected the wrong person, click **Reset** to clear the selection and search again.
5. Click **Add User** to send the invitation.

{% hint style="info" %}
The **Add User** button stays disabled until a valid user has been selected from the suggestion list.
{% endhint %}


# Marketplace

The Marketplace is where you can browse project templates shared by other users on the platform. Templates let you start a new project with pre-built forms, tables, and configurations instead of building everything from scratch.

<figure><img src="/files/cOMFrPNBJl7vAZ524Y7p" alt="The marketplace"><figcaption><p>The marketplace</p></figcaption></figure>

## Browsing templates

The Marketplace displays all available project templates as cards. Use the **search bar** at the top to filter templates by name. Each card shows a description of what the template contains.

## Using a template

1. Type in the search bar to find a template, or scroll through the available cards.
2. Click a template card to open the template project and review its forms, tables, and structure.
3. When you are ready, click **Copy Project** in the template to create your own project based on it.

The new project will include all the forms, tables, and structure from the template. You can then customise it to suit your specific requirements.

## Sharing your own template

You can turn any of your projects into a template that others can use:

1. Make your project **public** in the project settings.
2. Enable the **template** setting in your project settings.

Once enabled, your project will appear in the Marketplace for other users to discover and copy.

{% hint style="info" %}
Making your project public makes it discoverable in the Marketplace, but project content (tables, forms, dashboards) remains accessible to invited members only. When someone copies your template, they receive a new private project. Whether your existing row data and storage files are included depends on what they select in the copy dialog.
{% endhint %}


# Apps

The Apps page gives you quick access to all the apps created across your projects, in one place.

<figure><img src="/files/I9pfWbApk2zoLfauaeq1" alt="The apps page"><figcaption><p>The apps page</p></figcaption></figure>

## What are apps?

Apps are custom interfaces built within projects. They can be used for data collection, visualisation, or other workflows. While apps are created and configured inside individual projects, the home-level Apps page collects them all together for convenience.

## Using the Apps page

The page lists all apps from every project you have access to. Click on any app to open it directly.

{% hint style="info" %}
To create or configure an app, go to the **Apps** section inside a specific project.
{% endhint %}

{% content-ref url="/pages/nXn9i3aehqIlRxsjeTOd" %}
[Apps](/project/apps)
{% endcontent-ref %}


# Settings

The Settings page lets you manage your account details, security, and API access.

<figure><img src="/files/BIlvfa2jsbVOAFdJV2O9" alt="Account settings"><figcaption><p>Account settings</p></figcaption></figure>

## Account settings

Update your personal information:

* **Name** - change your display name.
* **Username** - change your unique username.
* **Profile picture** - upload or update your profile photo.

## Security

Under the security section you can **change your password**. Choose a strong, unique password to keep your account secure.

## API keys

If you need to access Information Hub programmatically (for example, from a script or external tool), you can generate **API keys** here.

The API Keys section lists all your existing keys with their names. You can have up to **5 API keys** at a time.

### Creating a key

1. Navigate to the **API keys** section in Settings.
2. Click **Create** to open the Create API Key dialog.
3. Enter a **Name** (required) and an optional **Description**.
4. Click **Create**.

{% hint style="warning" %}
After creating a key, open it immediately using the View option and copy the full key value. You cannot retrieve the full value again without opening the View dialog.
{% endhint %}

### Managing existing keys

Click the **ellipsis menu** (three dots) on any API key to see the following options:

* **View** - opens a dialog showing the full key value. Use the **Copy** button to copy it to your clipboard.
* **Edit** - change the key's name or description.
* **Delete** - permanently removes the key.

{% hint style="warning" %}
Treat API keys like passwords. Do not share them publicly or commit them to code repositories.
{% endhint %}

## Account visibility

Control whether your profile is visible to other users:

* **Public** - other users can find your profile and see your public projects.
* **Private** - your profile is hidden from search and discovery.

## Advanced

The Advanced section gives you manual control over the app's local state and update behaviour.

* **Go Offline / Go Online** - manually override your network status. This is useful for testing offline functionality or forcing the app to use cached data. The button label changes to match the action available.
* **Clear Cache** - removes locally stored data, including browser cache and offline data. Use this if the app is behaving unexpectedly or showing stale information.
* **Clear job history** - removes the locally cached job queue. Only use this if you are certain that all your offline form submissions have already been uploaded successfully.
* **Check For Updates** - checks whether a newer version of the app is available (web version only) and prompts you to refresh if an update is found.

{% hint style="warning" %}
Clearing the job history removes locally stored offline submissions. Only do this if you are sure your data has already been uploaded.
{% endhint %}

## Deleting your account

To request account deletion, click the **Delete Account** link at the bottom of the Settings page. This opens a pre-filled email to the Information Hub admin with your account details included. Send the email to submit your deletion request.


# Jobs

The Jobs page is where you monitor and manage background operations on your account. When you submit forms offline, trigger a data import, or perform other background operations, each operation becomes a **job**. Once you are back online, jobs are processed automatically and you can track their progress here.

<figure><img src="/files/qsm3AM0zxSQTStJaL77m" alt="The jobs page"><figcaption><p>The jobs page</p></figcaption></figure>

## Navigating the Jobs section

The Jobs section has three pages, accessible from the sidebar:

* **Overview** - shows your pending and queued jobs.
* **Manager** - shows jobs that have failed.
* **History** - shows all completed and processed jobs.

Click the sidebar links to move between these pages.

## Overview - pending jobs

The Overview page lists jobs that are waiting to be processed. Click a job row to expand it and see the full job details.

Use the **ellipsis menu** (three dots) on any job row for two options:

* **Execute** - run the job immediately (useful if you want to retry or process a job without waiting).
* **Download** - save the job data and any associated files as a ZIP archive to your device.

There is also a **View Cache** link on the Overview page that takes you directly to the History page.

## Manager - failed jobs

The Manager page lists jobs that encountered an error during processing. Click a row to expand it and read the error details.

Use the **ellipsis menu** on a failed job to:

* **Execute** - retry the failed job.
* **Download** - save the job data as a ZIP.

There is a **View Cache** link on this page that takes you to the History page.

{% hint style="info" %}
Most failures are caused by a network interruption. Check your connection and use Execute to retry the job.
{% endhint %}

## History - completed jobs

The History page shows all jobs that have finished processing. Click a row to expand it and view the full details of the completed operation.

Use the **ellipsis menu** to Download any completed job's data.

{% hint style="info" %}
Most jobs complete automatically. You only need to visit this page if you want to check on pending uploads or troubleshoot a failed job.
{% endhint %}


# Project

When you open a project in Information Hub, a **project sidebar** appears on the left side of the screen. This sidebar gives you access to all the modules available within your project.

<figure><img src="/files/6MUZPZObKXk53VEbUWev" alt="A project&#x27;s sidebar navigation"><figcaption><p>The project sidebar</p></figcaption></figure>

### Sidebar header

At the top of the project sidebar, you will see the project logo or avatar. If the project is owned by an organisation or group, a link to that organisation or group also appears here, letting you navigate back to the owner quickly.

### Permission-gated navigation

Not every sidebar link is visible to all users. Which modules appear depends on your role in the project. For example, a Submitter may only see Forms, while an Admin sees every module. If a link is missing, you may not have permission to access that module.

{% hint style="info" %}
If you cannot see a module you expect, ask your project Admin to check your role and permissions.
{% endhint %}

## Project modules

| Module         | Description                                                       |
| -------------- | ----------------------------------------------------------------- |
| **Overview**   | Your project's landing page with key information and quick links  |
| **Dashboards** | Visualise your data with charts, maps, and other components       |
| **Forms**      | Build data collection forms for fieldwork and surveys             |
| **Tables**     | View, edit, and analyse your collected data in spreadsheet format |
| **Storage**    | Upload and manage files associated with your project              |
| **Manager**    | Organise project tasks on a kanban-style board                    |
| **Wiki**       | Write and share documentation, protocols, and guides              |
| **Apps**       | Create public-facing views of your project data                   |
| **Users**      | Manage team members and their access permissions                  |
| **Settings**   | Configure project name, description, visibility, and more         |

## Learn more

{% content-ref url="/pages/tO4niq6Lf5N1YpMfbcF6" %}
[Overview](/project/overview)
{% endcontent-ref %}

{% content-ref url="/pages/r4RmtEoTZGzlnAzC2H7K" %}
[Dashboards](/project/dashboards)
{% endcontent-ref %}

{% content-ref url="/pages/cWbd3eSAqaKrrsRWkn9H" %}
[Forms](/project/forms)
{% endcontent-ref %}

{% content-ref url="/pages/yEX2YFJrUQEA7oKR5CLy" %}
[Tables](/project/tables)
{% endcontent-ref %}

{% content-ref url="/pages/mnZzo1RyR0yzH5hAb5L9" %}
[Storage](/project/storage)
{% endcontent-ref %}

{% content-ref url="/pages/lu1PWoy78vJn4Y2fs714" %}
[Manager](/project/manager)
{% endcontent-ref %}

{% content-ref url="/pages/qgmWrESC8oPyIswsTRj7" %}
[Wiki](/project/wiki)
{% endcontent-ref %}

{% content-ref url="/pages/nXn9i3aehqIlRxsjeTOd" %}
[Apps](/project/apps)
{% endcontent-ref %}

{% content-ref url="/pages/L1PZ77bDEnUrZzlVZWE3" %}
[Users](/project/users)
{% endcontent-ref %}

{% content-ref url="/pages/4txSgdVmdvmodUHGcwSm" %}
[Settings](/project/settings)
{% endcontent-ref %}


# Overview

The Overview page is the first thing you see when you open a project. It gives you a summary of your project and quick access to all its modules.

<figure><img src="/files/mOKvaPl8jSSwAiCcHrjg" alt="Project overview for Fynbos in Siberia"><figcaption><p>The project overview page</p></figcaption></figure>

## What you will find here

* **Project name and description** - the title and summary you set when creating the project.
* **Key stats** - a quick snapshot of your project's activity, such as the number of forms, tables, and team members.
* **Module shortcuts** - click any module card to jump straight to Dashboards, Forms, Tables, Storage, and more.

## Copying a template project

If the project is marked as a template, a **Copy Project** button appears in the top toolbar. Clicking it lets you create your own copy of the project structure - including forms, tables, dashboards, and other modules. You can choose exactly what to copy on the settings page that opens.

{% hint style="info" %}
See [Project Settings](/project/settings) for the full set of copy options, including whether to include existing data alongside the structure.
{% endhint %}

## Quick Start card

On smaller screens (such as phones or narrow browser windows), a **Quick Start** card appears on the Overview page. It provides a shortcut to every project module - Dashboards, Forms, Tables, Storage, Manager, Wiki, Apps, Users, and Settings - so you can navigate quickly without using the sidebar.

## Resources card

The **Resources** card shows how many dashboards, forms, tables, and other items already exist in your project, with a direct link to each module. This card only appears once your project has at least one resource - it is hidden on a brand-new empty project.

## Getting started

If you have just created a new project, the Overview page is a good starting point. From here you can:

1. Review your project description and update it if needed (via [Settings](/project/settings)).
2. Navigate to [Forms](/project/forms) to start building data collection tools.
3. Open [Tables](/project/tables) to view or import data.
4. Invite team members through [Users](/project/users).

{% hint style="info" %}
The Overview page updates automatically as you add forms, tables, and other content to your project.
{% endhint %}


# Dashboards

Dashboards let you visualise your project data using charts, maps, tables, and other components. Each dashboard connects to one or more of your project's tables as data sources, and you can arrange multiple visual components on the same page. Use dashboards to monitor field data, share summaries with stakeholders, or explore patterns across your data.

<figure><img src="/files/RbEIlHQjLOThoURKcV4f" alt="The dashboards page"><figcaption><p>The dashboards page</p></figcaption></figure>

***

## Creating a dashboard

1. Open the **Dashboards** module from the project sidebar.
2. Click **Create Dashboard** in the top-right toolbar.
3. Enter a name for your dashboard (3-64 characters).
4. Click **Create**.

Your new dashboard appears in the list, ready for you to connect data and add components.

***

## Managing dashboards

The dashboards list shows all dashboards in your project.

* **Search** - use the search bar at the top of the list to filter dashboards by name.
* **Open a dashboard** - click any dashboard in the list to open it.
* **Options menu** - click the three-dot (**...**) button on any dashboard row to access:
  * **Settings** - change the dashboard name, visibility, and sharing options.
  * **Delete** - permanently remove the dashboard.

***

## Setting up data sources

Before you can add visual components, you need to connect at least one project table as a data source. Data sources control which columns are available to your components and how the data is aggregated.

### Adding a data source

1. Open your dashboard.
2. Click **Manage Data Source** in the dashboard toolbar.
3. Click **Add Data Source**.
4. Set the **Data Source Type** to **Table**.
5. Enter a **Data Source Name** (required) and an optional description.
6. Select the project table you want to connect.
7. Click **Test Connection** to verify the link to the table.
8. Click **Create**.

You can add as many data sources as you need. Each component you create can draw from any data source on the dashboard.

### Configuring a data source

After creating a data source, click it in the list to open its configuration. There are two tabs:

**Configuration tab**

The configuration tab has two sections:

* **General** - edit the data source name and description, then click **Save**.
* **Configure data source** - a table lists every column from the connected table. For each column you can:
  * **Enable/disable** - uncheck a column to hide it from all components.
  * **Rename** - type a display name in the rename field to show a friendlier label in your components.
  * **Aggregate** - set an aggregation method for the column: None, Count, Average, or Sum.

Click **Save** in the Configure data source section to apply your changes.

**Preview tab**

The Preview tab shows a read-only table of the data as it will appear to your components. Use this to confirm that your column settings look correct before building components.

{% hint style="info" %}
Renaming a column in a data source only changes how it appears in dashboards - it does not affect the underlying table or any forms linked to it.
{% endhint %}

***

## Dashboard components

Components are the individual visual elements on your dashboard. You can add as many components as you need and arrange them side by side or stacked.

### Component types

#### Bar chart

Displays data as vertical or horizontal bars. Configure:

* **Datasource** - the data source to draw from.
* **Calculation** - how to aggregate the data: Count, Average, Count Distinct, or Sum.
* **Dimension (X-Axis)** - the column whose values appear along the horizontal axis.
* **Metric Column (Y-Axis)** - one or more columns whose aggregated values set the bar heights. Click **Add Column** to add more metric columns.

#### Line chart

Displays data as a continuous line. Configuration is identical to the bar chart: select a datasource, calculation, dimension (x-axis), and one or more metric columns (y-axis).

#### Time Series

A line chart with a time-based x-axis. Use this when your dimension column contains dates or timestamps. Configuration is the same as the line chart.

#### Scatter chart

Plots individual data points on a two-axis grid. Configure:

* **Datasource** - the data source to draw from.
* **X-axis** - the column for the horizontal axis.
* **Y-axis** - the column for the vertical axis.
* **Category** (optional) - a column used to colour-code points by category.

#### Scorecard

Displays a single calculated value prominently - useful for totals, averages, or record counts. Configure:

* **Datasource** - the data source to draw from.
* **Calculation** - Count, Average, Count Distinct, or Sum.
* **Column** - the column to apply the calculation to.

#### Table

Shows data in rows and columns. Configure:

* **Datasource** - the data source to draw from.
* **Columns** - click **Add Column** to add each column you want to display. For each column, select which datasource column it should show. Click **remove** to remove a column from the list.
* **User ID column** (optional) - link a column to the logged-in user.

#### Filter

Lets viewers filter other components on the dashboard interactively. Configure:

* **Datasource** - the data source to draw from.
* **Column** - the column whose distinct values become the filter options.

When a viewer selects a value from the filter, all other components on the dashboard that share the same data source update to show only matching records. Click the **X** on the filter widget to reset it.

#### Map

Displays geographic data on an interactive map. A map component can have multiple layers. For each layer, configure:

* **Layer Name** - a label for the layer.
* **Type** - choose from:
  * **Point Map** - plots a dot for each record that has latitude and longitude values. Optionally select a column for location images and one or more columns for information shown in the info window when a point is clicked.
  * **Heatmap** - renders a colour-density overlay based on the concentration of points.
  * **KML** - overlays a KML file. Enter a KML URL or select a file from your project storage.
* **Datasource** (Point Map and Heatmap) - the data source to draw from.
* **Latitude column** and **Longitude column** - the columns containing coordinate values.

Click **Add Table to Map** to add another layer. Click **Remove Layer** to delete a layer.

#### Embedded

Displays custom HTML content inside the component. Paste any HTML into the **Chart HTML** field - this can include iframes, custom charts, or any other embeddable content.

#### Google Earth Engine

Embeds a Google Earth Engine application. Enter the GEE App URL in the **Earth Engine App URL** field.

***

## Adding a component

1. Open your dashboard.
2. Click **Create Component** in the toolbar.
3. Select a **Type** from the dropdown.
4. Fill in the configuration fields for that component type (see Component types above).
5. Set the **Column Width** using the slider (1-12). A width of 12 spans the full page width; lower values place components side by side.
6. Set the **Height** using the slider (applies to most types except Filter and Scorecard).
7. Click **Create**.

***

## Editing and deleting components

To edit a component, click the **gear icon** on the component card. The edit dialog opens with the same fields as when you created it. Make your changes and click **Update**.

To delete a component, open the same edit dialog and click **Delete**.

{% hint style="warning" %}
Deleting a component is permanent. There is no undo.
{% endhint %}

***

## Map features

Map components have additional controls in the dashboard toolbar when you are viewing them:

* **Toggle Layers** - opens a panel where you can show or hide individual map layers by checking or unchecking them.
* **Heatmap options** - opens controls to adjust the heatmap appearance:
  * **Radius** - the size of each point's influence (5-50).
  * **Opacity** - the transparency of the heatmap layer (0-1).
  * **Max Intensity** - caps the colour scale so that very dense areas do not wash out surrounding ones.
  * **Dissipating** - toggle to enable or disable the fading effect as you zoom in.

Clicking a point marker on a Point Map opens an info window showing the data from that record, including any information columns you configured for that layer.

***

## Dashboard settings

To open settings, click **Settings** in the dashboard toolbar, or use the three-dot menu from the dashboards list.

| Setting            | Description                                                                                                         |
| ------------------ | ------------------------------------------------------------------------------------------------------------------- |
| **Dashboard Name** | The display name for the dashboard.                                                                                 |
| **Visibility**     | Private, Public, or Protected - controls who can see the dashboard within the platform.                             |
| **Allow Sharing**  | When turned on, the dashboard gets a public URL that anyone can view without logging in.                            |
| **Preview**        | Opens the public view of the dashboard so you can see what a visitor will see. Only shown when Allow Sharing is on. |
| **Delete**         | Permanently removes the dashboard and all its components.                                                           |

Click **Save** to apply name and visibility changes. Click **Reset** to discard unsaved changes.

***

## Sharing a dashboard

To share a dashboard publicly:

1. Open the dashboard settings and turn on **Allow Sharing**.
2. Click **Save**.
3. Return to the dashboard and click **Share** in the toolbar.
4. Copy the public link from the share popover.

Anyone with the link can view the dashboard without needing to log in. They cannot edit the dashboard or access any other part of your project.

{% hint style="info" %}
Dashboards update automatically when the underlying table data changes. Viewers of the public link always see the latest data.
{% endhint %}


# Forms

Forms let you collect data from users - whether they are in the field on a mobile device, working from a desktop, or submitting responses remotely via a shared link. Every form is linked to a table in your project, so each question on the form maps directly to a column in that table. When someone submits a form, a new row is added to the linked table automatically.

## Before you start

Before you can create a form, you need:

1. **A table** - this is where the form data will be stored. Create one from the Tables page in your project sidebar.
2. **Storage (optional)** - if your form will include file upload questions, make sure your project has storage set up.

<figure><img src="/files/cyOGPcahScjacSaykuTm" alt="The forms list in a project"><figcaption><p>The forms page</p></figcaption></figure>

## What you can do with forms

* Design custom forms with different question types (text, numbers, dropdowns, GPS location, and more)
* Collect data offline and sync it later when you have internet access
* Share forms via a link so anyone can submit responses
* Customise the look and feel of your forms with colours and layouts

## Managing forms in the list

Each form in the list has an **options menu** - click the three-dot (ellipsis) button on the right side of the form row to open it. The options menu gives you quick access to:

* **Share** - opens the public share URL for the form (only available for Insert-type forms when sharing is enabled)
* **Settings** - navigates to the form's settings page
* **Delete** - permanently removes the form

## In this section

{% content-ref url="/pages/lJ17Ralz8TxgCoPYGATv" %}
[Create a Form](/project/forms/create-form)
{% endcontent-ref %}

{% content-ref url="/pages/cQqMereCuF9B3pU7LrD8" %}
[Question Types](/project/forms/question-types)
{% endcontent-ref %}

{% content-ref url="/pages/bzmiS2UBrU9ndbETax9o" %}
[Form Settings](/project/forms/form-settings)
{% endcontent-ref %}

{% content-ref url="/pages/KD2x5QhQeAp986WNaZAs" %}
[Offline Forms](/project/forms/offline-forms)
{% endcontent-ref %}

{% content-ref url="/pages/wpzN1fOjE9RsvnyiQScp" %}
[Share a Form](/project/forms/share-form)
{% endcontent-ref %}

{% content-ref url="/pages/ggBM9b5WhWGwftMOmHFQ" %}
[Delete a Form](/project/forms/delete-form)
{% endcontent-ref %}


# Create a Form

This page walks you through creating a new form in your project and building it out with sections and questions.

## Step 1 - Create the form

1. Open your project and click **Forms** in the project sidebar.
2. Click the **Create Form** button in the top-right corner.
3. Enter a **name** for your form (3 to 64 characters).
4. Select the **Form Type**:
   * **Insert** - the default type. Each submission creates a new row in the linked table. Use this for collecting new observations, records, or entries.
   * **Update** - each submission edits an existing row in a linked table. When you choose Update, you must also select the **table** to update and tick the **columns** you want the form to be able to edit.
5. Click **Create**.

<figure><img src="/files/GBc2Wcqk6LsDZ10fCQyE" alt="The create form page"><figcaption><p>Creating a new form</p></figcaption></figure>

The form builder opens. You will see an empty form with the name you chose as the header.

{% hint style="info" %}
For Update-type forms, the table picker and column checklist appear as soon as you select "Update". Tick only the columns you want respondents to be able to change.
{% endhint %}

## Step 2 - Add sections

Forms are organised into **sections**. Each section can contain one or more questions. Sections help you group related questions together and make longer forms easier to navigate.

1. Click **CLICK HERE TO ADD A NEW SECTION** at the bottom of the page to add your first section.
2. Click the **section name** to enter inline edit mode - type a name (e.g. "Observation Details") and click **Save** to confirm, or **Delete** to remove the section entirely.

<figure><img src="/files/ZK3uDNoI4811akMGg8NK" alt="The form builder with a section"><figcaption><p>The form builder in edit mode</p></figcaption></figure>

## Step 3 - Add questions

To add a question within a section:

1. Click **CLICK HERE TO ADD A QUESTION** inside the section.
2. Click the question name to enter edit mode and type your question label - this is what the person filling in the form will see.
3. Choose a **question type** from the Type dropdown (see [Question Types](/project/forms/question-types) for the full list).
4. Click **Save to table** to choose the table this question's answer will be stored in. If the table you need does not exist yet, click **Create Table** in the picker to create one without leaving the form builder.
5. Click **Save to column** to choose the specific column. If the column does not exist, click **Create column** in the picker to add a new column to the linked table.
6. Click **Save** to save the question, or **Delete** to remove it.

## Configuring question properties

Each question has a set of toggles and settings you can adjust:

* **Required** - makes the question mandatory. The form cannot be submitted without an answer.
* **Hidden** - hides the question from the person filling in the form. Useful for metadata or default values.
* **Locked** - prevents respondents from changing the pre-filled value. Use this when you want to display information without letting the respondent edit it.

### Expanded configuration panel

Click the **cog icon** on a question card to open its expanded configuration panel. This gives you access to:

* **URL Query Param Key** - if you set a key here, the field will be pre-filled automatically when the form URL includes a matching query parameter (e.g. `?site=plot-42`).
* **Default value** - a value that is pre-filled when the form loads, which the respondent can then change (unless the question is Locked).
* **Icon Type** - selects the icon shown alongside this question in "Icons and Text" layout forms. Options include Camera, Video, Text, Audio, Location, Help, Tag, Paperclip, Split, and Merge.
* **Icon Text** - the label shown next to the icon in icon-layout forms.

### Short text question - extra options

Short text questions have additional length controls in the expanded panel:

* **Min length / Max length** - restricts the number of characters allowed.
* **Min words / Max words** - restricts the number of words allowed.

### Dropdown, Multi-Radio, and Multi-Checkbox questions - options list

For these question types, you manage the list of available choices directly in the question card:

* Click an option label to edit its text inline.
* Click **Remove** next to an option to delete it.
* Drag the reorder handle to change the order of options.
* Click **Add Option** (or **Add Multi-Option**) to add a new blank option.
* For Dropdown questions only, toggle **Allow new items** to let respondents type a custom value that is not in the predefined list.

## Reordering sections and questions

To reorder sections or questions after you have built the form, use the **Reordering** card in Form Settings (see [Form Settings](/project/forms/form-settings)).


# Question Types

Each question on a form corresponds to a column in the linked table. When someone submits the form, their answer is stored in that column. The available question types cover the most common data formats used in field research and data collection.

## Text types

### Short (single-line text)

A single-line text input. Use this for short answers such as names, codes, or brief notes. You can set minimum and maximum character counts, and minimum and maximum word counts, in the question's expanded configuration panel.

### Paragraph (multi-line text)

A multi-line text area for longer responses - notes, descriptions, or observations that need more space than a single line. You can set a maximum character count.

### JSON

A text area that accepts JSON-formatted data. The input is validated against JSON syntax before the form can be submitted. Use this when you need to collect structured or nested data in a single field.

## Numeric types

### Number

A numeric input field. Accepts integers or decimal values. You can set minimum and maximum values in the question properties to restrict the range of accepted answers.

## Choice types

### Dropdown

A selection field where the person picks one option from a predefined list. Options are managed in the form builder. If you enable **Allow new items**, respondents can also type a custom value that is not in the list.

### Multi-Radio

A radio button list where the respondent chooses exactly one option. Use this when you want the choices to be visible all at once rather than hidden in a dropdown.

### Multi-Checkbox

A checkbox list where the respondent can select any number of options. Use this for "select all that apply" questions.

### Yes / No

A simple boolean toggle. Use this for true/false or yes/no questions - for example, "Was the specimen collected?"

## Date and time types

### Date

A date picker. The respondent selects a date from a calendar. Useful for recording observation dates, collection dates, or deadlines.

### Time

A time picker. The respondent selects a time of day. Useful when you need to record when an event occurred.

## Location type

### Location

Captures GPS coordinates (latitude and longitude). When filling in a Location question:

* An **interactive map** is displayed - tap or click anywhere on the map to place a marker. The latitude and longitude fields update automatically.
* Click **Use Current Position** to use the device's GPS to place the marker at your current location.
* Toggle **Edit coordinates** to switch to manual entry mode, where you can type the latitude and longitude values directly.

On mobile, Location questions can also be presented as an icon button that opens a full-screen location modal. Click **Done** to confirm the coordinates, or **Close** to cancel.

A Location question links to a single column in the table. The stored value is a comma-separated `latitude,longitude` string (e.g. `62.0355,129.6753`). To store latitude and longitude separately, use two **Number** questions instead.

## Media and file types

### File Upload

A file upload field. Respondents can attach images, videos, audio recordings, or general files. Uploaded files are stored in your project's **Storage** - make sure your project has storage configured before using this question type.

When filling in a File Upload question, the following buttons appear:

| Button      | What it does                                             |
| ----------- | -------------------------------------------------------- |
| File icon   | Opens the device's native file picker to select any file |
| Camera icon | Opens the device camera to take a photo                  |
| Video icon  | Opens a video recording modal                            |
| Mic icon    | Records an audio clip using the device microphone        |
| "more"      | Opens the general upload modal with all options          |

After a file is uploaded:

* Each uploaded file appears in the list with a clickable link or thumbnail. Clicking it opens the file in a new tab.
* An **external link** icon opens the file in a new tab when you are online.
* A **trash** icon removes that specific file from the upload.
* The **Clear** button (danger) removes all uploaded files for the question at once.

In the form builder, File Upload questions have a **File Path** configuration (visible when creating the linked column). This sets where uploaded files are stored in your project's Storage. You can use dynamic path templates to organise files automatically - see [Super: Programmatic Access](/tutorial/super) for details.

### QR Code

Opens the device camera to scan a QR code or barcode. The scanned value is stored as text in the linked column. The camera preview opens automatically and reads codes without requiring a button press.

QR Code questions are useful for:

* Tracking plant or sample specimens tagged with QR code labels
* Scanning equipment serial numbers
* Recording batch or lot codes in field data collection

{% hint style="info" %}
QR Code questions require camera permission on the device. The code is read automatically when the camera detects it - no shutter button is needed.
{% endhint %}

## Auto-filled types

### User Info

Automatically fills in details about the logged-in user (such as their name or user ID). Respondents cannot edit this field - it is filled in by the platform. Use it to record who submitted each response.

### Device Info

Automatically fills in metadata about the device being used (such as device type or browser). Respondents cannot edit this field. Useful for audit trails and diagnosing submission issues.

## Display types

### Markdown

A display-only content block - not a question and not stored in the table. Use it to add instructions, headings, or formatted text between questions. Supports standard Markdown formatting.

## Lookup type

### Lookup

Lets the respondent search for and select a record from another table in your project. There are two modes:

* **Search mode** - a type-ahead search field opens. The respondent starts typing and matching records from the linked table appear. Click a result to select it.
* **Direct entry mode** - the respondent types the exact primary key value of the record they want to link.

When setting up a Lookup question in the form builder, you choose which table to look up from, which column holds the stored value (the key), and which column is displayed to the respondent.

## Structured data types

### Tabular

Lets the respondent enter multiple rows of structured data - like a small table within the form. Each row has a set of column inputs defined in the form builder. Use **Add Row** to add more rows and **Remove** to delete a row.

Tabular columns support **Dropdown** type inputs, so individual cells within a tabular question can present a predefined choice list to the respondent.

***

## Question properties

Every question has a set of properties that control how it behaves. These are set in the form builder when editing a question.

### Required

Makes the question mandatory. The form cannot be submitted without a valid answer to a required question. Required fields are marked with a visual indicator when the form is filled in.

### Hidden

Hides the question from the person filling in the form. The question is not visible, but it is still part of the form and its value is still submitted. Use Hidden questions for:

* **Metadata fields** you want to collect automatically without prompting the respondent - for example, a default value set to today's date, or a fixed site identifier.
* **URL-prefilled values** - combine Hidden with a **URL Query Param Key** so the field is silently populated from the link the respondent opened (e.g. `?site=plot-42`).
* **Locked auto-values** - combine Hidden with **Locked** and a **Default value** to create a fully automated field the respondent never sees or changes.

{% hint style="warning" %}
Hidden fields are hidden in the form UI, but their values are still part of every submission. Do not use Hidden to store sensitive information you do not want in your table.
{% endhint %}

### Locked

Prevents respondents from changing the pre-filled value. A locked question is visible but not editable. Use it when you want to display a value (such as the observer's name) without letting the respondent modify it.

### Expanded configuration panel

Click the **cog icon** on a question card to open its expanded configuration panel:

* **URL Query Param Key** - if you enter a key here, the field is pre-filled automatically when the form URL includes a matching query parameter. For example, if you set the key to `site`, then opening the form at `.../form/abc?site=Site+Alpha` will pre-fill this question with `Site Alpha`. Works with both visible and Hidden questions.
* **Default value** - a value pre-filled when the form loads. The respondent can change it unless the question is also Locked.
* **Icon Type** / **Icon Text** - only relevant when using the Icons and Text form layout.


# Form Settings

After creating a form, you can adjust its settings to control how it looks, who can access it, and how it behaves on submission. Open a form and click the **Settings** button in the toolbar to reach the settings page.

## General settings

### Form name

Change the display name of your form. This is the name that appears in the forms list and at the top of the form when someone opens it.

### Visibility

Set who can see the form within your project (Private, Public, or Protected).

### Email notifications

By default, the platform sends a submission notification email to the person who submitted the form after every successful submission. You have two controls to change this:

**Send Custom Email toggle** - when this toggle is **ON**, the default submission notification is suppressed entirely. No email will be sent to anyone, including the submitter. Turn this on if you want to silence all submission emails for this form (for example, during high-volume data collection sessions where email noise is unwanted).

**Email List** - enter a comma-separated list of email addresses. When the **Send Custom Email** toggle is **OFF** (the default), every address in this list will also receive the submission notification alongside the submitter. Leave this blank to send notifications only to the submitter.

The Email List field is visible regardless of the toggle state, but addresses in the list only receive emails when the toggle is \*\*OFF\*\*. If the toggle is ON, no emails are sent even if addresses are listed. {% endhint }

### Webhook

Enter a URL in the **Webhook** field to have Information Hub send an HTTP POST request to that address each time the form is submitted. Use this to connect your form to external systems or automation tools.

### Sharing

Toggle **Allow Sharing** to enable the public share link for this form. When sharing is on, a **Preview** button appears - click it to open the form as a respondent would see it.

To stop accepting new responses, turn **Allow Sharing** off. The link will stop working, but the form and all previously collected data are not affected.

Click **Save** to apply your general settings changes.

## Form configuration

### Layout type

Choose how the form is presented to users. Options include Default, Icons and Text, Icons, and Accordions. Different layouts change the visual arrangement of sections and questions.

### Show section header

Toggle this on or off to show or hide section headings when someone is filling in the form.

### Submit buttons

Choose how the submit area behaves:

* **Submit** - a single submit button. After submitting, the respondent sees a confirmation page.
* **Submit Many** - a "Submit and Reset" button appears alongside the standard Submit button. After submitting, the form clears immediately so the respondent can fill it in again straight away. Use this for high-volume data entry sessions.

### Submit button size

Set the size of the submit button to **Default** or **Large**. A larger button can be easier to tap on mobile devices.

### Logo

Enter a URL for a custom logo image to display at the top of the public form. Use the **Logo** field for a light-background logo and the **Dark mode Logo** field for a version that looks correct on dark backgrounds.

### Colours

Customise the appearance of your form:

* **Primary colour** - used for buttons, highlights, and active elements.
* **Secondary colour** - used for secondary UI elements.

These settings only affect the form when it is opened via its shareable link.

### Require logged in user

When this toggle is on, only registered Information Hub users who are logged in can access and submit the form. Their identity is recorded with each submission. When it is off, anyone with the link can submit without creating an account.

Click **Save** to apply your form configuration changes.

## Reordering sections and questions

The **Reordering** card lets you change the order of sections and questions without rebuilding the form:

* Drag the handle next to a **section** to move it to a new position. Click **Save** to apply the new section order.
* Drag the handle next to a **question** to reorder it within its section. Click **Save** to apply the new question order for that section.
* If your form has more than one section, a **Move to...** dropdown appears next to each question. Select a different section from the dropdown to move the question there.

## Delete form

The **Delete Form** card at the bottom of the settings page contains a **Delete** button. This permanently removes the form. See [Delete a Form](/project/forms/delete-form) for details.


# Offline Forms

You can use forms to collect data without an internet connection. Submissions are stored on your device and uploaded later when you are back online.

{% hint style="info" %}
Offline forms are especially useful for field researchers collecting data in remote locations without reliable internet.
{% endhint %}

## How to collect data offline

### Step 1 - Save the form to your device

Do this while you still have internet access.

1. Open the form you want to use offline.
2. In the action bar at the top of the form view page, tap or click **Save for Offline** (the button has a bookmark icon).
3. The form structure is saved to your device. You can now use the form without a connection.

{% hint style="warning" %}
You must save the form for offline use **before** you lose your internet connection. The button will not be available once you are offline.
{% endhint %}

### Step 2 - Fill in the form in the field

4. Open the form as normal - even without internet access.
5. Fill in the form and tap **Submit**. The submission is stored locally on your device.
6. Repeat as many times as needed. Each submission is queued locally until you sync.

### Step 3 - Upload your submissions

7. When you have internet access again, go to **Jobs** in the home sidebar.
8. Your pending offline submissions appear as jobs. Click **Execute** on each job to upload the data to the server.
9. Once uploaded, the submitted data appears in the linked table.

{% hint style="info" %}
You can also click **Download** on a job to save a local copy of the submission data before uploading.
{% endhint %}

## Removing a form from offline storage

If you no longer need a form saved on your device, open the form and click **Remove from Offline** in the action bar (the same location as the Save for Offline button, shown in red when the form is already saved). This frees up storage space on your device. Any already-submitted responses that have not been uploaded yet are not affected.

## Things to keep in mind

* Do not clear your browser data while you have unsynced submissions - this will delete the locally stored responses.
* File upload questions may not work offline depending on your device and browser. Test this before heading into the field.


# Share a Form

You can share a form via a public link so that anyone - inside or outside your project - can submit responses without needing to log in (unless you require it).

## Before you share

Sharing must be enabled in the form's settings before the share link is active:

1. Open the form and click **Settings** in the toolbar.
2. Toggle **Allow Sharing** on and click **Save**.
3. A **Preview** button will appear - click it to see the form exactly as a respondent would.

See [Form Settings](/project/forms/form-settings) for more details on the Allow Sharing toggle.

## Getting the share link

Once sharing is enabled, the **Share** button appears in the form view toolbar (the share-social icon).

1. Click **Share** to open the share popover.
2. The popover shows the form's public URL in a read-only field.
3. Click the **copy** icon to copy the link to your clipboard.
4. Send the link to your respondents via email, messaging, or any other channel.

## What respondents see

When a respondent opens the shared link:

* The form loads without requiring a login (unless **Require logged in user** is enabled in the form's settings).
* They fill in the form and click **Submit**.
* After submitting, a confirmation page appears with a **Submit Again** button - respondents can click this to immediately fill in another response without needing the link again.

## Stopping responses

To stop accepting new submissions:

1. Open the form's settings.
2. Toggle **Allow Sharing** off and click **Save**.

The link stops working immediately. The form and all previously collected data are not deleted - you can turn sharing back on at any time.

{% hint style="info" %}
If you need to track who submitted each response, enable **Require logged in user** in form settings. Respondents will be asked to log in before they can submit.
{% endhint %}


# Delete a Form

If you no longer need a form, you can delete it from your project. Deleting a form removes the form itself but does not affect the data that has already been collected.

## How to delete a form

1. Go to the **Forms** page in your project sidebar.
2. Find the form you want to delete.
3. Open the form's **options menu** (the three-dot icon or right-click context menu).
4. Select **Delete**.
5. Confirm the deletion when prompted.

## What happens when you delete a form

* The form is permanently removed and can no longer be accessed via its shared link.
* **The linked table and all its data are not affected.** Any responses that were already submitted remain in the table.
* If you need to collect data again later, you can create a new form linked to the same table.


# Tables

Tables are where your structured data lives in Information Hub. Each table stores data in rows and columns, much like a spreadsheet - but with defined column types that keep your data consistent and reliable.

<figure><img src="/files/9CQyyF4NNbycWlSnq1JW" alt="The tables page"><figcaption><p>The tables page</p></figcaption></figure>

## What tables are used for

Every project can have multiple tables. Tables are the backbone of your project's data:

* **Forms** collect data and write it directly into tables.
* **Dashboards** visualise data stored in tables.
* **Apps** can read from and write to tables.

## Column data types

Each column in a table has a data type that controls what values it can hold:

| Data Type        | Description                                                                                                                       |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| Text             | Free text of any length                                                                                                           |
| Integer          | Whole numbers                                                                                                                     |
| Double Precision | Decimal numbers (high precision)                                                                                                  |
| Real             | Decimal numbers (standard precision)                                                                                              |
| Yes/No           | Boolean true/false values                                                                                                         |
| File             | Reference to a file in project storage                                                                                            |
| Dropdown         | Select from a predefined list of options                                                                                          |
| Foreign Key      | Reference to a row in another table                                                                                               |
| Lookup           | References a specific column in another table - similar to a foreign key but with a search interface for finding the linked value |
| JSON             | Stores structured JSON data within a single cell                                                                                  |
| Tabular          | Stores multiple rows of structured data within a single cell                                                                      |

Every table also has a **primary key** column. By default this is an auto-incrementing integer called `id` that uniquely identifies each row. If you need human-readable IDs (such as `SP-1` or `OBS-42`) you can use a key generator on the primary key column instead - see Key generators below.

## Key generators

A key generator is a template-based pattern for auto-generating column values. Use them for serial numbers, sample IDs, specimen codes, or any value that should follow a consistent format. For example, a template of `SP-{autoincrement}` would produce SP-1, SP-2, SP-3, and so on.

{% hint style="info" %}
Key generators produce string values. If your template includes literal text (for example `SP-{autoincrement}`), the primary key column type must be **Text**, not **Integer**. Open **Edit Column** on the primary key column and change its type to Text before assigning the generator.
{% endhint %}

Key generators are managed from the table's Settings page. You can assign a key generator to a column when adding or editing that column.

## In this section

{% content-ref url="/pages/idvYHsokWigDwYI8qMlc" %}
[Create a Table](/project/tables/create-table)
{% endcontent-ref %}

{% content-ref url="/pages/CmYaPVOX7q3wK4WW62ch" %}
[Import Data](/project/tables/import-data)
{% endcontent-ref %}

{% content-ref url="/pages/kI3oquG6j4oqFuLy89Wj" %}
[View and Edit Data](/project/tables/view-edit-data)
{% endcontent-ref %}

{% content-ref url="/pages/Es3jIurUm97s2olWpb1Q" %}
[Export Data](/project/tables/export-data)
{% endcontent-ref %}

{% content-ref url="/pages/3j9uACxLtiO5DAhxQelb" %}
[Analyse Data](/project/tables/analyse-data)
{% endcontent-ref %}


# Create a Table

To start storing data in your project, you first need to create a table and define its columns.

## Create the table

1. Open your project and click **Tables** in the sidebar.
2. Click the **+** button to open the create table dialog.
3. Enter a name for your table.
4. The primary key is set up automatically as an auto-incrementing integer column called `id`. You can rename it if needed. To use a human-readable ID instead (for example `OBS-1`), assign a key generator to the primary key column after creating the table - see **Key generators** below.
5. Click **Create**.

<figure><img src="/files/PfFMWyH92uel7LsuybHq" alt="The create table dialog"><figcaption><p>Creating a new table</p></figcaption></figure>

Your table is created with just the primary key column. Next, add the columns you need.

## Add columns

1. In the table view, click the **+** button on the table header (or click **ADD** in the toolbar and select **Add Column**).
2. Enter a name for the column.
3. Select a data type from the dropdown.
4. Optionally toggle **Required** to prevent the field from being left empty.
5. Optionally toggle **Unique** to prevent duplicate values in this column.
6. Optionally select a **Key Generator** to auto-populate the primary key with generated values (see below).
7. To add more columns at the same time, click **Add another column** and fill in the next row.
8. Click **Save** when you are done.

<figure><img src="/files/5X9vVM6SykZwaob6Optb" alt="Adding a column to a table"><figcaption><p>Adding a column</p></figcaption></figure>

{% hint style="info" %}
You can add multiple columns in one go. Use the **Add another column** button to add extra rows before saving, so you only need to submit the form once.
{% endhint %}

## Column types

Choose the right data type for each column. Using the correct type prevents data entry errors and makes analysis easier.

### Text

Stores free text of any length. Use it for names, descriptions, codes, notes, or any value that does not fit a more specific type. Stored as `TEXT` in the database. Text can also be used as a primary key.

### Integer

Stores whole numbers with no decimal part. Use it for counts, IDs, or any value that is always a round number. Stored as `INT`. Integer columns can be set to **auto-increment** when used as the primary key.

### Real

Stores decimal numbers at standard precision (roughly 6 significant decimal places). Use it for measurements where exact precision beyond 6 digits is not needed - for example, pH readings, percentages, or short coordinates.

### Double Precision

Stores decimal numbers at high precision (up to 15 significant decimal places). Use it when accuracy matters - for example, GPS coordinates, financial figures, or scientific measurements. Use Double Precision over Real when in doubt.

### Yes / No

Stores a boolean true/false value. Displayed as a toggle in the data entry form. Use it for binary questions: "Collected?", "Verified?", "Active?".

### File

Stores a reference to one or more files. Each uploaded file is stored in your project's **Storage** and the cell holds the file names and their storage URLs. In the table grid, File cells render as clickable links that open the file in a new tab.

{% hint style="info" %}
**File columns are text under the hood.** The cell value is a text string in `filename[url],` format. This means you can also manually type an external URL (such as a DOI link or external resource) using the same format - for example: `Paper[https://doi.org/10.xxxx/example]`. The cell will render it as a clickable link without any upload required.
{% endhint %}

### Dropdown

Stores a selection from a predefined list of options. The options are defined when linking the column to a form question. Stored as text internally. Use it for fields with a fixed set of valid values - for example, site names, status codes, or category labels.

### Foreign Key

Stores a reference to a row in another table in the same project. The stored value is the primary key of the referenced row. Use it to link records across tables and avoid data duplication - for example, linking an observation row to a row in a Sites table instead of repeating the site name on every row.

When adding or editing a row, Foreign Key columns present a search interface to find and select the referenced record.

### JSON

Stores structured data as a JSON value in a single cell. Use it when you need to record a collection of related attributes that do not fit a flat column structure. The form builder's **JSON** question type links to this column type.

### Tabular

Stores multiple rows of structured data within a single cell. Use it for forms where respondents need to enter a variable number of sub-records in one submission - for example, multiple measurements taken at one site visit. Linked to the **Tabular** question type.

***

## Edit a column

To change a column's name, type, or settings after it has been created:

1. In the table view, click the **pencil icon** on the column header you want to edit.
2. Update the column name, type, Required/Unique toggles, or key generator assignment.
3. Click **Save**.

{% hint style="warning" %}
If you change a column's data type, a warning will appear if the change could affect existing data. Review the warning carefully before confirming.
{% endhint %}

You can also delete a column permanently from the edit column form using the **Delete Column** button. This cannot be undone.

***

## Key generators

A key generator auto-populates the primary key column with values based on a template pattern. This is useful for human-readable sample IDs, serial numbers, or any code that follows a consistent format.

{% hint style="info" %}
If your key generator template includes literal text (for example `OBS-{autoincrement}` or `SP-{uuid[0:8]}`), the primary key column type must be **Text**, not **Integer**. Open **Edit Column** on the primary key column and change its type to Text before assigning the generator.
{% endhint %}

Key generators are **project-level** - one generator can be reused across multiple tables. They are assigned to the primary key column of a table at creation time or by editing the primary key column.

### Managing key generators

Key generators are managed from the **Tables list** page:

1. Click **Tables** in the project sidebar.
2. Click the **Key Generators** button in the toolbar.
3. Click **+** to create a new generator.
4. Enter a **Name**, an optional **Description**, and a **Template** string (see tokens below).
5. Click **Create**.

To edit or delete an existing key generator, use the edit (pencil) or delete icons next to each entry in the list.

Once a key generator exists, assign it to a table's primary key column when creating the table, or by opening **Edit Column** on the primary key column.

### Template tokens

Templates are strings that mix literal text with tokens in `{...}` syntax. Tokens are replaced with generated values when a new row is inserted.

| Token             | What it produces                                | Example output                         |
| ----------------- | ----------------------------------------------- | -------------------------------------- |
| `{autoincrement}` | An atomically incrementing integer (1, 2, 3...) | `42`                                   |
| `{uuid}`          | A random v4 UUID                                | `f47ac10b-58cc-4372-a567-0e02b2c3d479` |
| `{cuid}`          | A collision-resistant unique ID                 | `clh3z8k0v0000qzrmabcd1234`            |
| `{date}`          | Current date as `YYYY-MM-DD`                    | `2026-05-26`                           |
| `{date:FORMAT}`   | Current date in a custom moment.js format       | `{date:YYYYMMDD}` → `20260526`         |
| `{time}`          | Current time as `HH:mm:ss`                      | `14:32:07`                             |
| `{time:FORMAT}`   | Current time in a custom moment.js format       | `{time:HHmm}` → `1432`                 |
| `{datetime}`      | Current date and time (ISO 8601)                | `2026-05-26T14:32:07+00:00`            |
| `{columnId}`      | Value of another column in the same row         | `Site Alpha`                           |

### Slicing token output

Any token can be sliced to take only part of the generated value, using Python-style `[start:end]` notation immediately after the token name:

* `{uuid[0:8]}` - first 8 characters of a UUID
* `{cuid[0:12]}` - first 12 characters of a CUID
* `{autoincrement[0:4]}` - first 4 digits of the counter

### Formatters

Add `:lower`, `:upper`, or (for column references) `:slug` after the token to transform the output:

* `{uuid:upper}` - UUID in uppercase
* `{date:YYYYMMDD}` - date formatted as `20260526` (the `:FORMAT` string is the formatter for date/time tokens)
* `{siteColumnId:slug}` - column value lowercased with spaces replaced by hyphens

### Working examples

**Sequential observation IDs**

```
OBS-{autoincrement}
```

Produces: `OBS-1`, `OBS-2`, `OBS-3`, ...

**Date-prefixed short UUID**

```
{date:YYYYMMDD}-{uuid[0:8]:upper}
```

Produces: `20260526-F47AC10B`, `20260526-A3B2C1D0`, ...

**Site-prefixed sequential ID** (where `clm8abc123def456xyz` is the column ID of the `site` column)

```
{clm8abc123def456xyz:slug}-{autoincrement}
```

Produces: `site-alpha-1`, `site-beta-2`, ...

**Short CUID for compact IDs**

```
SP-{cuid[0:8]}
```

Produces: `SP-clh3z8k0`, `SP-clh3z8k1`, ...

{% hint style="info" %}
To find a column's ID for use in a template, look at the column's URL when editing it, or ask a developer with database access. Column IDs are 20-40 alphanumeric characters.
{% endhint %}

{% hint style="warning" %}
Key generators can only be assigned to **primary key columns**. They apply to new rows only - existing rows keep their original primary keys.
{% endhint %}

***

## Table settings

The **Settings** button in the table toolbar opens the table settings page, where you can:

* **Rename the table** - update the table name and click Save.
* **Clear all data** - deletes every row in the table but keeps all the columns and structure intact.
* **Delete the table** - permanently removes the table and all its data.

{% hint style="warning" %}
**Clear all data** and **Delete table** are permanent actions and cannot be undone. Export your data first if you need a backup.
{% endhint %}


# Import Data

There are two ways to bring existing data into a table in Information Hub:

1. **Create a new table from a file** - upload a file and let Information Hub build the table structure from it automatically.
2. **Import data into an existing table** - add rows from a file into a table you have already set up, mapping the file's columns to the table's columns.

## Supported formats

{% hint style="info" %}
Supported file formats: CSV (comma-separated) and TSV (tab-separated).
{% endhint %}

***

## Option 1 - Create a new table from a file

Use this when you have a data file and want Information Hub to create the table structure automatically based on the file contents.

1. First, upload your CSV or TSV file to your project's **Storage**. Tables can only import from files already in storage.
2. Navigate to **Tables** in the project sidebar.
3. Click the **+** button to create a new table.
4. Choose the **Create from data** option.
5. Select the file you uploaded from storage.
6. Information Hub auto-detects the columns and their data types based on the file contents.
7. Review the detected columns and types. Adjust if needed.
8. Confirm to create the table.

The table is created with all your data already populated. Each row from the file becomes a row in the table, and each column header becomes a column name.

***

## Option 2 - Import data into an existing table

Use this when your table already exists and you want to add rows from a file.

1. Open the table you want to add data to.
2. Click the **ADD** button in the toolbar.
3. Select **Import Data** from the dropdown.
4. On the import page, click **Select from storage** to choose the file you want to import.
5. Once a file is selected, the **column mapping** section appears. Each column in the source file is shown on the left - use the dropdown next to each one to select the matching column in your table.
6. Map all the columns you want to import. You can skip source columns you do not need.
7. Click **Import** to start the import.

### Column mapping

The column mapping step is important for a clean import. The source file's column names may not exactly match your table's column names, so you manually match them up here. For example, if your file has a column called "Species name" and your table has a column called "species", select "species" from the dropdown next to "Species name".

***

## Tips for a clean import

* Make sure the first row of your file contains column headers.
* Remove any empty rows or columns before uploading.
* Use consistent formatting within each column - for example, don't mix text and numbers in the same column.
* Check that decimal numbers use a consistent separator (dot or comma) throughout the file.


# View and Edit Data

Once a table has columns and rows, you can browse, search, filter, add, edit, and delete data directly in the table view.

## Open a table

Click on a table name in the Tables list to open it. The data is displayed in a spreadsheet-like grid showing all rows and columns.

<figure><img src="/files/xilwbVZeBIALIE93jQhG" alt="A table with data rows"><figcaption><p>A table with data</p></figcaption></figure>

## Toolbar overview

The toolbar above the table provides quick access to all table actions:

| Button   | What it does                                                  |
| -------- | ------------------------------------------------------------- |
| Search   | Opens a search box to filter rows by keyword                  |
| Filter   | Opens the filter panel to apply column-level rules            |
| ADD      | Dropdown with three options: Add Column, Add Row, Import Data |
| Export   | Opens the share and export options                            |
| Analyse  | Opens the analysis script generator                           |
| Refresh  | Reloads the latest data from the server                       |
| Settings | Opens the table settings page                                 |

## Search

1. Click the **Search** button in the toolbar.
2. Type your search term in the box that appears.
3. The table updates to show only rows that match.
4. Click the **X** to clear the search, or **Close** to dismiss the search box.

## Filter

1. Click the **Filter** button in the toolbar.
2. The filter panel opens. Click **Add filter rule**.
3. For each rule, choose a column, an operator (such as equals, contains, or starts with), and a value.
4. Add more rules if needed - multiple rules are combined to narrow the results further.
5. Click **Apply** to filter the table.
6. To remove a rule, click the trash icon next to it.
7. To clear all filters, open the filter panel and remove all rules, then apply again.

## Add a row

1. Click the **ADD** button in the toolbar.
2. Select **Add Row** from the dropdown menu.
3. A form appears with a field for each column (the primary key is filled in automatically).
4. Fill in the values.
5. Click **Save** to add the row.

<figure><img src="/files/RI0sCpzCLChavTMJZpjZ" alt="The ADD dropdown menu"><figcaption><p>The ADD dropdown with Add Row selected</p></figcaption></figure>

<figure><img src="/files/Yj7HJSNKsxybMWX4Sk74" alt="The add row form"><figcaption><p>The add row form</p></figcaption></figure>

## Edit a row

1. Click the **pencil icon** at the left side of the row you want to edit.
2. The row edit form opens with the current values pre-filled.
3. Make your changes.
4. Click **Save**.

You can also delete the row permanently from this form using the **Delete Row** button.

## Lock a row

Locking prevents a row from being edited further. To lock or unlock a row:

* Click the **lock icon** on the row in the grid, or
* Open the row edit form and use the **Lock row** toggle.

{% hint style="info" %}
Locking a row is useful when a record has been verified and should not change. Only users with the appropriate permission can lock or unlock rows.
{% endhint %}

## Select rows

* Use the **checkbox** at the start of each row to select individual rows.
* Use the **checkbox in the column header** to select or deselect all visible rows at once.

Selected rows can then be deleted in bulk.

## Delete rows

Select one or more rows using the checkboxes, then use the delete option to remove them.

{% hint style="warning" %}
Deleting rows is permanent and cannot be undone. Consider exporting your data before deleting rows.
{% endhint %}

## Sort data

Click on a column header to sort the table by that column. Click again to toggle between ascending and descending order.

## Special cell types

### JSON cells

If a column stores JSON data, clicking the cell opens a **JSON preview popup** showing the formatted JSON content. This is read-only.

### Image cells

If a column stores images, clicking the cell opens an **image gallery** showing all images attached to that row. Click any image to open it in a new browser tab.

## Pagination

Use the **Previous** and **Next** arrows at the bottom of the table to move between pages. Use the **rows per page** dropdown to control how many rows are shown at once (for example, 10, 25, 50, or 100 rows per page).

## Refresh

Click the **Refresh** button in the toolbar to reload the latest data from the server. This is useful if other team members are adding data at the same time.

## Audit log

The audit log shows the full change history for your table's rows.

1. Click the **Settings** button in the toolbar.
2. Navigate to the **Audit Log** section.
3. Each entry shows what was changed and when.
4. Expand an entry to see the individual field changes.

Administrators can roll back a row to a previous state by clicking **Rollback** next to any history entry.

{% hint style="info" %}
The audit log is a useful tool for tracking data quality, resolving disputes, and recovering from accidental changes.
{% endhint %}


# Export Data

You can download any table as a file for offline use, sharing, or backup. You can also share the table publicly via a read-only link.

## How to export

1. Open the table you want to export by clicking its name in the Tables list.
2. Click the **Export** button in the toolbar.
3. Choose your format:
   * **Export as TSV** - downloads a tab-separated values file.
   * **Export as XLSX** - downloads a Microsoft Excel file.
4. The file downloads to your computer.

## Share a table publicly

The export popover also includes a public sharing option. When sharing is enabled on a table, anyone with the share link can view the table data in read-only mode - no account required.

{% hint style="info" %}
Public table sharing must be enabled on the table before the share link is active. Check with your project administrator if you need this feature turned on.
{% endhint %}

## When to export

* **Offline analysis** - open the data in Excel, Google Sheets, or any spreadsheet tool.
* **Sharing with collaborators** - send the file to people who don't have access to your project.
* **Backup** - keep a local copy of important data.
* **External tools** - import into statistical software like SPSS, Stata, or R.

{% hint style="info" %}
Exported files include all rows and columns in the table. If you need only a subset, use the Search or Filter tools in the table view to narrow down the data before exporting.
{% endhint %}

## Shared table viewer

If a project administrator has enabled public sharing for a table, anyone with the share link can view it at `/table/:tableId` - no account required.

The shared viewer has its own toolbar:

| Button      | What it does                                                                                      |
| ----------- | ------------------------------------------------------------------------------------------------- |
| **Search**  | Opens a search popover - type a term and click **Search** to filter rows, or **Close** to dismiss |
| **Expand**  | Toggles column wrapping - click once to wrap long text, click again to clip it                    |
| **Refresh** | Reloads the table data                                                                            |

**Selecting rows**

* The **Select All** checkbox in the header row selects or deselects all visible rows at once.
* Each data row has its own checkbox for individual selection.

**Files**

Cells that contain uploaded files show a clickable link. Clicking it opens the file in a new browser tab.

**Pagination**

Use the **previous** and **next** page buttons at the bottom of the table to move between pages. The **page size** selector lets you choose how many rows are shown at once.

{% hint style="info" %}
The shared viewer is read-only. Viewers cannot add, edit, or delete rows.
{% endhint %}


# Analyse Data

Information Hub can generate a ready-to-run script that connects directly to your table's data, so you can analyse it in Python or R without any manual setup.

## Using the Analyse feature

1. Open the table you want to analyse.
2. Click the **Analyse** button in the toolbar.
3. The analyse popover opens. Choose **Python** or **R** using the language selector at the top.
4. A script is automatically generated for you. It includes the connection details for this specific table.
5. Click the **copy icon** to copy the script to your clipboard.
6. Paste and run the script in your own Python or R environment (for example, Jupyter, VS Code, RStudio, or a terminal).

The script fetches the table's data using your API key and loads it into a data frame, ready for analysis.

{% hint style="info" %}
The generated script uses your personal API key for authentication. Make sure you have created an API key in **Account Settings** before using this feature. Without an API key the script will not be able to connect.
{% endhint %}

## What you can do with the script

Once the data is loaded in your environment, you can:

* Run statistical computations.
* Generate charts and plots.
* Transform and clean data.
* Build models and run experiments.

Results from your analysis can also be used to create components on your project's dashboards.

## External tools

{% hint style="info" %}
For analysis that does not require a live connection to Information Hub, you can export your data and use any external tool - Excel, SPSS, Jupyter, RStudio, or anything else that reads TSV or XLSX files.
{% endhint %}

Exporting is also useful when you need to:

* Use specialised software not available in the built-in environment.
* Share analysis results with collaborators who use different tools.
* Work offline without an internet connection.


# Storage

Storage is your project's file manager. Use it to upload, organise, and preview files associated with your project.

<figure><img src="/files/4Cb9uoBLLdg2ujTZf8Og" alt="The storage page"><figcaption><p>The storage page</p></figcaption></figure>

## The storage browser

The storage browser shows the files and folders at your current location. Use the **search bar** at the top to filter files and folders by name in real time.

Use the **pagination arrows** at the bottom to move between pages when a folder contains more than 100 items.

Click the **Back** button in the toolbar to navigate up to the parent folder.

## Create folders

Keep your files organised by creating folders:

1. Click the **Create** button in the toolbar.
2. Enter a name for the folder (2 to 128 characters).
3. Click **Create**.

{% hint style="info" %}
Empty folders are automatically removed. If you need to keep an empty folder, a placeholder file (KEEPME.md) is used to preserve it.
{% endhint %}

## Upload files

Click the **Upload** button in the toolbar to open the upload modal. From there you can:

* **Browse / Select Files** - opens a file picker to choose one or more files from your device
* **Take Picture** - opens your device camera to capture a photo
* **Record Video** - opens a video recorder to capture a video clip
* **Record Audio** - starts an audio recording using your device microphone

You can upload multiple files in one session. A progress bar shows the upload status for each file. When all uploads are complete, click **Return** to close the modal.

## File and folder options

Each file and folder has a three-dot options menu (**...**) with the following actions:

* **Rename** (folders only) - enter a new name for the folder
* **Download** - download the file directly to your device; for folders, downloads the entire folder as a ZIP archive
* **Extract** (ZIP files only) - extracts the contents of the ZIP archive into the current folder
* **Delete** - permanently removes the file or folder

{% hint style="warning" %}
Deleting a file or folder cannot be undone. Make sure you have a backup if needed.
{% endhint %}

## View a file

Click on any file in the storage browser to open the file view page. This page shows:

* An **image preview** for image files
* **File metadata** - size, file type, and storage path
* A **Download** button to save the file to your device
* An **Analyse** button for image files (see below)
* A **Delete** button to permanently remove the file

### AI image analysis

For image files, click the **Analyse** button to run an automated object-detection analysis. The platform identifies objects in the image and displays labels in the metadata. This is useful for quickly cataloguing field photos.

{% hint style="info" %}
The Analyse button is only shown for image file types.
{% endhint %}

## Selecting a file from within another feature

When another part of the platform asks you to pick a file from storage - for example when configuring a dashboard map component or importing data into a table - a storage browser popup appears. Use it the same way as the main storage browser:

1. Navigate into folders by clicking on them.
2. Click a file or folder to select it (selected items are highlighted).
3. Click **Select** to confirm your choice, or **Cancel** to close without selecting.

Use the **Back** button or the breadcrumb trail in the popup to navigate to a parent folder.


# Manager

The Manager is a kanban-style task board for organising project work. Use it to track tasks, assign responsibilities, and monitor progress across one or more workbooks.

<figure><img src="/files/a7BayIFhRamwdwlmmnhX" alt="The manager page"><figcaption><p>The manager page</p></figcaption></figure>

## Workbook list

When you open the Manager module, you see a list of all workbooks in the project.

* Use the **Search Workbooks** bar at the top to filter the list by name in real time.
* Click any workbook to open its kanban board.
* Click the **three-dot menu** (ellipsis icon) on a workbook row to open the options popover:
  * **Edit** - opens a form where you can rename the workbook (3-64 characters, required).
  * **Delete** - removes the workbook after a confirmation prompt.

## Create a workbook

Workbooks let you group related tasks together - for example, by phase, topic, or team.

1. Open the **Manager** module from the project sidebar.
2. Click the **Create Workbook** button (top right).
3. Enter a name for the workbook (3-64 characters, required).
4. Click **Create** to save. You are taken directly to the new kanban board.

{% hint style="info" %}
If the workbook list is empty, a **Create new Workbook** button appears in the centre of the screen as a shortcut.
{% endhint %}

## Kanban board

Each workbook has a kanban board with three fixed columns:

* **To Do** - tasks that have not been started
* **Busy** - tasks currently in progress
* **Done** - completed tasks

### Toolbar

At the top of the board you will find:

* **Search user** bar - type a project member's name to filter the board and show only cards assigned to that person.
* **Open / Closed** segment buttons - switch between active cards (Open) and cards that have been marked as closed (Closed).
* **Create Card** button - opens the create card form.
* **Edit Workbook** button (settings icon) - navigates to the workbook settings page where you can rename or delete the workbook.

### Moving and reordering cards

* **Drag and drop** - grab a card and drag it to a different column to update its status, or drag it up or down within a column to reorder it.

### Mobile layout

On a mobile device the board shows one column at a time.

* Use the **column tabs** at the top (To Do, Busy, Done) to switch between columns.
* The **Expand All / Collapse All** button toggles the description accordion on all visible cards so you can quickly scan or hide details.
* Swipe down to refresh the board.

## Cards

Cards represent individual tasks within a workbook.

### Create a card

1. Click **Create Card** in the board toolbar.
2. Fill in the card details:
   * **Name** (required, 3-65 characters) - a short title for the task.
   * **Description** - a full Markdown editor where you can add formatted text, bullet lists, links, and more. Leave it blank if not needed.
   * **Column** - choose which column the card should start in (To Do, Busy, or Done).
   * **Due date** - click the date field to open a calendar picker and select a deadline. Use the **Clear** button to remove the date.
   * **Assign to user** - select a project member to be responsible for the task.
3. Click **Create** to save the card.

### Edit a card

Click the **...** (ellipsis) button on any card to open the edit form. All the same fields are available as when creating a card, plus:

* **Closed** toggle - check this box to mark the task as done and move it to the Closed view. Uncheck it to reopen the card.
* **Delete** button - permanently removes the card. This cannot be undone.

Click **Update** to save your changes.

### Assigned users on cards

* Each card shows the assigned user's **avatar and display name**. Click the name to navigate to their profile.
* If no user is assigned, an **Assign user** link appears on the card. Click it to open the edit form and add an assignee.

## Edit workbook settings

To rename a workbook, use either of these routes:

* From the **workbook list** - click the three-dot menu on the workbook row and choose **Edit**.
* From the **kanban board** - click the settings icon in the toolbar to open the Edit Workbook page. Enter the new name and click **Save**.

To **delete** a workbook, use the three-dot menu on the workbook list and choose **Delete**.

{% hint style="info" %}
The Manager is a lightweight tool for tracking work within a project. For complex project management needs, consider connecting an external tool via the Apps module.
{% endhint %}


# Wiki

The Wiki is a built-in knowledge base for your project. Use it to write and organise notes, protocols, guides, and reference material that your team can access at any time.

<figure><img src="/files/VXh2cgNaQpqXIM5M4bDi" alt="The wiki page"><figcaption><p>The wiki page</p></figcaption></figure>

{% hint style="info" %}
The Wiki may appear as "Documentation" in the project sidebar - they are the same feature.
{% endhint %}

## The page list

When you open the Wiki, you see a list of all pages in the project. At the top of the list there is a search bar - type any part of a page title to filter the list in real time.

Each page in the list has a three-dot menu (**...**) on the right. Click it to reveal two options:

* **Edit** - opens the page editor directly.
* **Delete** - permanently removes the page.

Pinned pages show a bookmark icon and always appear at the top of the list.

## Create a page

1. Open the **Wiki** (or **Documentation**) module from the project sidebar.
2. Click the **+** button (top-right) to go to the create page form.
3. Enter a **Name** for the page. A URL slug is automatically generated from the title as you type.
4. To customise the slug, click the **edit** link next to the slug preview and type the value you want.
5. Optionally, add a **Description** - a brief summary that appears under the page title in the list.
6. Click **Create** to save. The page is created and you can start adding content.

{% hint style="info" %}
The slug forms the page's web address. Keep it short and descriptive - for example, `field-protocols` or `data-dictionary`.
{% endhint %}

## Edit a page

1. From the page list, click a page to open it, then click the **Edit** button in the toolbar. Alternatively, use the three-dot menu on the page row and choose **Edit**.
2. The editor opens with a full markdown editor and a formatting toolbar. Use the toolbar for headings, bold, italic, links, tables, code blocks, and more, or write markdown directly.
3. You can also update the **Name**, **Slug**, and **Description** from the edit form above the editor.
4. Click **Save** when you are done.

## Page settings

Each page has a **Settings** button (gear icon) in the toolbar. Click it to open the settings screen, which has the following options:

* **Published** - when unchecked, the page is a draft and is not visible to other project members in the list. Use this to prepare content before making it available to the team.
* **Pinned** - when checked, the page shows a bookmark icon and moves to the top of the page list.
* **Allow Sharing** - when enabled, a public link is generated so anyone can read the page without logging in. See [Sharing a page](#sharing-a-page) below.
* **Preview** - opens the public view of the page in your browser. This button is only shown when Allow Sharing is on.
* **Delete** - permanently removes the page. This action cannot be undone.

Click **Save** to apply any changes.

## Sharing a page

You can share a wiki page with people who do not have an account on Information Hub.

1. Open the page and click the **Settings** (gear icon) button.
2. Enable the **Allow Sharing** toggle and click **Save**.
3. Return to the page view. A **Share** button now appears in the toolbar.
4. Click **Share** to open a popover showing the public URL.
5. Click the copy icon to copy the link to your clipboard.
6. Send the link to anyone you want to share the page with - no account is required to view it.

The public page displays the formatted markdown content of the page. The project sidebar, member lists, table data, and all other project details are not visible to public readers.

To stop sharing a page, go back to **Settings**, turn **Allow Sharing** off, and click **Save**. The link stops working immediately. The page and its content are not deleted.

## Organise with sub-pages

You can nest pages under other pages to create a structured hierarchy. This is useful for grouping related content together - for example, a "Field Protocols" parent page with individual protocol pages underneath.

## What to document

The Wiki is a good place to keep:

* **Research methods** - describe your methodology so team members can follow consistent procedures.
* **Field protocols** - step-by-step instructions for data collection in the field.
* **Data dictionaries** - define what each field in your forms and tables means.
* **Meeting notes** - record decisions and action items.
* **Reference material** - links to papers, regulations, or external resources.


# Apps

Apps let you create shareable, public-facing views of your project data. Combine dashboards, forms, and wiki pages into a single app and share it with anyone using a public link.

<figure><img src="/files/yVFXE8dIIVS8DcoLWTab" alt="The apps page"><figcaption><p>The apps page</p></figcaption></figure>

## The apps list

The apps list shows all apps in your project. Use the **search bar** at the top to filter apps by name as you type.

Each app in the list has a three-dot options menu (**...**) with the following actions:

* **Share** - opens the app's public URL so you can copy and share it
* **Settings** - navigates to the app settings page
* **Delete** - permanently removes the app and its public link

## Create an app

1. Open the **Apps** module from the project sidebar.
2. Click the **Create App** button in the top-right toolbar.
3. Enter an **App Name** (3 to 64 characters).
4. Click **Create**.

Your new app opens in the app builder, ready for you to add pages.

## The app builder

The app builder shows the list of pages currently in your app. Each page links to a dashboard, form, or wiki page from your project.

<figure><img src="/files/yVFXE8dIIVS8DcoLWTab" alt="The apps page"><figcaption><p>The apps page</p></figcaption></figure>

### Add a page

Pages are added by pasting in the shared link of a dashboard, form, or wiki page from your project.

1. Open your app from the apps list.
2. Click **Add Page** in the top-right toolbar.
3. Paste the shared link for the content you want to add. The link should be in the format `app.informationhub.io/dashboard/...`, `app.informationhub.io/form/...`, or `app.informationhub.io/wiki/...`.
4. Click **Add**.

The page is added to your app and is immediately accessible through the app's public link.

{% hint style="info" %}
To get a shared link for a dashboard, open the dashboard and click the **Share** button. Do the same for forms and wiki pages that have sharing enabled.
{% endhint %}

### Reorder or remove pages

1. Click the **Edit** toggle in the toolbar to enter edit mode. The button changes to a filled style when edit mode is active.
2. Drag pages up or down using the **drag handle** on the left of each row to reorder them.
3. Click the **trash icon** on a page row to remove that page from the app.
4. Click **Edit** again to exit edit mode.

### Share your app

Click the **Share** button in the toolbar to open a popover showing your app's public link. Click the **copy icon** to copy the link to your clipboard, then send it to your audience.

Viewers do not need an Information Hub account to access a public app.

### Navigate to settings

Click the **Settings** button in the toolbar to go to the app settings page.

## App settings

The app settings page lets you change the app name, control who can access it, and delete the app.

1. Open the **Apps** module from the project sidebar.
2. Click **...** next to an app and select **Settings**, or click **Settings** inside the app builder.

### Name

Enter a new name for your app and click **Save** to apply the change.

### Visibility

The **Visibility** setting controls who can open the app:

| Option        | Who can access                            |
| ------------- | ----------------------------------------- |
| **Private**   | Only project members with the link        |
| **Public**    | Anyone with the link - no login required  |
| **Protected** | Requires a password or project membership |

Change the visibility and click **Save**.

{% hint style="info" %}
Use **Public** when you want to share results with external stakeholders, publish open data, or create a simple data portal. Use **Protected** if you need to restrict access to invited users.
{% endhint %}

### Delete an app

At the bottom of the app settings page, click **Delete** in the **Delete App** section. This permanently removes the app and its public link. The underlying dashboards, forms, and wiki pages are not affected.

{% hint style="warning" %}
Deleting an app cannot be undone. Anyone with the public link will no longer be able to access it.
{% endhint %}


# Users

The Users page lets you manage who has access to your project. You can invite new members, assign roles, and remove users.

<figure><img src="/files/TRdFi0o2F6kPU4GB1Gc5" alt="The users page"><figcaption><p>The users page</p></figcaption></figure>

## Finding a member

The users list has a **search bar** at the top. Type a name or email address to filter the list in real time. If your project has many members, use the **Previous** and **Next** arrows at the bottom of the list to move between pages.

## Invite users

1. Open the **Users** module from the project sidebar.
2. Click the **Add User** button.
3. On the invite page, start typing the person's email address or username in the search field. A list of matching users appears as you type - click a name to select them.
4. If the person is not shown in the list, type their full email address and click **Add User** directly.

{% hint style="info" %}
The invited user will appear in the list once they have been added. They can access the project according to their assigned role.
{% endhint %}

## Pending invitations and join requests

When someone has requested to join the project or has a pending invitation, their entry in the list is marked accordingly. Two buttons appear next to pending members:

* **Checkmark (Accept)** - approves the request and adds the person as a member.
* **X (Reject)** - declines or removes the pending request.

These buttons are only visible to users with the appropriate permissions.

## Roles

Information Hub provides three built-in roles:

| Role          | What they can do                                                                 |
| ------------- | -------------------------------------------------------------------------------- |
| **Admin**     | Full control over the project, including settings, user management, and all data |
| **User**      | View and edit data across all modules (forms, tables, dashboards, etc.)          |
| **Submitter** | Submit data through forms only - cannot view or edit other project data          |

### Editing a member's role

1. Find the member in the list.
2. Click the **ellipsis (three-dot) menu** on their row.
3. Select **Edit Role**.
4. In the dialog that appears, choose a new role from the selector.
5. Click **Update** to save the change.

### Custom roles

If the built-in roles do not fit your needs, you can create custom roles with specific permissions:

1. Go to [Project Settings](/project/settings).
2. Open the **Roles** section.
3. Create a new role and configure its permissions.

## Remove a user

To remove someone from your project:

1. Find the user in the list.
2. Click the **ellipsis (three-dot) menu** on their row.
3. Select **Remove**.
4. Confirm the removal.

{% hint style="warning" %}
Removing a user revokes their access to the project immediately. Any data they submitted remains in the project.
{% endhint %}

## Leave a project

If you are a member of a project and there is at least one other Admin, you can leave the project yourself. Click the **Leave Project** button in the toolbar at the top of the Users page.

{% hint style="warning" %}
You cannot leave a project if you are the only Admin. Transfer the Admin role to another member first, or ask an Admin to remove you.
{% endhint %}


# Settings

Project Settings let you configure your project's identity, visibility, access controls, and more.

<figure><img src="/files/zsS6B3P1dbJhNVA2aOC9" alt="Project settings"><figcaption><p>Project settings</p></figcaption></figure>

## Project details

Update basic project information:

* **Name** - change the display name of your project.
* **Description** - add or update a summary of what the project is about.
* **Logo** - upload a custom image to make your project easy to recognise.

## Visibility

Control who can see your project:

* **Private** - only invited team members can access the project.
* **Public** - the project is publicly discoverable and appears in the Marketplace. Non-members can find it in browse results and copy it as a template, but project content (tables, forms, dashboards) remains accessible to invited members only.

To change visibility, open the visibility setting and toggle between private and public.

## Template

The **Template** toggle marks your project as a template that others can copy. When enabled, your project appears in the Marketplace so that other users can use it as a starting point for their own work.

{% hint style="info" %}
For your project to appear in the Marketplace, it must be both marked as a Template **and** set to **Public** visibility.
{% endhint %}

## Copy a project

You can make a copy of any project you own or manage. This is useful for starting a new project based on an existing structure, or for creating backups before making large changes.

To copy a project:

1. Open **Settings** for the project.
2. Click the **Copy Project** link. The copy dialog opens.
3. Under **Owner**, select who will own the new project - this can be yourself, an organisation you belong to, or a group.
4. Enter a **Project Name** for the copy.
5. Choose what to copy by ticking the checkboxes in the **Structures** column. Available structures are: Dashboards, Forms, Tables, Storage, Manager, Wiki, and Apps.
   * Use **Select All** in the Structures column to tick or untick all structures at once.
6. Optionally, tick the checkboxes in the **Data** column to also copy the data stored in each structure. Data checkboxes only appear when the corresponding structure is selected.
   * Use **Select All** in the Data column to tick or untick all data at once.
7. Click **Copy** to create the new project.

{% hint style="info" %}
Copying a project only duplicates structure and data. It does not grant anyone new access, and does not share your data with others.
{% endhint %}

## Change project owner

You can transfer ownership of a project to an organisation, a group, or another project member.

To change the owner:

1. Open **Settings** for the project.
2. Click the **Change Owner** link. The transfer ownership page opens.
3. Select the type of new owner using the radio buttons: **Organisation**, **Group**, or **User**.
4. A dropdown appears below the radio buttons. Select the specific organisation, group, or user you want to transfer to.
5. Click **Submit** to complete the transfer.

{% hint style="warning" %}
Transferring ownership changes who controls the project's settings and billing. Make sure you are transferring to the correct owner before confirming. This action cannot be undone from the settings page.
{% endhint %}

## Custom roles and permissions

Create and manage custom roles for fine-grained access control. See [Users](/project/users) for more details on how roles are assigned to project members.

**Create a role:**

1. Open the **Roles** section in Settings.
2. Click **Create New Role**.
3. Enter a name for the role.
4. Click **Create**.

**Update a role:**

1. Click **Update Role**.
2. Select the role you want to edit from the dropdown.
3. Edit the role name if needed.
4. Toggle the individual permission checkboxes on or off to control what the role can do.
5. Click **Save**.

**Delete a role:**

1. Click **Delete Role**.
2. Select the role you want to remove from the dropdown.
3. Click **Delete** to confirm.

{% hint style="info" %}
Roles you create here can be assigned to project members from the [Users](/project/users) page.
{% endhint %}

## API keys (project-level)

{% hint style="warning" %}
The API keys section in project settings is currently a prototype and is not fully functional. It is not accessible from the project sidebar. If you need programmatic access to project data, use the API keys in your **Account Settings** (Home - Settings) instead.
{% endhint %}

## Delete a project

If you no longer need a project, you can move it to trash:

1. Scroll to the bottom of the Settings page.
2. Click **Delete project** (or **Move to trash**).
3. Confirm the action.

{% hint style="warning" %}
Deleting a project moves it to the trash. You can restore it from the trash if needed. Permanent deletion happens after the retention period expires.
{% endhint %}


# Tutorial: Fynbos in Siberia

This tutorial walks you through Information Hub from start to finish using a fictitious research project. Each section builds on the previous one, introducing progressively more powerful features. Work through them at your own pace -- whether in one sitting or over several days.

## The scenario

Dr. Lena Mwangi is a botanist investigating whether South African fynbos plants can survive in Siberian conditions. She has established two field sites -- Site Alpha near Yakutsk and Site Beta near Novosibirsk -- where she is growing three experimental species:

* *Protea siberica* -- a cold-adapted protea hybrid
* *Erica glacialis* -- a frost-tolerant heath
* *Restio permafrostii* -- a restio adapted to permafrost soils

Her team visits each site regularly to measure plant growth, count leaves, and record soil conditions. She needs a central place to organise the research, collect data in the field, and share findings with collaborators.

## Tutorial levels

| Level                                  | What you will learn                                                                                                                                                                                                                 |
| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Beginner](/tutorial/beginner)         | Create a project, set up your team, build a table and form with a Location question, collect data, upload files, share forms, and see your observations on a map dashboard                                                          |
| [Intermediate](/tutorial/intermediate) | Import and export spreadsheets, add photo capture to forms, manage tasks with kanban boards, document and share wiki pages, build a public app, work offline with the Jobs page, and configure email notifications                  |
| [Advanced](/tutorial/advanced)         | Build analytical dashboards with scorecards and filters, use hidden and QR Code questions, lock rows, configure permissions, create templates, link tables with foreign keys, and use FILE columns to link to external resources    |
| [Super](/tutorial/super)               | Access data via the GraphQL API, generate analysis scripts, create key generators for human-readable IDs, pre-fill forms from URL parameters, review the audit log with rollback, set up webhooks, and configure dynamic file paths |

{% content-ref url="/pages/5DuQnBpQZrnktz3cT1xM" %}
[Beginner: Getting Started](/tutorial/beginner)
{% endcontent-ref %}

{% content-ref url="/pages/Je2VG52VYdxVi3Sk4cYA" %}
[Intermediate: Data Workflows](/tutorial/intermediate)
{% endcontent-ref %}

{% content-ref url="/pages/dkk4sruErIltpKhUa9zK" %}
[Advanced: Analysis & Configuration](/tutorial/advanced)
{% endcontent-ref %}

{% content-ref url="/pages/rXV4uECb5z8HAX09kIpj" %}
[Super: Programmatic Access & Automation](/tutorial/super)
{% endcontent-ref %}


# Beginner: Getting Started

This section covers the foundations: creating a project, organising your team, building a table and form, collecting data, and sharing your form with field workers. By the end you will have a complete data collection workflow.

{% hint style="info" %}
If you do not have an account yet, see [Create an Account](/getting-started/register) first.
{% endhint %}

***

## Step 1: Create the project

Every piece of work in Information Hub lives inside a project. A project groups your data, files, forms, team members, and tools together.

1. From the Home screen, click the **+** button to create a new project.
2. Enter the name **Fynbos in Siberia**.
3. Set the visibility to **Private** (only invited members will have access).
4. Add a description, for example: *"Investigating the survival of South African fynbos species under Siberian climatic conditions across two field sites."*
5. Click **Create**.

<figure><img src="/files/Je0drBAyy7NDvngr6pym" alt="Creating the Fynbos in Siberia project"><figcaption><p>Creating the project</p></figcaption></figure>

Your new project appears in the sidebar. Click on it to open the project workspace.

<figure><img src="/files/w7ysWbpmrQDoxbTlWdlk" alt="The newly created project"><figcaption><p>The project is ready</p></figcaption></figure>

***

## Step 2: Set up your organisation and group

Before adding data, Dr. Mwangi sets up her team structure. Information Hub uses a hierarchy of **organisations**, **groups**, and **projects** to manage people and permissions.

### Create an organisation

An organisation is the top-level container. It represents your institution, lab, or company.

1. From the Home screen, click **Organisations** in the sidebar.
2. Click the **+** button to create a new organisation.
3. Enter the name **Mwangi Research Lab**.
4. Click **Create**.

### Create a group

Groups sit inside organisations and let you organise people by team, department, or role.

1. Open the **Mwangi Research Lab** organisation.
2. Click **Groups** in the sidebar, then click the **+** button.
3. Enter the name **Siberian Field Team**.
4. Click **Create**.

### Add team members

1. Open the **Siberian Field Team** group.
2. Click **Members**, then click the **+** button to invite members.
3. Add **Dr. Yuki Tanaka** and **Dr. Pavel Volkov** by entering their email addresses.
4. Assign each member an appropriate role (e.g., **Member**).

***

## Step 3: Understand permissions

Information Hub uses role-based permissions at four levels:

| Level            | What it controls                                        |
| ---------------- | ------------------------------------------------------- |
| **Site**         | Platform-wide access (managed by administrators)        |
| **Organisation** | Who can manage the organisation and its groups          |
| **Group**        | Who belongs to the group and what they can do inside it |
| **Project**      | Who can view, edit, or manage a specific project        |

Permissions **trickle down** through the hierarchy. If Dr. Tanaka has the Member role in the **Siberian Field Team** group, and that group is linked to the **Fynbos in Siberia** project, she automatically inherits the appropriate project permissions.

For now, the default roles are sufficient. You will learn how to configure custom permissions in the [Advanced](/tutorial/advanced) section.

***

## Step 4: Create the Species Observations table

Dr. Mwangi needs a structured table to store every observation her team records in the field.

1. In the project sidebar, click **Tables**.
2. Click the **+** button to create a new table.
3. Enter the name **Species Observations**.
4. Keep the default auto-incrementing integer primary key - this gives each observation a unique ID automatically.
5. Click **Create**.

<figure><img src="/files/PfFMWyH92uel7LsuybHq" alt="Creating the Species Observations table"><figcaption><p>Creating the table</p></figcaption></figure>

Now add the columns the team needs. For each column, click the **+** button in the table header and choose the appropriate data type:

| Column name       | Data type | Purpose                                    |
| ----------------- | --------- | ------------------------------------------ |
| species\_name     | Text      | Which species was observed                 |
| site              | Text      | Site Alpha or Site Beta                    |
| location          | Text      | GPS coordinates from the location question |
| height\_cm        | Real      | Plant height in centimetres                |
| leaf\_count       | Integer   | Number of leaves counted                   |
| soil\_ph          | Real      | Soil pH at the observation point           |
| observation\_date | Date      | Date the observation was recorded          |
| observer          | Text      | Name of the person who recorded it         |

{% hint style="info" %}
The **location** column is a plain **Text** column. The Location question type on the form stores coordinates as a `latitude,longitude` string (e.g. `62.0355,129.6753`). If you want latitude and longitude stored in separate columns for dashboard use, add two **Double Precision** columns called `latitude` and `longitude` - you can then map the Location question to two separate Number questions linked to each column. For this tutorial we use a single column for simplicity.
{% endhint %}

<figure><img src="/files/pvloowrI6vOLsirr2CU5" alt="The table with all columns added"><figcaption><p>All columns added to the table</p></figcaption></figure>

***

## Step 5: Enter observation data

Click the **ADD** button in the toolbar, then select **Add Row**. A form appears with a field for each column. Fill in the values and click **Add** to save the row. Repeat for each observation.

Here are the first observations Dr. Mwangi's team recorded:

| species\_name       | site       | location         | height\_cm | leaf\_count | soil\_ph | observation\_date | observer        |
| ------------------- | ---------- | ---------------- | ---------- | ----------- | -------- | ----------------- | --------------- |
| Protea siberica     | Site Alpha | 62.0355,129.6753 | 45.2       | 34          | 5.8      | 2026-01-15        | Dr. Lena Mwangi |
| Erica glacialis     | Site Alpha | 62.0361,129.6748 | 12.7       | 156         | 5.6      | 2026-01-15        | Dr. Lena Mwangi |
| Restio permafrostii | Site Beta  | 55.0084,82.9357  | 78.5       | 22          | 6.1      | 2026-01-16        | Dr. Yuki Tanaka |
| Protea siberica     | Site Beta  | 55.0090,82.9361  | 38.9       | 28          | 6.3      | 2026-01-16        | Dr. Yuki Tanaka |
| Erica glacialis     | Site Beta  | 55.0087,82.9355  | 15.3       | 189         | 6.0      | 2026-01-16        | Dr. Lena Mwangi |

After entering all five rows, the table looks like this:

<figure><img src="/files/xilwbVZeBIALIE93jQhG" alt="The Species Observations table with five rows of data"><figcaption><p>Five observations recorded</p></figcaption></figure>

***

## Step 6: Upload files to Storage

Before heading into the field, Dr. Mwangi uploads some reference files so the team has everything in one place.

1. In the project sidebar, click **Storage**.
2. Drag and drop files into the storage area, or click the upload button. Upload:
   * A photo of each field site (e.g., `site_alpha.jpg`, `site_beta.jpg`)
   * The field protocol document (e.g., `field_protocol.pdf`)
3. The files appear in the storage list immediately.

Storage works like a simple file manager. You can create folders to organise files, preview images, and download anything you have uploaded. Think of it as a backup for all your project's supporting documents.

***

## Step 7: Create a data collection form

To make field data collection easier, Dr. Mwangi creates a mobile-friendly form linked to the table.

1. Click **Forms** in the project sidebar.
2. Click **Create Form**.
3. Enter the name **Field Observation Form** and click **Create**.

<figure><img src="/files/GBc2Wcqk6LsDZ10fCQyE" alt="The create form page"><figcaption><p>Creating the Field Observation Form</p></figcaption></figure>

4. The form builder opens. Click **CLICK HERE TO ADD A NEW SECTION** to create a section.
5. Name the section **Observation Details**.

Now add questions - one for each column in the Species Observations table. For each question, select the matching table and column so that submitted answers are stored directly in the table.

Most questions use straightforward text or number types, but the **location** column deserves special attention:

### Using the Location question type

Instead of asking respondents to type coordinates by hand, use the **Location** question type. It provides an interactive map that makes GPS capture fast and accurate in the field.

1. Add a question and set the **Type** to **Location**.
2. Name it **Observation Location**.
3. Link it to the **location** column in the Species Observations table.

When a field worker fills in this question:

* An **interactive map** appears. They can tap or click anywhere to drop a pin and capture the coordinates.
* The **Use Current Position** button uses the device's GPS to place the pin at their exact location - ideal for field use.
* The **Edit coordinates** toggle reveals manual text fields for latitude and longitude if they need to enter coordinates by hand.

This replaces the need for separate latitude and longitude text fields and reduces errors in the field.

7. Add the remaining questions for species\_name, site, height\_cm, leaf\_count, soil\_ph, observation\_date, and observer.
8. Save the form.

<figure><img src="/files/ZK3uDNoI4811akMGg8NK" alt="The form builder with a new section"><figcaption><p>The form builder in edit mode</p></figcaption></figure>

See [Question Types](/project/forms/question-types) for the full guide on all available question types and their settings.

***

## Step 8: Save a draft and fix errors

Large forms can take time to fill in. Information Hub lets you save your progress and come back later.

1. Open the **Field Observation Form**.
2. Fill in just the first few fields (e.g., species\_name and site) but leave the rest blank.
3. Click **Save Draft**. The form is saved locally on your device.
4. Close the form and come back to it later - your answers will still be there.
5. When you are ready, fill in the remaining fields and submit.

If you try to submit a form with required fields left empty or invalid values, the form highlights the errors. Click on any error message to **jump directly to the problem question** so you can fix it without scrolling through the entire form.

***

## Step 9: Share the form

Dr. Mwangi needs her field team to access the form on their phones without opening the full app.

1. Open the **Field Observation Form**.
2. Click **Share**.
3. Copy the **share link** - anyone with this link can open and submit the form in their browser.
4. Use the **QR code** - print it or display it on a screen so team members can scan it with their phone camera.

You can configure whether the form requires sign-in or allows anonymous submissions. See [Share a Form](/project/forms/share-form) for details.

***

## Step 10: Submit field data

Now let's simulate a day of fieldwork. Open the form (either from the Forms list or via the share link) and submit three new observations. For the location, use the **Use Current Position** button or tap on the map to place a pin at the approximate coordinates:

**Submission 1:**

| Field             | Value                          |
| ----------------- | ------------------------------ |
| species\_name     | Restio permafrostii            |
| site              | Site Alpha                     |
| location          | Tap map near 62.0358, 129.6751 |
| height\_cm        | 82.1                           |
| leaf\_count       | 25                             |
| soil\_ph          | 5.7                            |
| observation\_date | 2026-02-01                     |
| observer          | Dr. Lena Mwangi                |

**Submission 2:**

| Field             | Value                          |
| ----------------- | ------------------------------ |
| species\_name     | Protea siberica                |
| site              | Site Alpha                     |
| location          | Tap map near 62.0353, 129.6755 |
| height\_cm        | 47.8                           |
| leaf\_count       | 36                             |
| soil\_ph          | 5.9                            |
| observation\_date | 2026-02-01                     |
| observer          | Dr. Yuki Tanaka                |

**Submission 3:**

| Field             | Value                         |
| ----------------- | ----------------------------- |
| species\_name     | Erica glacialis               |
| site              | Site Beta                     |
| location          | Tap map near 55.0085, 82.9358 |
| height\_cm        | 16.1                          |
| leaf\_count       | 201                           |
| soil\_ph          | 6.2                           |
| observation\_date | 2026-02-02                    |
| observer          | Dr. Lena Mwangi               |

After submitting all three, go back to **Tables** and open the **Species Observations** table. You should now see eight rows - the five you entered manually plus the three from the form.

***

## Step 11: See your data on a map

Dr. Mwangi wants a live view of where her observations are coming from. A **Map dashboard** shows every submitted observation as a pin on an interactive map.

### Create a dashboard

1. In the project sidebar, click **Dashboards**.
2. Click the **+** button to create a new dashboard.
3. Name it **Field Map**.
4. Click **Create**.

### Add a data source

A dashboard can only display data that has been connected to it through a **data source**. A data source is a configured link between the dashboard and one of your project's tables.

1. On the **Field Map** dashboard, click **Manage Data Source**.
2. Click **Add Data Source**.
3. Set **Data Source Type** to **Table**.
4. Enter the name **Observations** and leave the description blank.
5. Under **Select Data Source**, choose **Species Observations**.
6. Click **Test Connection** to verify the link works.
7. Click **Create**.

The data source is now listed. Click it to open the configuration view:

* In the **Configure data source** section, each column in Species Observations is listed.
* Make sure all the columns you want to use in components (at minimum: location, species\_name, site) are **enabled** (checked).
* Click **Save**.

Go back to the dashboard using the **Back** button.

### Add a Map component

1. Click **Create Component**.
2. Set **Type** to **Map**.
3. Enter the name **Observation Locations**.
4. Set the **Column Width** to 12 (full width) and an appropriate **Height**.
5. In the **Map** section, click **Add Table to Map** to add a layer.
6. Set the layer **Name** to **All Observations** and the layer **Type** to **Point Map**.
7. Set **Datasource** to **Observations**.
8. Set the **Latitude** column and **Longitude** column.

{% hint style="info" %}
Because the tutorial stores coordinates as a combined `latitude,longitude` text string in one column, you will need separate `latitude` and `longitude` columns to use the Map component. If you followed the note in Step 4 and added two Double Precision columns, select those here. If not, skip this step for now and revisit it after the [Intermediate](/tutorial/intermediate) section when you import data with separate coordinate columns.
{% endhint %}

9. Under **Location information**, click **Add Information Column** and select **species\_name** - this label appears when a pin is clicked.
10. Click **Update** to save the component.

The map now shows a pin for every observation in the table. Clicking a pin shows the species name. As more data is submitted, the map updates automatically when you click **Refresh**.

***

## Step 12: Explore the Marketplace

Before moving on, take a quick look at the **Marketplace**. From the Home screen, click **Marketplace** in the sidebar.

The Marketplace contains pre-built project templates created by other users. You can browse templates, preview what tables, forms, and dashboards they include, and use one to create a new project instantly - saving you the setup work.

For now, just browse and see what is available. You will learn how to create and publish your own templates in the [Advanced](/tutorial/advanced) section.

***

## What you have learned

* How to create a project and set its visibility
* How to set up an organisation, group, and invite team members
* How permissions work across the four-level hierarchy
* How to create a table and define columns with appropriate data types
* How to enter data manually into a table
* How to upload files to Storage for safekeeping
* How to build a form with a Location question for GPS capture in the field
* How to save form drafts and fix validation errors
* How to share a form via link and QR code
* How to submit data through a form and verify it in the table
* How to connect a table to a dashboard via a data source and create a map of your observations
* Where to find the Marketplace for project templates

***

## Next steps

In the [Intermediate](/tutorial/intermediate) section, you will import a larger dataset from a spreadsheet, add photo capture to your form, manage tasks with kanban boards, document your project in the wiki, build a public app, and collect data offline.


# Intermediate: Data Workflows

This section builds on the project you created in [Beginner](/tutorial/beginner). You will import a larger dataset, add photo capture to your form, export results, manage tasks, document your project, build a public app, and collect data offline.

{% hint style="info" %}
This section assumes you have completed the [Beginner](/tutorial/beginner) tutorial and have the **Fynbos in Siberia** project with the **Species Observations** table and **Field Observation Form** already set up.
{% endhint %}

***

## Step 1: Import data from a spreadsheet

Dr. Mwangi's colleague Dr. Volkov has been collecting observations in a spreadsheet. Instead of re-entering everything by hand, she imports the file directly.

### Add latitude and longitude columns

The standard for storing location data is two separate columns - one for latitude and one for longitude. Before importing, add these to the Species Observations table:

1. Open the **Species Observations** table.
2. Click **ADD** in the toolbar, then **Add Column**.
3. Add two columns:
   * Name: `latitude`, type: **Double Precision**
   * Name: `longitude`, type: **Double Precision**
4. Click **Save**.

{% hint style="info" %}
With separate `latitude` and `longitude` columns in place, you can now return to the **Field Map** dashboard from the Beginner section and configure the Map component's lat/lng fields. See [Beginner](/tutorial/beginner) step 7 for the Map component setup.
{% endhint %}

### Prepare the file

Create a CSV file (`.csv`) or TSV file (`.tsv`) with the same column names as the Species Observations table. Here is an example with 20 rows:

```
species_name,site,latitude,longitude,height_cm,leaf_count,soil_ph,observation_date,observer
Protea siberica,Site Alpha,62.0352,129.6749,46.5,35,5.7,2026-02-10,Dr. Pavel Volkov
Erica glacialis,Site Alpha,62.0364,129.6742,13.1,162,5.5,2026-02-10,Dr. Pavel Volkov
Restio permafrostii,Site Alpha,62.0359,129.6747,80.2,24,5.8,2026-02-10,Dr. Pavel Volkov
Protea siberica,Site Beta,55.0092,82.9363,39.7,29,6.4,2026-02-11,Dr. Pavel Volkov
Erica glacialis,Site Beta,55.0088,82.9352,16.0,195,6.1,2026-02-11,Dr. Pavel Volkov
Restio permafrostii,Site Beta,55.0083,82.9359,79.1,21,6.0,2026-02-11,Dr. Pavel Volkov
Protea siberica,Site Alpha,62.0356,129.6750,48.1,37,5.9,2026-02-15,Dr. Lena Mwangi
Erica glacialis,Site Alpha,62.0362,129.6746,13.8,168,5.6,2026-02-15,Dr. Lena Mwangi
Restio permafrostii,Site Alpha,62.0357,129.6752,83.4,26,5.7,2026-02-15,Dr. Yuki Tanaka
Protea siberica,Site Beta,55.0091,82.9360,40.5,30,6.2,2026-02-16,Dr. Yuki Tanaka
Erica glacialis,Site Beta,55.0086,82.9356,16.8,203,6.0,2026-02-16,Dr. Yuki Tanaka
Restio permafrostii,Site Beta,55.0082,82.9358,80.8,23,6.1,2026-02-16,Dr. Lena Mwangi
Protea siberica,Site Alpha,62.0354,129.6751,49.3,38,5.8,2026-03-01,Dr. Lena Mwangi
Erica glacialis,Site Alpha,62.0360,129.6745,14.5,175,5.5,2026-03-01,Dr. Pavel Volkov
Restio permafrostii,Site Alpha,62.0358,129.6748,85.0,27,5.9,2026-03-01,Dr. Pavel Volkov
Protea siberica,Site Beta,55.0093,82.9362,41.2,31,6.3,2026-03-02,Dr. Yuki Tanaka
Erica glacialis,Site Beta,55.0089,82.9354,17.5,210,5.9,2026-03-02,Dr. Yuki Tanaka
Restio permafrostii,Site Beta,55.0081,82.9357,82.1,24,6.2,2026-03-02,Dr. Lena Mwangi
Protea siberica,Site Alpha,62.0355,129.6753,50.8,40,5.7,2026-03-10,Dr. Lena Mwangi
Erica glacialis,Site Alpha,62.0363,129.6744,15.2,182,5.6,2026-03-10,Dr. Lena Mwangi
```

### Import the file

1. In the project sidebar, click **Tables** and open **Species Observations**.
2. Click the **ADD** button in the toolbar, then select **Import Data**.
3. Select your CSV or TSV file.
4. The import preview shows you how the file's columns map to the table's columns. Verify the mapping looks correct.
5. Click **Import**.

The 20 new rows are added to the table. You should now have 28 rows total (5 manual + 3 from form + 20 imported).

See [Import Data](/project/tables/import-data) for more details on column mapping and handling mismatched headers.

***

## Step 2: Add photo capture to the form

Field workers photograph each plant specimen as part of the observation. Dr. Mwangi adds a **File Upload** question to the form so photos are captured in the same submission as the measurements.

### Add a File Upload column to the table

First, the table needs a column to hold the photo references.

1. Open the **Species Observations** table.
2. Click **ADD** in the toolbar, then **Add Column**.
3. Enter the name `plant_photo` and set the data type to **File**.
4. Click **Save**.

{% hint style="info" %}
File columns require a **storage path** configuration - this tells the platform where uploaded files are saved in your project's Storage. When you create the column, a path is set automatically. You can customise it in the column settings. See [Super: Dynamic file paths](/tutorial/super) for how to organise uploads by site and date automatically.
{% endhint %}

### Add the question to the form

1. Open the **Field Observation Form** in the form builder (click **Edit** in the form toolbar).
2. At the bottom of the **Observation Details** section, click **CLICK HERE TO ADD A QUESTION**.
3. Name the question **Plant Photo**.
4. Set the **Type** to **File Upload**.
5. Link it to the **plant\_photo** column in the Species Observations table.
6. Click **Save**.

### What field workers see

When filling in the form, the Plant Photo question shows four capture buttons:

| Button      | Action                                                |
| ----------- | ----------------------------------------------------- |
| File icon   | Opens the device file picker - browse existing photos |
| Camera icon | Opens the device camera to take a photo on the spot   |
| Video icon  | Records a short video clip                            |
| Mic icon    | Records an audio note                                 |

On a phone in the field, the **camera** button is the most useful - it opens the camera directly without leaving the form.

After taking a photo, it appears as a thumbnail with a link. A **trash** icon removes it if the wrong photo was taken. Multiple files can be attached to a single question.

Submit one of the existing test observations again (via the form) and attach a photo. Then open the Species Observations table and click on the File cell for that row - the photo appears as a clickable link.

***

## Step 3: Export data

Dr. Mwangi wants to share a snapshot of the data with a collaborator who uses Excel.

1. Open the **Species Observations** table.
2. Click the **Export** button in the toolbar.
3. Choose the format:
   * **Export as TSV** - tab-separated values, works in any spreadsheet tool
   * **Export as XLSX** - Microsoft Excel format
4. The file downloads to your device immediately.

See [Export Data](/project/tables/export-data) for details on the export options and how to share a read-only public view of a table.

***

## Step 4: Storage - working with archives

In the Beginner section you uploaded individual files. Storage also supports working with archives.

### Upload and extract a ZIP file

Dr. Volkov has sent a ZIP archive containing 50 site photos organised into folders.

1. Go to **Storage** in the project sidebar.
2. Upload the ZIP file.
3. After the upload completes, click the ellipsis (**...**) next to the ZIP file and select **Extract**. Information Hub unpacks the archive and creates the folder structure automatically.
4. Browse the extracted folders to verify the photos are in place.

### Download files

To download a file, click the ellipsis next to it and select **Download**. For folders, downloading produces a ZIP archive of the folder's contents automatically.

***

## Step 5: Manager - plan fieldwork with kanban boards

Dr. Mwangi uses the Manager to organise upcoming fieldwork tasks.

1. In the project sidebar, click **Manager**.
2. Click the **+** button to create a new workbook.
3. Name it **March Fieldwork**.
4. The board opens with default columns: **To Do**, **Busy**, and **Done**.

### Add task cards

1. Click the **+** button in the **To Do** column.
2. Add cards for upcoming tasks:
   * "Collect Site Alpha measurements - March 15"
   * "Collect Site Beta measurements - March 16"
   * "Download weather station data"
   * "Review and clean imported data"
   * "Prepare monthly report"
3. As work progresses, drag cards from **To Do** to **Busy**, and then to **Done**.

You can assign cards to team members, set due dates, and add descriptions in Markdown. See [Manager](/project/manager) for the full guide.

***

## Step 6: Wiki - document field protocols

The project Wiki is the place for long-form documentation that the whole team can reference.

1. In the project sidebar, click **Wiki** (or **Documentation**).
2. Click the **+** button to create a new page.
3. Name it **Field Protocol**.
4. Write the measurement procedure:

> **Field Protocol - Species Observations**
>
> 1. Arrive at the site and record GPS coordinates using the Location question on the form.
> 2. Locate the tagged plant specimen.
> 3. Measure the height from soil level to the tallest point in centimetres.
> 4. Count all visible leaves on the main stem.
> 5. Take a soil pH reading at the base of the plant using the handheld meter.
> 6. Record all values in the Field Observation Form on your phone.
> 7. Use the **Plant Photo** question to photograph the specimen.

5. Click **Save**.
6. Create a second page called **Species Descriptions** with notes on each of the three species.

### Share the protocol publicly

Dr. Mwangi wants to share the field protocol with collaborators who do not have an account.

1. Open the **Field Protocol** page.
2. Click the **Settings** (gear icon) button in the toolbar.
3. Enable **Allow Sharing** and click **Save**.
4. Return to the page view. Click **Share** and copy the public URL.
5. Anyone with the link can read the page without logging in.

See [Wiki](/project/wiki) for more details on page settings and pinning.

***

## Step 7: Apps - build a public-facing view

Dr. Mwangi wants to share the data collection form and some results with external collaborators who do not have Information Hub accounts.

### Create an app

1. In the project sidebar, click **Apps**.
2. Click the **+** button to create a new app.
3. Name it **Fynbos in Siberia - Collaborator Portal**.

### Add pages

Apps are made up of pages. Each page can display a form, a dashboard, or a wiki page.

1. Click **Add Page** and paste the shared link of the **Field Observation Form** (enable sharing on the form first if you have not already).
2. Click **Add**. The form page is added to the app.
3. Click **Add Page** again and paste the shared link of the **Field Map** dashboard (enable sharing on the dashboard first).
4. Click **Add**.

### Share the app

1. Click the **Share** button in the toolbar to open the share popover.
2. Copy the public link and send it to collaborators.

Anyone with the link can access the app pages without needing an Information Hub account. See [Apps](/project/apps) for the full guide.

***

## Step 8: Offline forms - collect data without internet

Field sites in Siberia do not always have reliable internet. Information Hub supports offline data collection.

### Save the form to your device

Do this while you still have internet access.

1. Open the **Field Observation Form**.
2. In the action bar at the top of the form view, tap **Save for Offline** (bookmark icon).
3. The form is saved to your device. You can now use it without a connection.

{% hint style="warning" %}
Save the form for offline use **before** you go into the field. The button is not available once you are offline.
{% endhint %}

### Collect data without internet

4. Turn off WiFi and mobile data on your device.
5. Open the form as normal - it loads from the local cache.
6. Fill in observations and tap **Submit**. Each submission is queued locally.
7. Repeat as needed. All submissions stay on the device until you sync.

### Monitor and upload with Jobs

When you are back online, submitted observations do not upload automatically - you manage the sync from the **Jobs** page.

1. From the **Home** screen, click **Jobs** in the sidebar.
2. The **Overview** tab shows all pending jobs (one per offline submission).
3. For each pending job, click the **ellipsis (...)** button to open the options menu:
   * **Execute** - uploads the submission to the server immediately.
   * **Download** - saves a local ZIP of the submission data before uploading.
4. Click **Execute** on each job to push the data to the Species Observations table.
5. Switch to the **History** tab to see completed uploads.

If a submission fails to upload (for example, a required field was empty), it appears in the **Manager** tab. From there you can retry or download the failed job data to investigate the issue.

{% hint style="info" %}
Do not clear your browser data or app cache while you have pending jobs. This will permanently delete locally stored submissions before they are uploaded.
{% endhint %}

***

## Step 9: Email notifications on form submission

Dr. Mwangi wants her field assistant to be notified by email every time someone submits the Field Observation Form.

1. Open the **Field Observation Form** and click **Settings** in the toolbar.
2. In the **General settings** section, find the **Email List** field.
3. Enter Dr. Mwangi's email address (and any other recipients, comma-separated).
4. Make sure the **Send Custom Email** toggle is **OFF** (this is the default).
5. Click **Save**.

From now on, every form submission will send a notification email to the submitter and to everyone in the Email List.

{% hint style="info" %}
Turning the **Send Custom Email** toggle **ON** suppresses all notification emails entirely - including to the submitter and to addresses in the Email List. Use it when you want silent submissions during high-volume data entry.
{% endhint %}

Submit a test observation and check your inbox to verify the notification arrives.

***

## Step 10: Update forms - revisit existing records

Sometimes a field worker needs to go back and update a previous observation - for example, to correct a measurement or add a note.

1. Go to **Forms** in the project sidebar.
2. Click **Create Form** and name it **Update Observation**.
3. In the create form dialog, set the form type to **Update**.
4. Select the **Species Observations** table.
5. Tick the columns you want field workers to be able to update (e.g., height\_cm, leaf\_count, soil\_ph).
6. Click **Create**.

When a team member opens the update form, they select an existing row by its primary key (the observation ID). The form loads the current values and the user can edit and re-submit. Only the changed fields are updated in the table.

***

## What you have learned

* How to import data from CSV or TSV files
* How to add a File Upload question so field workers can capture photos on the form
* How to export table data as TSV or XLSX
* How to upload, extract, and download files in Storage
* How to plan and track tasks with kanban boards in the Manager
* How to write and share project documentation in the Wiki
* How to build and publish a public app for external collaborators
* How to collect data offline and sync via the Jobs page
* How to configure email notifications for form submissions
* How to create Update forms for revisiting existing records

***

## Next steps

In the [Advanced](/tutorial/advanced) section, you will add more dashboard components, use advanced question types, configure fine-grained permissions, create project templates, and explore the FILE column trick for linking to external resources.


# Advanced: Analysis & Configuration

This section builds on the project from [Beginner](/tutorial/beginner) and [Intermediate](/tutorial/intermediate). You will build analytical dashboards with more component types, use advanced question types, configure detailed permissions, create reusable templates, and explore how FILE columns can link to external resources.

{% hint style="info" %}
This section assumes you have completed the previous tutorials and have the **Fynbos in Siberia** project with 28+ rows in the **Species Observations** table.
{% endhint %}

***

## Step 1: Build analytical dashboards

In Beginner you created a Field Map dashboard. Now Dr. Mwangi wants charts that show trends and summaries alongside it. Create a second dashboard for analysis.

### Create the dashboard and data source

1. In the project sidebar, click **Dashboards** and click **+** to create a new dashboard.
2. Name it **Growth Trends**.
3. Add a data source: click **Manage Data Source**, then **Add Data Source**.
4. Set the name to **Observations**, type to **Table**, and select **Species Observations**.
5. Test the connection and click **Create**.
6. Open the data source and make sure all columns are enabled. Click **Save**.
7. Return to the **Growth Trends** dashboard.

### Add a Line chart

1. Click **Create Component** and set the **Type** to **Line**.
2. Name it **Height Over Time**.
3. Set **Column Width** to 12 and **Height** to 40.
4. Set **Datasource** to **Observations**.
5. Set **Dimension (X-Axis)** to `observation_date` and **Metric Column (Y-Axis)** to `height_cm`.
6. Set **Calculation** to **Average**.
7. Click **Update**.

### Add a Bar chart

1. Add another component with **Type** set to **Bar**.
2. Name it **Average Height by Site**.
3. Set **Datasource** to **Observations**, **Dimension (X-Axis)** to `site`, **Metric Column** to `height_cm`, **Calculation** to **Average**.
4. Click **Update**.

### Add a Scorecard

A Scorecard shows a single aggregate number at a glance - useful for a running count of total observations.

1. Add a component with **Type** set to **Scorecard**.
2. Name it **Total Observations**.
3. Set **Datasource** to **Observations**.
4. Set **Column** to `id` (the primary key) and **Calculation** to **Count**.
5. Set **Column Width** to 4 and click **Update**.

The scorecard now shows the total number of observation rows as a large number. It updates every time the dashboard is refreshed.

### Add a Filter component

A Filter component lets anyone viewing the dashboard narrow all the other charts to a subset of the data - for example, showing only one species at a time.

1. Add a component with **Type** set to **Filter**.
2. Name it **Filter by Species**.
3. Set **Datasource** to **Observations** and **Column** to `species_name`.
4. Set **Column Width** to 4 and click **Update**.

The filter appears as a dropdown. Selecting a species name from the dropdown updates all other components on the dashboard to show only that species. Click the **X** reset icon to clear the filter and return to the full dataset.

### Share the dashboard

1. Click **Settings** on the dashboard.
2. Enable **Allow Sharing** and click **Save**.
3. Return to the dashboard and click **Share** to get the public URL.
4. Go back to the **Fynbos in Siberia - Collaborator Portal** app and add the Growth Trends dashboard as a new page.

See [Dashboards](/project/dashboards) for all component types and configuration options.

***

## Step 2: Hidden questions

Dr. Mwangi wants to automatically record the date and time of each submission without asking the field worker to enter it manually. A **Hidden** question with a default value does this silently.

1. Open the **Field Observation Form** in the form builder.
2. Add a new question and name it **Submitted At**.
3. Set the **Type** to **Short** (it will store a text timestamp).
4. Link it to a new **Text** column called `submitted_at` in the Species Observations table (create the column first if needed).
5. Click the **cog icon** to open the expanded configuration panel.
6. Enter a **Default value** of the current datetime (or a placeholder your team uses).
7. Back on the question card, enable the **Hidden** toggle.
8. Also enable **Locked** to prevent any accidental editing.
9. Click **Save**.

The question no longer appears when anyone fills in the form, but the `submitted_at` value is included in every submission. Open the Species Observations table after submitting a test observation to verify the column is being populated.

{% hint style="info" %}
Hidden + Locked + Default value is the pattern for any field you want to collect automatically without the respondent's involvement - timestamps, version markers, form identifiers, or environment metadata.
{% endhint %}

***

## Step 3: QR Code questions

Each plant specimen at the field sites has a QR code sticker on its marker stake. Dr. Mwangi wants field workers to scan the QR code instead of typing the specimen ID, to eliminate transcription errors.

### Add a specimen ID column

1. Open the **Species Observations** table and add a new **Text** column called `specimen_id`.

### Add a QR Code question to the form

1. Open the **Field Observation Form** in the form builder.
2. Add a question at the top of the **Observation Details** section and name it **Specimen ID**.
3. Set the **Type** to **QR Code**.
4. Link it to the `specimen_id` column.
5. Click **Save**.

When a field worker opens the form and reaches the Specimen ID question, a camera preview opens automatically. Holding the phone over the QR code on the plant's stake reads the code and populates the field immediately - no button press required.

In the field, place this question at the start of the form so the scan sets the context for the rest of the observation.

***

## Step 4: Row locking

After Dr. Volkov verifies an observation is correct, he wants to lock it so no one can accidentally edit the values. Row locking prevents edits at the row level without deleting the data.

1. Open the **Species Observations** table.
2. Find a row you want to lock (for example, one of the first five manually entered rows).
3. Click the **pencil icon** to open the edit row form.
4. Enable the **Lock row** toggle.
5. Click **Save**.

The row now shows a **lock icon** in the grid. Locked rows cannot be edited until they are explicitly unlocked by someone with the appropriate permission.

{% hint style="info" %}
Row locking is a data integrity tool, not an access control tool. It prevents accidental edits by any user, including admins. Unlocking requires opening the row edit form and toggling the lock off.
{% endhint %}

***

## Step 5: Configure custom permissions

In the Beginner section, you used default roles. Now Dr. Mwangi wants more control: field assistants should be able to submit data but not delete rows or modify the table structure.

### Create a custom role

1. Open the **Fynbos in Siberia** project and go to **Settings**.
2. In the **Role Options** card, click **Create New Role**.
3. Enter the name **Field Assistant** and click **Create**.

### Set permissions

1. Click **Update Role**.
2. Select **Field Assistant** from the role selector.
3. Configure the permissions:
   * **Forms:** Can view and submit forms
   * **Tables:** Can view data and add rows, but not edit or delete rows
   * **Storage:** Can upload files, but not delete files
   * **Manager:** Can view boards and move cards, but not create or delete boards
   * **Settings:** No access
4. Click **Save**.

### Assign the role

1. Go to **Users** in the project sidebar.
2. Click the ellipsis next to the team member you want to restrict.
3. Select **Edit Role** and change their role to **Field Assistant**.

See [Users](/project/users) and [Settings](/project/settings) for details.

***

## Step 6: Marketplace - create and use templates

Dr. Mwangi's group wants to start a similar study in a different region. Instead of setting everything up from scratch, she creates a template from the current project.

### Designate a project as a template

1. Open the **Fynbos in Siberia** project and go to **Settings**.
2. Under **Visibility**, switch the project to **Public** and save.
3. Enable the **Template** toggle and click **Save**.

Both steps are required - the project must be Public **and** have the Template toggle enabled before it appears in the Marketplace.

### Copy the project directly

For one-off copies - for example, to hand off a full project clone to a collaborator - use **Copy Project** instead of the Marketplace:

1. In the project settings, click the **Copy Project** link.
2. Choose the **Owner** (yourself, an organisation, or a group).
3. Enter a new name (e.g., **Fynbos in Patagonia**).
4. Under **Structures**, tick which parts to copy: Dashboards, Forms, Tables, Storage, Manager, Wiki, Apps.
5. Under **Data**, tick any structures whose data you also want to include (tables with rows, storage files, etc.).
6. Click **Copy**.

The new project is created immediately with the selected structures and data. Copy Project is a direct, selective clone. The Marketplace template approach is for sharing a starting structure with many users over time.

### Create a project from a Marketplace template

1. From the Home screen, click **Marketplace** in the sidebar.
2. Find the **Fynbos in Siberia** template card and click it.
3. Information Hub navigates to that project. From there you can use **Copy Project** to make your own copy with a new name.

See [Marketplace](/home/marketplace) for more details.

***

## Step 7: Analyse data

The **Analyse** tool generates ready-to-run R and Python scripts using your data and API key.

1. Open the **Species Observations** table.
2. Click the **Analyse** button in the toolbar.
3. Click the language toggle to switch between **Python** and **R**.
4. The panel shows a generated script that authenticates with your API key, fetches the table data, and loads it into a data frame.
5. Click the **copy** icon to copy the script to your clipboard.
6. Paste it into your local Python or R environment, replace the placeholder API key and table ID values, and run it.

The script loads the full table as a data frame. From there you can run any analysis - grouping, filtering, plotting, statistical tests - using whichever libraries you prefer.

See [Analyse Data](/project/tables/analyse-data) for details.

***

## Step 8: Foreign key columns

As the dataset grows, Dr. Mwangi wants to normalise her data. Instead of storing the site name as free text (which is error-prone), she creates a dedicated Sites table and links to it.

### Create a lookup table

1. Go to **Tables** and create a new table called **Sites**.
2. Add the following columns:

| Column name   | Data type        | Purpose                    |
| ------------- | ---------------- | -------------------------- |
| site\_name    | Text             | The name of the field site |
| latitude      | Double Precision | Central GPS latitude       |
| longitude     | Double Precision | Central GPS longitude      |
| climate\_zone | Text             | Climate classification     |
| elevation\_m  | Integer          | Elevation in metres        |

3. Add two rows:

| site\_name | latitude | longitude | climate\_zone | elevation\_m |
| ---------- | -------- | --------- | ------------- | ------------ |
| Site Alpha | 62.0355  | 129.6753  | Subarctic     | 95           |
| Site Beta  | 55.0084  | 82.9357   | Continental   | 120          |

### Add a foreign key column

1. Open the **Species Observations** table and click **ADD** > **Add Column**.
2. Enter the name `site_ref` and set the data type to **Foreign Key**.
3. Configure it to reference the **Sites** table, linking to the `site_name` column.
4. Click **Save**.

When adding a row or filling in a form, the `site_ref` field shows a search interface populated from the Sites table. This prevents typos and ensures consistency across all observations.

***

## Step 9: JSON questions

Some observations require structured data that does not fit neatly into a single field. JSON questions let form respondents enter key-value pairs or nested data in a structured sub-form.

1. Open the **Field Observation Form** in the form builder.
2. Add a new question and select the **JSON** question type.
3. Name it **Environmental Conditions**.
4. Link it to a new **JSON** column called `env_conditions` in the Species Observations table.
5. In the question builder, define the fields:
   * `wind_speed_kph` (number)
   * `cloud_cover_percent` (number)
   * `precipitation` (dropdown: None, Light, Moderate, Heavy)
   * `notes` (text)
6. Click **Save**.

When a field worker fills in this question, they see a structured mini-form within the main form. The data is stored as a JSON object in the `env_conditions` column.

***

## Step 10: Tabular questions

Dr. Mwangi wants field workers to record multiple plant measurements in a single form submission - for example, measuring five plants at one site visit without submitting five separate forms.

1. Open the **Field Observation Form** in the form builder.
2. Add a new question and select the **Tabular** question type.
3. Name it **Batch Measurements**.
4. Link it to a new **Tabular** column called `batch_data` in the Species Observations table.
5. Define the columns:
   * `species_name` (text)
   * `height_cm` (number)
   * `leaf_count` (number)
   * `soil_ph` (number)
   * `condition` (dropdown: Healthy, Stressed, Dead)
6. Click **Save**.

When filling in the form, the respondent sees a small table where they can add as many rows as needed. All rows are submitted together as part of a single form response. The `condition` column inside the tabular question uses a Dropdown type so the cell presents a constrained list rather than a free-text field.

***

## Step 11: FILE columns as links to external resources

FILE columns in Information Hub are stored as text under the hood - specifically as a string in `filename[url],` format. The grid renders each entry as a clickable link. This means you can use a FILE column to link to **any URL**, including external resources you have not uploaded yourself.

### Add a reference column

1. Open the **Species Observations** table and add a new **File** column called `reference`.
2. You will be prompted for a storage path configuration - enter any path (e.g., `references/`) even though you will not use it for uploads.

### Manually enter an external link

1. Click the **pencil icon** on a row to open the edit form.
2. In the `reference` field, type a value in the following format:

```
Paper title[https://doi.org/10.xxxx/example]
```

For example:

```
Mwangi et al. 2026[https://doi.org/10.1234/fynbos-siberia]
```

3. Click **Save**.

The cell now renders **Mwangi et al. 2026** as a clickable hyperlink that opens the DOI URL in a new tab.

You can store multiple links in one cell by separating entries with a comma and space:

```
Paper A[https://doi.org/10.1/aaa], Dataset[https://zenodo.org/record/12345]
```

**Use cases:**

* Link observations to published papers or preprints
* Link rows to external datasets or supplementary materials
* Link records to external ticketing systems or project management tools
* Store references to cloud-hosted assets not in your project's own Storage

{% hint style="info" %}
FILE columns are not validated for URL format. Any text in the `name[url]` pattern renders as a link. Ensure the URLs are correct before saving - there is no broken-link checker.
{% endhint %}

***

## What you have learned

* How to build dashboards with Line, Bar, Scorecard, and Filter components
* How to use Hidden + Locked + Default value for automatic metadata fields
* How to add QR Code questions for scanning specimen labels in the field
* How to lock individual rows to protect verified data from accidental edits
* How to create custom roles and configure fine-grained permissions
* How to designate a project as a Marketplace template and use Copy Project for direct clones
* How to generate R and Python analysis scripts from the Analyse tool
* How to add foreign key columns that link tables together
* How to use JSON questions for structured sub-entries
* How to use tabular questions for batch data entry with dropdown columns
* How to use FILE columns to link to external resources without uploading files

***

## Next steps

In the [Super](/tutorial/super) section, you will access data programmatically via the GraphQL API, configure key generators for human-readable primary keys, use URL query parameters to pre-fill forms, review row history in the audit log, set up webhooks, and configure dynamic file upload paths.


# Super: Programmatic Access & Automation

This section covers the most powerful features of Information Hub: direct API access, key generators, form pre-filling, the audit log, webhooks, and dynamic file paths. These features are aimed at users who want to automate workflows, integrate with external systems, or process data programmatically.

{% hint style="info" %}
This section assumes you have completed the previous tutorials and have the **Fynbos in Siberia** project with tables, forms, and dashboards already set up.
{% endhint %}

***

## Step 1: Create an API key

To access data programmatically, you need an API key.

1. Click your profile icon and go to **Settings**.
2. Navigate to the **API Keys** card.
3. Click **Create**.
4. Give it a name (e.g., **Fynbos Analysis Script**).
5. Copy the generated key immediately - it will not be shown again.

{% hint style="warning" %}
Treat your API key like a password. Do not share it publicly or commit it to version control.
{% endhint %}

***

## Step 2: Query data via the GraphQL API

Information Hub exposes a GraphQL API at `https://app.informationhub.io/graphql`. You can use it to read and write data programmatically.

### Query the Species Observations table

Using a tool like `curl`, Postman, or any GraphQL client, send the following query:

```graphql
query {
  queryTable(
    request: {
      tableId: "YOUR_TABLE_ID"
    }
  ) {
    data
  }
}
```

Include your API key in the request headers:

```
Authorization: Bearer YOUR_API_KEY
```

**Using curl:**

```bash
curl -X POST https://app.informationhub.io/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "query": "query { queryTable(request: { tableId: \"YOUR_TABLE_ID\" }) { data } }"
  }'
```

The response contains all rows from the Species Observations table as JSON.

### Find your table ID

The table ID is visible in the URL when you open a table in the browser. For example, if the URL is `https://app.informationhub.io/project/abc123/tables/tbl_456`, then `tbl_456` is the table ID.

***

## Step 3: Insert data via the GraphQL API

You can also add new rows programmatically. This is useful for integrating with sensors, scripts, or external data sources.

```graphql
mutation {
  insertData(
    request: {
      tableId: "YOUR_TABLE_ID"
      data: [
        {
          species_name: "Protea siberica"
          site: "Site Alpha"
          height_cm: 52.3
          leaf_count: 42
          soil_ph: 5.8
          observation_date: "2026-04-01"
          observer: "Automated Sensor"
        }
      ]
    }
  ) {
    data
  }
}
```

**Using curl:**

```bash
curl -X POST https://app.informationhub.io/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "query": "mutation { insertData(request: { tableId: \"YOUR_TABLE_ID\", data: [{ species_name: \"Protea siberica\", site: \"Site Alpha\", height_cm: 52.3, leaf_count: 42, soil_ph: 5.8, observation_date: \"2026-04-01\", observer: \"Automated Sensor\" }] }) { data } }"
  }'
```

After running this mutation, open the Species Observations table in the browser - the new row should be there.

***

## Step 4: Generate R and Python analysis scripts

The Analyse tool can generate starter scripts pre-configured with your table ID and API key.

1. Open the **Species Observations** table.
2. Click **Analyse** in the toolbar.
3. Click the language toggle to switch between **Python** and **R**.
4. Click the **copy** icon to copy the generated script.

### Example generated Python script

```python
import requests
import pandas as pd

API_URL = "https://app.informationhub.io/graphql"
API_KEY = "YOUR_API_KEY"
TABLE_ID = "YOUR_TABLE_ID"

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_KEY}"
}

query = """
query {
  queryTable(request: { tableId: "%s" }) {
    data
  }
}
""" % TABLE_ID

response = requests.post(API_URL, json={"query": query}, headers=headers)
data = response.json()["data"]["queryTable"]["data"]

df = pd.DataFrame(data)
result = df.groupby("species_name")["height_cm"].mean()
print(result)
```

### Example generated R script

```r
library(httr)
library(jsonlite)

api_url <- "https://app.informationhub.io/graphql"
api_key <- "YOUR_API_KEY"
table_id <- "YOUR_TABLE_ID"

query <- sprintf('{
  "query": "query { queryTable(request: { tableId: \\"%s\\" }) { data } }"
}', table_id)

response <- POST(
  api_url,
  add_headers(
    "Content-Type" = "application/json",
    "Authorization" = paste("Bearer", api_key)
  ),
  body = query
)

data <- fromJSON(content(response, "text"))$data$queryTable$data
df <- as.data.frame(data)

aggregate(height_cm ~ species_name, data = df, FUN = mean)
```

Replace the placeholder values with your actual API key and table ID, then run the script in your local environment.

***

## Step 5: Key generators

A **key generator** auto-populates a table's primary key column with values based on a template pattern. Instead of auto-incrementing integers (1, 2, 3...), rows get human-readable IDs like `OBS-20260501-042`.

Key generators are project-level resources - create one and reuse it across multiple tables.

### Create a key generator

1. Click **Tables** in the project sidebar.
2. Click the **Key Generators** button in the toolbar (top-right area of the tables list page).
3. Click **+** to create a new generator.
4. Enter the name **Observation ID**.
5. In the **Template** field, enter: `OBS-{date:YYYYMMDD}-{autoincrement}`
6. Click **Create**.

### Assign it to the primary key column

1. Open the **Species Observations** table.
2. Click the **pencil icon** on the `id` column header to edit it.
3. In the **Key Generator** dropdown, select **Observation ID**.
4. Click **Save**.

New rows added to this table will now receive primary keys like `OBS-20260501-29` instead of plain integers. Existing rows keep their original IDs.

### Token reference

Templates are strings that mix literal text with tokens in `{...}` syntax.

| Token             | Output                                  | Example                                |
| ----------------- | --------------------------------------- | -------------------------------------- |
| `{autoincrement}` | Incrementing integer                    | `42`                                   |
| `{uuid}`          | Random v4 UUID                          | `f47ac10b-58cc-4372-a567-0e02b2c3d479` |
| `{cuid}`          | Collision-resistant unique ID           | `clh3z8k0v0000qzrm...`                 |
| `{date}`          | Current date as `YYYY-MM-DD`            | `2026-05-26`                           |
| `{date:FORMAT}`   | Date in a custom moment.js format       | `{date:YYYYMMDD}` → `20260526`         |
| `{time}`          | Current time as `HH:mm:ss`              | `14:32:07`                             |
| `{time:FORMAT}`   | Time in a custom format                 | `{time:HHmm}` → `1432`                 |
| `{datetime}`      | Date and time (ISO 8601)                | `2026-05-26T14:32:07+00:00`            |
| `{columnId}`      | Value of another column in the same row | `Site Alpha`                           |

**Slicing:** add `[start:end]` after the token name to take only part of the value:

* `{uuid[0:8]}` - first 8 characters of a UUID
* `{cuid[0:12]}` - first 12 characters of a CUID

**Formatters:** add `:lower`, `:upper`, or (for column references) `:slug`:

* `{uuid:upper}` - UUID in uppercase
* `{myColumnId:slug}` - column value lowercased with spaces replaced by hyphens

### Working examples

**Simple sequential IDs**

```
OBS-{autoincrement}
```

Produces: `OBS-1`, `OBS-2`, `OBS-3`

**Date-prefixed with short UUID**

```
{date:YYYYMMDD}-{uuid[0:8]:upper}
```

Produces: `20260526-F47AC10B`, `20260526-A3B2C1D0`

**Site-prefixed sequential ID** (replace `clm8abc123def456xyz` with your actual site column ID)

```
{clm8abc123def456xyz:slug}-{autoincrement}
```

Produces: `site-alpha-1`, `site-beta-2`

**Short CUID**

```
SP-{cuid[0:8]}
```

Produces: `SP-clh3z8k0`, `SP-clh4a9m1`

{% hint style="info" %}
To find a column's ID for use in a template, look at the URL when editing the column in the table settings. Column IDs are 20-40 alphanumeric characters.
{% endhint %}

{% hint style="warning" %}
Key generators can only be assigned to **primary key columns**. They apply to new rows only - existing rows keep their original primary keys.
{% endhint %}

***

## Step 6: URL query parameter pre-filling

Dr. Mwangi sends her two field teams to different sites each day. Instead of asking each team member to select their site from a dropdown, she sends them a pre-filled link where the site is already set.

### Configure the question

1. Open the **Field Observation Form** in the form builder.
2. Click the **pencil icon** on the **site** question to edit it.
3. Click the **cog icon** to open the expanded configuration panel.
4. Enter `site` in the **URL Query Param Key** field.
5. Click **Save**.

### Create pre-filled links

Now append the parameter to the share link:

* For Site Alpha: `https://app.informationhub.io/form/YOUR_FORM_ID?site=Site+Alpha`
* For Site Beta: `https://app.informationhub.io/form/YOUR_FORM_ID?site=Site+Beta`

When Dr. Tanaka opens the Site Alpha link, the **site** field is pre-filled with `Site Alpha`. She can still change it if needed (unless the question is also set to **Locked**).

### Combining multiple parameters

You can pre-fill multiple fields at once by chaining parameters:

```
.../form/YOUR_FORM_ID?site=Site+Alpha&observer=Dr.+Tanaka
```

This requires a **URL Query Param Key** set on each question you want to pre-fill. Parameters that do not match any key are silently ignored.

**Use cases:**

* Send site-specific links to each field team so the site is never wrong
* Pre-fill the observer name for each team member's personal link
* Pre-fill a batch ID from an external system by embedding it in a redirect URL

***

## Step 7: Table audit log and rollback

Every change to a row in a table is recorded in the audit log. This gives you a full history of edits and the ability to roll back a row to any previous state.

### View the audit log

1. Open the **Species Observations** table.
2. Click the **Settings** button in the toolbar.
3. The settings page has an **Audit Log** link in the sidebar - click it. (Alternatively, navigate to `/project/:id/tables/:tableId/audit` directly.)
4. The log shows one entry per row change, with the before and after values of each field. Click an entry to expand and see the field-level diff.

### Roll back a row

If Dr. Volkov accidentally overwrites a correct observation with wrong values, he can roll it back:

1. Find the history entry for the incorrect edit - it shows the timestamp, the user who made the change, and which fields changed.
2. Click **Rollback** on that entry.
3. The row is restored to the state it was in just before that edit.

{% hint style="info" %}
Rollback requires the appropriate permission (`tables.data.rollback` or equivalent in the project's role configuration). Check with your project administrator if the button is not visible.
{% endhint %}

***

## Step 8: Dynamic file upload paths

When forms include file upload questions, uploaded files go to Storage. By default, they all land in the same folder. Dynamic paths let you organise uploads automatically by the values in other form fields.

1. Open the **Field Observation Form** in the form builder.
2. Click the **pencil icon** on the **Plant Photo** question.
3. In the column picker, the linked column (`plant_photo`) has a **path template** configuration. Set it to:

```
observations/{site}/{species_name}/{observation_date}
```

Now when a field worker uploads a photo:

* An observation at Site Alpha for Protea siberica on 2026-04-01 saves to: `observations/Site Alpha/Protea siberica/2026-04-01/`
* An observation at Site Beta for Erica glacialis on 2026-04-02 saves to: `observations/Site Beta/Erica glacialis/2026-04-02/`

The template can reference any column in the linked table. This keeps Storage organised as the volume of uploads grows.

***

## Step 9: Webhooks - trigger external actions

Webhooks let you notify an external system every time a form is submitted. Dr. Mwangi wants to send each new observation to a data processing pipeline.

### Configure the webhook

1. Open the **Field Observation Form** and click **Settings** in the toolbar.
2. In the **General settings** section, find the **Webhook** field.
3. Enter the webhook URL (e.g., `https://your-api.example.com/observations/webhook`).
4. Click **Save**.

### How it works

Every time someone submits the form, Information Hub sends an HTTP POST request to the webhook URL with the submitted data as a JSON body. The payload includes all field values from the submission.

Example payload:

```json
{
  "species_name": "Protea siberica",
  "site": "Site Alpha",
  "height_cm": 52.3,
  "leaf_count": 42,
  "soil_ph": 5.8,
  "observation_date": "2026-04-01",
  "observer": "Dr. Lena Mwangi"
}
```

**What you can do with webhooks:**

* Send data to a cloud function for processing or validation
* Trigger notifications in Slack, Teams, or email
* Push data to an external database or analytics platform
* Start an automated analysis pipeline

***

## What you have learned

* How to create and manage API keys for programmatic access
* How to query and insert table data via the GraphQL API
* How to generate and run R and Python analysis scripts
* How to create key generators with all supported tokens, slices, and formatters
* How to assign a key generator to a primary key column for human-readable row IDs
* How to configure URL query param keys to pre-fill form fields from links
* How to use the table audit log to review row history and roll back edits
* How to configure dynamic file upload paths for automatic Storage organisation
* How to set up webhooks to trigger external systems on form submission

***

## Congratulations

You have completed the full Information Hub tutorial. You now know how to:

* **Collect data** with tables, forms, Location questions, File Upload, QR codes, offline mode, and update forms
* **Organise** your team with organisations, groups, and role-based permissions
* **Analyse and visualise** data with the built-in tools, dashboards, and external scripts
* **Share** your work through apps, shared forms, public wiki pages, and the Marketplace
* **Automate** with the GraphQL API, key generators, URL pre-filling, webhooks, and dynamic configuration
* **Audit** your data with row history and rollback

For detailed reference on any feature, see the [Home](/home) and [Project](/project) documentation sections.


# Changelog

This page lists notable changes and improvements to Information Hub, organised by version. Only user-facing changes are listed here -- internal and technical updates are omitted.

***

## v2.39.3

### Features

* **Dropdown in JSON and tabular questions** -- JSON and tabular question types now support dropdown fields for structured sub-entries.
* **Custom labels for JSON and tabular questions** -- form creators can set user-friendly labels for JSON and tabular question fields.
* **Form validation errors** -- validation errors are now displayed clearly to users when submitting a form.
* **Delete files with rows** -- when deleting table rows that contain file columns, users are prompted to also delete the associated files from storage.

***

## v2.39.2

### Features

* **Save form drafts** -- partially completed forms can be saved as drafts and resumed later, so field workers do not lose progress.
* **Dynamic file upload paths** -- file upload questions can use template-based storage paths that include column values, making uploaded files easier to organise.

### Fixes

* Fixed table filters using invalid columns.

***

## v2.39.1

### Features

* **Lock questions** -- form creators can lock individual questions to prevent respondents from editing the pre-filled value.

***

## v2.39.0

### Features

* **Form ordering** -- sections and questions within a form can now be reordered via drag-and-drop.
* **Custom primary key generation** -- tables support configurable primary key templates from the UI, so new rows can receive human-readable IDs automatically.
* **Human-readable update form keys** -- update forms now display human-readable column names instead of internal identifiers.
* **Analyse improvements** -- the built-in data analysis tool now supports group-by and where clauses. Generated R and Python scripts have been improved.
* **CSV and XLSX export options** -- configurable options for CSV and XLSX exports, including metadata entries.
* **Webhook improvements** -- updated universal and Stellenbosch webhook functions with sensor notifications.

### Fixes

* Fixed R and Python analysis scripts failing when table columns use mixed-case names.
* Fixed authentication issue where user lookup used too many parameters.
* Fixed Go app navbar safe area not working on Android.
* Fixed CPU configuration type in export data cloud functions.
* Fixed datasource connections closing prematurely on column update.

***

## v2.38.2

### Features

* **Custom emails on submission** -- form creators can toggle a custom email notification that is sent each time a form is submitted.
* **Universal webhook functions** -- updated cloud functions for processing webhook data from form submissions.
* **Improved Python analysis code** -- generated Python scripts for the Analyse tool have been improved.

### Fixes

* Fixed lookup search not returning results.
* Fixed time question showing an invalid date when no default time is selected.
* Fixed padding issues on short, paragraph, and number form questions.
* Fixed form description field padding.

***

## v2.38.0

### Features

* **Update forms** -- a new form type that lets respondents update existing table rows rather than always creating new ones. Useful for follow-up data collection where records need to be revisited.

### Fixes

* Fixed offline sync button not correctly syncing the offline link status.

***

## v2.37.4

### Features

* **Table filtering for foreign values** -- tables with relational columns now support filtering by foreign key values.
* **Copy relational tables** -- relational tables can now be duplicated.

### Fixes

* Fixed webhook configuration not displaying in form state despite having a value.
* Fixed dropdown not being shown when adding a row.
* Fixed searching a table twice not returning updated results.

***

## v2.37.0

### Features

* **Cloud functions** -- external cloud functions added for advanced integrations and webhooks.

***

## v2.36.5

### Fixes

* Fixed dropdown, location, multi-checkbox, and multi-radio UI on forms.
* Fixed table export when using limit and offset pagination.
* Fixed dashboard sharing for public/shareable access.
* Fixed table permission checks when querying data.

***

## v2.36.4

UI improvements and export subset scaffolding.

***

## v2.36.3

UI improvements and bug fixes across projects.

***

## v2.36.2

### Features

* **Manager (kanban board)** -- a new project module with drag-and-drop task boards. Create workbooks with To Do, Busy, and Done columns to organise project work.

***

## v2.36.1

### Features

* **Push notifications on iOS** -- push notifications now work on iOS devices.
* **Tutorial system** -- in-app tutorials appear contextually on pages that have tutorial content.

***

## v2.36.0

### Fixes

* Various authorisation bug fixes and form improvements.
* Fixed shared forms not working correctly.
* Fixed race conditions in the app.

***

## v2.35

### Features

* **Authorisation with trickle-down** -- role-based permissions now cascade through the project hierarchy (organisations, groups, projects).
* **Table and column creation in forms** -- create new tables and columns directly from the form builder without leaving the page.
* **Form option reordering** -- multi-checkbox and multi-radio options can be reordered.
* **Date and time defaults** -- date and time form questions now default to the current date and time.
* **Global search respects visibility** -- search results now correctly filter based on project visibility settings.

### Fixes

* Fixed shared forms not capturing user information when sign-in is required.
* Fixed push notifications not working on the Go app (web and Android).
* Fixed project copy issues with dangling question references.
* Improved error messaging for project creation.
* Various form UX and UI improvements.

***

## v2.34

### Features

Core platform release with the following features:

* **Projects** -- create, copy, and manage research projects with configurable visibility.
* **Tables** -- structured data storage with typed columns, manual row entry, and file preview on edit.
* **Forms** -- mobile-friendly data collection forms with multiple question types including QR codes.
* **Dashboards** -- data visualisation with chart components including time series.
* **Storage** -- file management with folder support, ZIP extraction, and download.
* **Manager** -- kanban-style task boards with expand-all and filter-by-user.
* **Wiki** -- project documentation pages.
* **Apps** -- shareable public-facing views of project content.
* **Organisations and Groups** -- team structure with member management.
* **Users and Permissions** -- role-based access control at multiple levels.
* **Marketplace and Templates** -- browse and copy project templates.
* **Push notifications** -- notification support for web and Android.
* **Offline mode** -- offline data collection with sync on the Go app.
* **Project copy** -- duplicate projects including tables, forms, dashboards, and storage.
* **Global search** -- search across projects and resources.
* **Leave project** -- users can leave projects they no longer need access to.


