FT1F
Documentation
FT1F is a desktop application for validating and organizing 3D game assets before pipeline integration. Technical artists and pipeline developers use it to define validation rule sets (“Presets”), run them against asset folders, and copy/rename files to match a target folder structure.
Getting Started
When you first launch FT1F, a license gate is shown. You must activate a valid license key before accessing the application.
- Enter your license key in the format
XXXX-XXXX-XXXX-XXXX. - Press Activate or hit Enter.
- If activation succeeds, the app loads immediately.
- If it fails, an error message describes the reason (invalid key, activation limit reached, network error, etc.).
Your license is stored encrypted on your machine. You do not need to re-enter it on subsequent launches unless you deactivate it or move to a new device.
Application Layout
The application has a fixed left sidebar and a main content area.
Content Area
The content area renders the active view. In the Validate view, the layout splits into:
- Config panel (left, fixed 72px) — preset selector, asset name input, folder picker, and run button.
- Results / Viewport area (right, resizable) — validation report or 3D/2D viewer.
- 3D/Texture sidebar (optional, resizable) — drag the divider between the results and the sidebar to resize. Default width is 40% of the content area (min 20%, max 80%).
Core Concepts
Projects
A Project is a named container that groups related Presets together. For example, you might have a “Characters” project holding presets for Hero, NPC, and Creature asset types.
- Projects are sorted by creation date by default.
- You can drag to reorder them in the library.
- Each project can be exported as a
.jsonfile and shared with teammates. - Projects can be imported from a
.jsonfile. When importing a preset file, you choose whether to add it to an existing project or keep it as a standalone preset.
Presets
A Preset defines the validation rules for a specific asset type. It specifies:
- The expected root folder name (supports template variables like
{AssetName}). - The expected folder structure (sub-folders, with optional required/optional flags).
- The expected files inside each folder (name patterns, types, and technical constraints).
Presets can exist inside a Project or as standalone presets (not grouped in any project).
- Click a preset card to open a new Validation tab for that preset.
- Presets can be exported as individual
.jsonfiles. - Presets can be marked as favorites (star icon on hover) for quick access.
Template Variables
Template variables are placeholders used in preset folder paths and file name patterns. They are resolved at validation or submission time.
| Variable | Description |
|---|---|
{AssetName} | Replaced with the asset name entered in the config panel. |
{date} | Replaced with the current date in the preset's configured date format. |
{CustomTag} | Any custom tag you have defined (e.g., {Part}, {LOD}). |
{MaterialName} | Wildcard that matches any single token. Used for per-material file slots. |
See the full Template Variables Reference for details.
Validate
The Validate section is where you run preset rules against an asset folder on disk and see a detailed report.
Creating a Validation Tab
- Navigate to Validate (the FT1F icon in the sidebar). This opens the Presets & Projects library.
- Click a preset card inside a project, or click a standalone preset. A new validation tab opens and you are taken to it automatically.
- Each tab is fully isolated — you can run different presets or different folders simultaneously in separate tabs.
Running Validation
The left config panel contains:
| Field | Description |
|---|---|
| Asset Name | The name of the asset being validated. Used to resolve {AssetName} in the preset. |
| Asset Folder | The folder to scan. Click the button to open a folder picker dialog. Hover over the path to see the full path in a tooltip. |
| Selected folder is the root | When checked, the selected folder is treated as the asset root (e.g., SM_Hero/). When unchecked, the validator expects the rootFolder pattern to exist inside the selected folder. |
Once both fields are filled, click Run Validation (or press Enter while the asset name input is focused). A spinner shows while the scan runs.
Clicking Re-run after results are shown repeats the validation against the same folder.
Reading the Report
The report is organized into sections, each representing a category of checks:
- Naming — file and folder name convention checks.
- Folder Structure — expected folders present/missing.
- Textures — resolution, power-of-two, required suffixes.
- Meshes — polycount limits, expected scale and rotation.
Each section has an overall status badge:
| Status | Meaning |
|---|---|
| Pass | All checks in this section passed. |
| Warning | One or more non-critical issues found. |
| Fail | One or more required checks failed. |
| Info | Informational messages only. |
Each item within a section shows:
- A label — the name of the specific check.
- A status indicator — colored dot (green/yellow/red/blue).
- A message — human-readable explanation of the result.
- Optional details — extended technical information.
- Optional fix suggestion — if a file or folder has a naming issue, a suggested rename (
oldPath→newPath) is shown.
3D Viewport
When a validation report is available, you can load a 3D model from the scan results into the built-in viewer.
Display modes:
| Mode | Description |
|---|---|
| Shaded | Standard lit material rendering. |
| Wireframe | Mesh edges only, no fill. |
| Wireframe Shaded | Shaded mesh overlaid with wireframe edges. |
| Collision | Displays collision geometry if present. |
| UV | Renders UV layout in 2D. |
Additional controls:
- Materials panel — toggle individual material visibility. A legend lists all materials in the loaded model.
- Pivot point — toggle display of the model's pivot/origin point.
- UV channel selector — switch between UV channels when multiple are present.
- Grid Y position — adjust the ground plane height for accurate ground-contact visualization.
Supported model formats: FBX, GLTF, GLB, OBJ, USD.
asset:// protocol that gives the renderer secure access to local files without using unsafe file:// URLs.Texture Viewer
Toggle the 2D Viewer button in the sidebar (or click a texture entry in the validation report) to open the texture sidebar. It displays the selected texture file as a 2D image. Textures are auto-mapped from the scan results by filename.
Create
The Create section helps you copy and rename source files into a preset-defined destination folder structure. This is useful for organizing raw deliverables from an artist into the correct pipeline locations.
Picking a Preset
The Create section opens to a preset picker — the same library layout as the Validate section. Click a preset card to start a submission session for that preset.
- Use Import, New Preset, and New Project buttons at the top to manage presets without leaving the Create section.
- To return to the picker from an active session, click ← All Presets in the left config panel.
Tag Values
When a preset references Custom Tags, the Tag Values panel appears in the config panel. For each tag referenced in the preset, you provide the actual values to use.
For example, if the preset has a {Part} tag:
- Type a value (e.g.,
Head) in the input and press Enter or click Add. - The value appears as a chip. Add as many values as needed.
- To remove a value, click the X on its chip.
The file slots panel on the right automatically expands to show one slot for every combination of tag values (cartesian product). For instance, if {Part} has values [Head, Torso] and {LOD} has values [LOD0, LOD1], the result is 4 file slots.
File Slots
The File Slots panel (right side) shows every expected file defined by the preset, grouped by folder.
Each row (slot) represents one expected file and shows:
| Element | Description |
|---|---|
| Status dot | Green = source file assigned; Gray = slot still empty. |
| Expected filename | The resolved filename (variables substituted). |
| Source path | The file currently mapped to this slot. |
| Hover actions | Edit to manually pick a source file; Remove to clear the assignment. |
Auto-Detection: When you set a destination folder, FT1F automatically scans it and matches existing files to slots by filename (case-insensitive). Auto-detected files are marked accordingly. Re-click Re-check in the panel header to rescan at any time.
The header also shows a summary: X assigned · X pending · X/Y required.
Submitting Files
Configure the destination in the config panel:
| Option | Description |
|---|---|
| Asset Name | Resolves {AssetName} in all folder and file patterns. |
| Destination Folder | The root folder to copy files into. Click to open a folder picker. |
| Destination is root | When checked, files go directly into the destination folder (no extra root folder from the preset). When unchecked, the preset's rootFolder template is created inside the destination. |
| Keep Original | When enabled, source files are copied but not deleted. When disabled, source files are removed after a successful copy (move behavior). |
Click Submit to start the operation. Progress is shown with a spinner. After completion:
- Success — a confirmation message appears with an optional Show in Folder button to open the destination in your system file explorer.
- Errors — a list of files that failed to copy or delete is shown. Partial successes are reported; no files are silently skipped.
Preset Editor
The Preset Editor opens when you create a new preset or click Edit on an existing one. It replaces the current view with a full-screen editor.
General Settings
| Field | Description |
|---|---|
| Preset Name | The display name for this preset. Required to save. |
| Root Folder | The expected root folder name. Supports template variables (e.g., SM_{AssetName}). |
| Date Format | How {date} is formatted in filenames and folder names. See Date Format Reference. |
Root-Level Files
Defines files expected directly in the root folder (not inside any subfolder). Click Add File to add a file rule. Each rule is configured in the File Rules editor.
Folder Rules
The folder list defines the expected sub-folder structure inside the root. Each folder rule has:
| Field | Description |
|---|---|
| Path | The folder path relative to the root. Supports template variables. |
| Required | Whether validation fails if this folder is missing. |
| Files | The file rules inside this folder. |
- Click Add Folder to append a new folder rule.
- Drag the grip handle to reorder folders.
- Click the folder row to expand/collapse its file list.
- Click Delete (trash icon) to remove a folder and all its file rules.
File Rules
Each file rule defines one expected file (or a pattern matching a group of files):
| Field | Description |
|---|---|
| Pattern | The filename pattern. Supports template variables and wildcards. For example: {AssetName}_D.png or {AssetName}_{MaterialName}_N.png. |
| Required | Whether validation fails if this file is missing. |
| Type | The asset type: mesh, texture, scene, or other. Determines which constraint options are shown. |
Click the expand toggle on a file rule to access its constraints.
Constraints
Constraints are optional technical validation rules applied to a matched file.
Texture Constraints
| Constraint | Description |
|---|---|
| Resolution Range | Minimum and maximum texture dimensions in pixels. For example, [512, 4096] allows 512×512 up to 4096×4096. |
| Power of Two | When enabled, validation fails if either dimension is not a power of two (e.g., 256, 512, 1024, 2048, 4096). |
PBR Constraints (texture type)
| Constraint | Description |
|---|---|
| Check Albedo | Enables albedo range checking on this texture. |
| Albedo Range | The expected minimum and maximum average brightness range [min, max] (0–255). |
Mesh Constraints
| Constraint | Description |
|---|---|
| Max Polycount | Maximum number of polygons allowed. Validation fails if the mesh exceeds this value. |
Preset-Level Tech Constraints
Applied across all meshes/textures in the scan.
| Constraint | Description |
|---|---|
| Polycount per LOD | Max triangle counts for LOD0, LOD1, etc. |
| Required Texture Suffixes | File suffixes that must be present (e.g., _D, _N, _AO). |
| Expected Scale | Expected transform scale with a configurable tolerance. |
| Expected Rotation | Expected transform rotation with a configurable tolerance. |
Custom Tag Editor
Custom Tags are created and managed in Settings > Custom Tags, but they are referenced in presets and submission sessions throughout the app.
To open the editor, click New Tag (or Edit on an existing tag) in the Settings view.
| Field | Description |
|---|---|
| Tag Name | The identifier used in patterns (e.g., Part → referenced as {Part}). |
| Description | A human-readable explanation of what this tag represents. Shown in tooltips and the tag manager panel. |
| Check Type | Wildcard, Enumerated, or Pattern. |
- Enumerated tags: Add each allowed value as a chip using the value input and Add button. During validation, any token matching the tag position that is not in this list will cause a fail.
- Pattern tags: Enter a regular expression. Tokens at the tag's position must match it to pass.
- Wildcard tags: Any token at the tag's position is accepted.
To delete a tag, click Delete on the tag row in Settings. You are asked for a double-confirmation before the tag is permanently removed.
Settings
Access Settings via the gear icon in the sidebar.
General
| Setting | Description |
|---|---|
| Theme | Toggle between Dark and Light modes. Persists across sessions. |
| Show Tips | Toggle contextual help text in the Preset Editor. |
License
Shows your current license status:
- License key — displayed in masked format (
****-XXXX). - Tier — your license tier (
indie,pro, orstudio). - Deactivate — removes the license from this device, freeing the activation for use elsewhere. The app restarts and shows the license gate again.
Custom Tags
Lists all defined Custom Tags with:
- Tag name, check type, and description.
- Allowed values (for Enumerated tags) — visible on hover.
- Edit button to open the Custom Tag Editor.
- Delete button (two-step confirmation).
App Info
Displays the application version number and build date.
Validation Rules Reference
Structure Validation
Structure validation checks whether the scanned folder matches the hierarchy and naming patterns defined in the preset.
How filename matching works: Filenames are tokenized by splitting on _ and . characters. Each token in the filename is compared against the corresponding token in the preset pattern.
Example: SM_HeroCharacter_LOD0.fbx — Tokens: SM, HeroCharacter, LOD0, fbx
The pattern SM_{AssetName}_{LOD}.{ext} is compiled into a schema that matches those tokens positionally.
Rules:
- Static tokens must match exactly (case-sensitive by default).
- Variable tokens (
{AssetName},{CustomTag}, etc.) match the value provided or any value (for wildcards). - Wildcards (
*) match any single token. - Required folders: If a required folder is absent, the section item fails.
- Required files: If a required file is absent (no file in the folder matches the pattern), the section item fails.
- Extra files: Files present in the folder but not matching any rule are flagged as informational or warnings depending on preset settings.
Fix suggestions: When a file's name is close to a valid pattern (measured by Levenshtein edit distance), the validator proposes a corrected filename.
Content Validation
Content validation reads the actual file data to check technical properties.
Texture validation (via sharp):
- File extension must be one of:
.png,.jpg,.jpeg,.tga,.tiff,.tif,.bmp,.exr. - Resolution is read and compared against
resolutionRangeconstraints. - Power-of-two is checked if the constraint is enabled.
- PBR albedo average brightness is computed and compared against
albedoRange. - Required suffixes (e.g.,
_D,_N) are checked for presence across all textures in the folder.
Mesh validation:
- Polycount is extracted from the mesh file.
- Compared against
maxPolycount(file-level) orpolycount.perLOD(preset-level). - Expected scale and rotation are compared against the mesh transform within the configurable tolerance.
Validation Report
After validation completes, a ValidationReport is returned containing:
| Field | Description |
|---|---|
overallStatus | pass, fail, warning, or info — the worst status across all sections. |
sections | Array of ValidationSection objects, one per category. |
timestamp | Time the report was generated. |
scanData | The list of all file paths found in the scan, used for viewport texture mapping. |
Each ValidationSection contains:
| Field | Description |
|---|---|
title | The category name (e.g., "Naming", "Textures"). |
status | The worst status across items in this section. |
items | Array of ValidationItem objects. |
Each ValidationItem contains:
| Field | Description |
|---|---|
label | The check name. |
status | pass, fail, warning, or info. |
message | Human-readable result description. |
details | Optional extended information. |
fix | Optional { oldPath, newPath } rename suggestion. |
Template Variables Reference
Template variables can be used in the Root Folder, Folder Rule paths, and File Rule patterns fields of a preset.
| Variable | Resolved From | Resolved At | Example |
|---|---|---|---|
{AssetName} | Asset Name field in the config panel | Validation / Submission time | SM_Hero |
{date} | Current system date | Validation / Submission time | 20260311 |
{CustomTag} | Any custom tag name you define | Validation / Submission time | Head, LOD0 |
{MaterialName} | Wildcard — matches any single token | Validation time (match only) | Any value |
Cartesian product expansion: When a folder path or file pattern contains multiple Custom Tags, FT1F generates one slot/placeholder for every combination of values. This happens automatically in the Create section's File Slots panel.
Example: A file rule {AssetName}_{Part}_{LOD}.fbx with {Part} = [Head, Torso] and {LOD} = [LOD0, LOD1] expands into four expected files:
- HeroChar_Head_LOD0.fbx
- HeroChar_Head_LOD1.fbx
- HeroChar_Torso_LOD0.fbx
- HeroChar_Torso_LOD1.fbx
Date Format Reference
The {date} variable is formatted according to the Date Format selected in the preset's General Settings.
| Format Token | Example |
|---|---|
DDMMYYYY | 11022026 |
MMDDYYYY | 02112026 |
YYYYMMDD | 20260211 |
DDMMYY | 110226 |
MMDDYY | 021126 |
YYMMDD | 260211 |
DD_MM_YYYY | 11_02_2026 |
MM_DD_YYYY | 02_11_2026 |
YYYY_MM_DD | 2026_02_11 |
DD-MM-YYYY | 11-02-2026 |
MM-DD-YYYY | 02-11-2026 |
YYYY-MM-DD | 2026-02-11 |
Supported 3D Formats
The built-in 3D viewport supports the following mesh formats:
| Format | Extension |
|---|---|
| Filmbox | .fbx |
| GL Transmission Format | .gltf, .glb |
| Wavefront OBJ | .obj |
| Universal Scene Description | .usd, .usdc, .usdz |
Textures supported for the 2D viewer: PNG, JPG/JPEG, TGA, TIFF/TIF, BMP, EXR.
Keyboard Shortcuts
| Context | Key | Action |
|---|---|---|
| Asset Name input | Enter | Run validation |
| Project Name input | Enter | Confirm project creation |
| Tag Value input | Enter | Add tag value |
| License Key input | Enter | Activate license |
| All confirm dialogs | Escape | Cancel / close |
| Preset Editor tips | — | Toggled globally via Settings > Show Tips |
License Activation
FT1F requires an active license to run. Licenses are managed via Polar.sh and tied to your device using a hardware fingerprint.
Activation
- Launch the app. The license gate appears.
- Enter your key (
XXXX-XXXX-XXXX-XXXX) and click Activate. - On success, the app loads. Your license is saved encrypted to disk.
Validation
Each time the app starts, your stored license is validated silently. If validation fails (e.g., the key was revoked), the license gate reappears.
Deactivation
Go to Settings > License and click Deactivate. This removes the license from your device and frees the activation slot so you can use the key on another machine. The app restarts immediately after deactivation.
License Tiers
| Tier | Description |
|---|---|
indie | Individual license. |
pro | Professional license with expanded limits. |
studio | Team/studio license. |
Error Messages
| Error | Cause |
|---|---|
| Invalid license key | The key does not exist or was entered incorrectly. |
| Activation limit reached | All activation slots for this key are in use. Deactivate on another device first. |
| Network error | Could not reach the license server. Check your internet connection. |