# Tigris Static Assets

> Use when deploying static assets (CSS, JS, fonts, build artifacts) to Tigris — asset pipelines, cache headers, CDN delivery, covers Next.js, Remix, Rails, Django, Laravel, Express

- Skill: `tigrisdata/tigris-static-assets` (Agent Skill, multi-file: 9 files)
- Install (CLI): `npx skillmds add tigrisdata/tigris-static-assets`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tigrisdata/tigris-static-assets/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: tigrisdata (https://skillmd.com/u/tigrisdata)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/tigrisdata/tigris-static-assets

---


# Tigris Static Asset Hosting

Deploy CSS, JavaScript, fonts, and build artifacts to Tigris for global CDN delivery. Covers asset pipeline integration, cache-busting strategies, and `Cache-Control` configuration for all major frameworks.

## Prerequisites

**Before doing anything else**, install the Tigris CLI if it's not already available:

```bash
tigris help || npm install -g @tigrisdata/cli
```

If you need to install it, tell the user: "I'm installing the Tigris CLI (`@tigrisdata/cli`) so we can work with Tigris object storage."

## Overview

Tigris public buckets automatically serve files from the nearest global edge — no separate CDN configuration needed. Combined with content-hashed filenames and immutable cache headers, this gives you fast, cost-effective static asset delivery.

**Key pattern:**

1. Build assets with content hashes (e.g., `main-abc123.js`)
2. Upload to a public Tigris bucket
3. Set `Cache-Control: public, max-age=31536000, immutable`
4. Point your app's asset URL to the Tigris bucket

---

## Cache Headers

```bash
# For immutable, hashed assets (CSS, JS bundles)
Cache-Control: public, max-age=31536000, immutable

# For mutable assets (manifest files, index.html)
Cache-Control: public, max-age=0, must-revalidate

# For fonts
Cache-Control: public, max-age=31536000, immutable
```

### Setting Headers via CLI

```bash
tigris cp dist/main-abc123.js t3://my-assets/main-abc123.js \
  --cache-control "public, max-age=31536000, immutable" \
  --content-type "application/javascript"
```

### Setting Headers via SDK

```typescript
import { put } from "@tigrisdata/storage";

await put("assets/main-abc123.js", fileBuffer, {
  access: "public",
  contentType: "application/javascript",
});
```

---

## Upload Script (General)

```bash
#!/bin/bash
# scripts/deploy-assets.sh
BUCKET="my-app-assets"
BUILD_DIR="dist"

# Upload hashed assets with long cache
tigris cp "$BUILD_DIR/" "t3://$BUCKET/" -r \
  --cache-control "public, max-age=31536000, immutable"

echo "Assets deployed to t3://$BUCKET/"
```

---

## Framework Guides

Read the resource file for your framework:

- **Next.js** — Read `./resources/nextjs.md` for assetPrefix config and deploy script
- **Remix** — Read `./resources/remix.md` for Vite config and deploy script
- **Express** — Read `./resources/express.md` for static redirect pattern
- **Rails** — Read `./resources/rails.md` for Sprockets/Propshaft asset sync
- **Django** — Read `./resources/django.md` for collectstatic with S3 backend
- **Laravel** — Read `./resources/laravel.md` for Vite/Mix asset upload

---

## Cache-Busting Strategies

| Strategy | Example | Use When |
|----------|---------|----------|
| Content hash in filename | `main-abc123.js` | Build tools generate hashed names (Vite, Webpack) |
| Query string | `main.js?v=abc123` | Legacy systems without hashed filenames |
| Directory versioning | `/v2/assets/main.js` | Major version changes |

Most modern build tools (Vite, Webpack, esbuild) generate content-hashed filenames by default. Use these with `immutable` cache headers for the best performance.

---

## Critical Rules

**Always:** Use a public bucket for static assets | Set `Cache-Control: immutable` on hashed assets | Use content-hashed filenames | Upload after build, not on every request

**Never:** Serve static assets through your app server in production (use Tigris CDN) | Set long cache times on mutable filenames | Forget to update asset URL configuration in your framework

---

## Related Skills

- **tigris-egress-optimizer** — Reduce bandwidth costs
- **tigris-lifecycle-management** — Clean up old asset versions

## Official Documentation

- Tigris: https://www.tigrisdata.com/docs/

