Skip to content

Automatic Ingestion

Damask can pull assets from external sources on a schedule, so files flow into your library without manual importing. Connect a source once, point it at a destination project and folder, and let it run.

New ingress source

How ingestion works

Each ingress source is polled on a configurable interval (default: every 15 minutes). When new files are found, Damask downloads them, validates their type and size, writes them to storage, and creates asset records - using the same pipeline as a manual upload. Thumbnails and metadata are extracted automatically.

A deduplication check runs before every import: if a file has been seen before (matched by a content hash), it's skipped silently. You won't get duplicate assets from a source that delivers the same file twice.

Sources

Personal ingest address

The easiest way to get files into Damask. Every workspace has a unique ingest email address:

Find yours in Settings → Ingestion → Email address.

Email any file as an attachment to this address. The attachments appear in your target project within seconds. No configuration needed beyond choosing the default destination folder.

Email ingress source

TIP

Share this address with clients, collaborators, or your own devices. "Send to Damask" becomes a one-tap action from any email app.

IMAP mailbox

Connect Damask to any IMAP mailbox and watch it for attachments. Useful for a dedicated client delivery inbox or a shared team address.

Required settings:

FieldDescription
HostIMAP server hostname (e.g. imap.gmail.com)
PortUsually 993 (TLS)
UsernameYour email address
PasswordYour password or app-specific password
MailboxThe folder to watch (default: INBOX)
After importWhat to do with processed messages: mark as read, move to a folder, or delete

Gmail / Google Workspace: use an App Password, not your main account password. Generate one in Google Account → Security → App passwords.

Filter by sender or subject: optionally restrict which messages are processed. Only messages matching the filter are imported.

SFTP server

Watch a directory on a remote server over SSH. Ideal for photographers using a remote upload tool, or for studio workflows where files land on a NAS or managed server.

Required settings:

FieldDescription
HostServer hostname or IP
PortUsually 22
UsernameSSH username
Auth methodPassword or SSH private key
Remote pathThe directory to watch (e.g. /uploads/incoming)
After importLeave in place, move to a done folder, or delete

Private key authentication is recommended. Paste the PEM-encoded private key directly into the settings field - it is stored encrypted and never logged.

WebDAV / Nextcloud

Connect to any WebDAV collection, including Nextcloud, ownCloud, or any WebDAV-compatible server.

Required settings:

FieldDescription
URLFull URL of the collection (e.g. https://cloud.example.com/remote.php/dav/files/user/Uploads/)
UsernameYour account username
PasswordYour password or app password
After importLeave, move to another URL, or delete

Nextcloud: generate an App Password in Nextcloud → Settings → Security → Devices & sessions. The DAV base URL format is {nextcloud_url}/remote.php/dav/files/{username}/.

S3-compatible storage

Watch a bucket prefix on any S3-compatible object store.

Supported providers: AWS S3, Cloudflare R2, Backblaze B2, MinIO, Wasabi, and any other S3-compatible API.

Required settings:

FieldDescription
EndpointLeave blank for AWS S3; enter the custom endpoint for R2/MinIO/B2
RegionAWS region (e.g. us-east-1)
BucketThe bucket name
PrefixOnly watch files under this key prefix (e.g. incoming/)
Access Key IDYour access key
Secret Access KeyYour secret key
After importLeave, move to another prefix, or delete

Use path-style URLs (use_path_style: true) for MinIO and some self-hosted providers.

Destinations

Each source is mapped to a destination project and an optional destination folder. All imported assets land there.

You can set up multiple sources pointing to the same project (e.g. an SFTP source and an email address both feeding into "Client Uploads") or multiple sources pointing to different projects.

Ingestion rules

Rules let you route or filter files within a source based on their properties. Rules are evaluated in order - the first matching rule wins.

Adding a rule

Go to a source's detail page and open the Rules tab. Click + Add rule.

FieldOptions
If...mime_type, filename, sender, size_bytes, subject
Operatorequals, contains, starts_with, ends_with, gt, lt
ValueThe value to match against
Then...allow (default), deny (skip this file), or route to folder

Ingress rules

Example rules

  • Route all PDFs to the Briefs folder: mime_type starts_with application/pdf → route to folder: Briefs
  • Skip files over 500MB: size_bytes gt 524288000 → deny
  • Only import from a specific client: sender equals [email protected] → allow; add a second rule with no condition set to deny as a catch-all

Rule order

Drag rules to reorder them. Rules are evaluated top to bottom. Add a catch-all deny rule at the bottom to default-reject everything that doesn't match an earlier allow rule.

Ingestion log

Every import attempt is recorded in the ingestion log, viewable from each source's detail page.

StatusMeaning
importedFile was downloaded and asset created successfully
skippedFile matched a deny rule, or was a duplicate
failedDownload or processing error (see error message)
pendingQueued, not yet processed

Failed items can be retried individually from the log. The error message is shown in full - common causes include network timeouts, credential errors, and files that exceed the size limit.

Polling interval

Each source has a configurable poll interval (5 min / 15 min / 30 min / 1 hour / 6 hours). The default is 15 minutes.

For S3 sources, near-realtime ingestion is available by configuring S3 event notifications to push to Damask's webhook endpoint - this reduces latency from the poll interval to seconds.

To trigger an immediate poll on any source, click Poll now on the source's detail page.

Credentials security

All source credentials (passwords, API keys, private keys) are encrypted at rest using AES-256-GCM. They are never returned in API responses after initial save - the settings UI shows *** in place of sensitive values.