DocumentationRecipesReferenceChangelog
Log In
Documentation

Adding assets to project

You can add assets when you create a project, or at any time during the project's lifetime.

To add assets to an existing project, from the project Settings page, open Imports, then click Add in the Assets card.

📘

Only project admins can add assets to a project.

Choosing where your assets come from

You can add assets from three sources:

SourceWhere your data is storedBest for
Files from your computerIn a dedicated, private bucket on Kili's cloudQuick uploads of local files
URLs listed in a CSV fileAt its origin. Nothing is stored on Kili serversAssets already hosted online or on your own servers
Cloud storage integrationIn your own AWS, Azure, GCP or S3-compatible storageLarge datasets, and data that must stay in your infrastructure

To serve assets from your own servers, refer to Adding assets located on premise.

🚧

Kili doesn't support hybrid storage. Once a project uses a cloud storage integration, the other upload options are disabled for that project.

The available sources depend on your Kili deployment type. For the formats supported by each source, refer to Supported file formats.

Uploading files from your computer

  1. In the Assets card of the Imports page, click Add.
  2. Select Upload files.
  3. Drag and drop your files. Use one asset per file, with a maximum of 500 files per batch.

Your files are stored in a dedicated bucket on Kili's cloud. Only you have access to it.

Adding assets from URLs

  1. In the Assets card of the Imports page, click Add.
  2. Select Upload URLs.
  3. Drag and drop a CSV file listing the URLs of your assets. For the required structure, refer to CSV file format.

Your data remains hosted at its origin. Nothing is stored on Kili servers.

CSV file format

Create a CSV file with two columns, externalId and url, and one asset per line:

externalId,url
image_1,https://images.pexels.com/photos/45209/purple-grapes-vineyard-napa-valley-napa-vineyard-45209.jpeg

All URLs must start with https://.

Adding assets from cloud storage

📘

You must first create a cloud storage integration. For details, refer to Creating a cloud storage integration. Some file formats aren't supported with cloud integrations. For details, refer to Supported file formats.

Connecting an integration to your project

  1. In the Assets card of the Imports page, click Add.
  2. Select Cloud storage.
  3. Click New.
  4. From the Select cloud storage list, select your integration.
  5. Click Save.

Synchronizing your cloud storage

Each connection appears as a row in the Assets card, with its file count, last sync date and time, and status:

  • No changes detected: your storage and your project are in sync. Click the refresh icon to check again.
  • Changes detected: new or modified files were found in your storage. Click the external link icon to review and apply the changes.

Creating a cloud storage integration

📘

Only organization admins can manage cloud storage integrations. An integration can be shared by multiple projects.

Follow the steps for your storage provider:

You can then:

Adding assets located on premise

You can serve assets from your own servers. The data is streamed through the web browser and is only available within your internal network.

For security reasons, assets must be served over HTTPS, with a certificate signed by a certification authority. This requires a DNS name that points to your file server.

To set this up:

  1. Set up your DNS.
  2. Generate a certificate.
  3. Create your server.
  4. Create a CSV file listing the URLs of your assets. For the required structure, refer to CSV file format.
  5. Upload the CSV file to your project. For details, refer to Adding assets from URLs.
🚧
  • If your local server is down, you lose access to your data in Kili.
  • To give external users access to your data, your server must be reachable from the Internet. For an example, refer to Exposing localhost server to the Internet.
  • To avoid mixed content, Kili only accepts asset URLs starting with https://.
  • When you import video assets, Kili runs backend checks on the files (for example, to detect the frame rate). If the Kili backend can't access your video files, the upload fails.

Setting up your DNS

The procedure depends on your DNS provider. Create a domain name that points to your file server. In the examples below, the domain is test-ssl.kili-technology.com.

Generating a certificate

  1. Run the following command:

    certbot -d test-ssl.kili-technology.com --manual --logs-dir certbot --config-dir certbot --work-dir certbot --preferred-challenges dns certonly

    If certbot is missing, install it with your system's package manager.

  2. When prompted, enter an email address. A message lists the value to add to your subdomain:

    Please deploy a DNS TXT record under the name:
    _acme-challenge.test-ssl.kili-technology.com
    with the following value:
    <example-value>
  3. In your DNS provider, add <example-value> as a TXT record on the subdomain (in this example, _acme-challenge.test-ssl.kili-technology.com).

  4. Press Enter. Two files are created: fullchain.pem and privkey.pem.

Creating your server

Create a local server and add your files to it. For example, in Python:

import ssl
from http.server import HTTPServer, SimpleHTTPRequestHandler

class Handler(SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_header("Access-Control-Allow-Origin", "*")
        super().end_headers()

httpd = HTTPServer(("0.0.0.0", 443), Handler)
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile="fullchain.pem", keyfile="privkey.pem")
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
print("Server running")
httpd.serve_forever()

Save this code as server.py in the same folder as fullchain.pem and privkey.pem, then run sudo python server.py.

Asset type specifics

Video assets

When you import a video, choose an annotation mode:

  • Annotate as a video: keeps the original frame rate, for full consistency with the source.
  • Annotate as individual images: lets you set a custom frame rate.

Videos with non-integer frame rates can be uploaded directly. If needed, you can convert a video before importing it:

ffmpeg -i <input.mp4> -vcodec libx264 -acodec aac <output.mp4>
📘

Labeling videos split into individual frames is noticeably slower and supports fewer features. Some video formats can only be uploaded as individual frames. For details, refer to Supported video formats.

For more information, refer to Labeling Video assets.

Rich text assets

You can import rich text assets through a cloud storage integration or through the Kili API. For an example, refer to this tutorial.

Multi-layer assets (Image and Geospatial projects)

In Image and Geospatial projects, you can upload multiple images as layers of a single asset. Annotators can then switch between layers while labeling.

This is useful when each layer is part of the data to annotate, for example:

  • Change detection (before and after imagery)
  • Multi-temporal analysis
  • Multi-sensor data
  • Band combinations or custom composites

For a step-by-step example, refer to the SDK tutorial on multi-layer Geospatial assets.

📘

In Geospatial projects, you can also add contextual layers, such as base maps or WMS/WMTS layers, from the Layers menu. These layers are for visualization only and aren't part of the asset data. For details, refer to Uploading Geospatial assets.

Adding assets programmatically

You can add assets, asset metadata and pre-annotations with the Kili Python SDK. For end-to-end examples, refer to these tutorials:

You can also follow the examples in the Kili SDK GitHub repository.

To import predictions from the Kili app, refer to Importing labels.


Did this page help you?