Feature · Workspace
Content Library
Every image, video, audio clip, and text file Guaardvark generates is catalogued here. Filter by feature, date, project, or tag. Re-use the prompt that produced any output. The archive grows with every job you run.
Universal Archive
Every generated output — batch images from Diffusers, video clips from CogVideoX, narration from Piper TTS, transcripts from Whisper.cpp, upscaled images from Real-ESRGAN, CSV and text content from bulk generation — is registered in the Content Library at creation time. No manual cataloguing. The archive is the authoritative record of everything the platform has produced.
Multi-Dimensional Filtering
Filter the library by generation feature (images, videos, audio, text), by project, by date range, by tag, or by any combination. The ContentLibraryPage React component maintains filter state in the URL so you can bookmark a specific filtered view or share a link to a curated subset. Sorting by date, name, or file size is available for all filter combinations.
Prompt Provenance
Every output record in the database carries the prompt, model, generation parameters, and job ID that produced it. Clicking an image opens a detail panel showing the full generation context. One click re-queues the same generation job with identical parameters, or opens the generation form pre-populated with the original prompt for easy iteration.
Bulk Operations
Select multiple outputs and download them as a ZIP archive, add tags to the entire selection, move them to a different project, or delete them all at once. Bulk tag operations are useful for after-the-fact curation: generate a batch job, review the results, tag the keepers, then filter by tag to download only those. Bulk delete removes both the database records and the files from data/outputs/.
What it does
The central archive for everything you generate
Without a content library, generated outputs accumulate in data/outputs/ as a flat directory of files. Finding a specific image from three weeks ago requires knowing its filename or scrolling through hundreds of files. The prompt that produced it is lost unless you wrote it down. Batch jobs produce dozens of files with sequential names that convey nothing about their content. The Content Library solves all of these problems by treating every generated output as a first-class catalogued entity with rich metadata from the moment it's created.
The ContentLibraryPage React component in the frontend connects to the output_api.py and content_management_api.py blueprints. Generation services deposit output records in the database as part of the job completion flow, so the library is always in sync with the file system. The library surface renders different output types appropriately: images are displayed as thumbnails in a responsive grid, videos show a poster frame with duration, audio files show a waveform preview, and text/CSV outputs show a content snippet. A lightbox viewer opens full-size versions of images; a built-in video player handles video playback inline.
The prompt provenance system is one of the most practically useful aspects of the library. AI generation is iterative: you run a batch, find two or three outputs you want to refine, and run variations. Being able to retrieve the exact generation parameters — including the model version, sampler settings, negative prompt, seed, and guidance scale — from any output in the library means you can reliably reproduce results and iterate from a known baseline rather than reconstructing parameters from memory.
Under the hood
Output registration pipeline. The unified_file_generation.py service coordinates output registration. When a Celery generation task completes, it writes the output file to data/outputs/ and creates an output record via output_api.py. The record contains: file path, file size, MIME type, generation feature identifier, prompt text, model name, generation parameters (JSON blob), project ID, job ID, creation timestamp, and tag array. The image_content_service.py performs lightweight analysis of image outputs at registration time — dimensions, dominant colours, format — to populate additional metadata fields used by the library's sort and filter operations.
File serving and download. The library surface serves files via output_api.py with appropriate Content-Type headers for inline preview (images and videos load in the browser's native viewer) and attachment headers for forced download. Large batch downloads are handled by a streaming ZIP endpoint that assembles the archive on-the-fly from the selected output IDs, avoiding the need to buffer the entire archive in memory before sending. File deletion is a two-phase operation: the database record is marked as deleted first, then the file is removed from disk. This prevents the library from showing entries for files that have been manually deleted from disk while ensuring referential integrity during the window between database update and disk deletion.
# List recent image outputs via the API
curl "http://localhost:5000/api/outputs?type=image&project_id=proj_abc&limit=20&sort=created_desc"
# Get a specific output with full provenance
curl "http://localhost:5000/api/outputs/out_xyz"
# Re-queue a generation job from an existing output
curl -X POST "http://localhost:5000/api/outputs/out_xyz/requeue"
# Bulk tag selected outputs
curl -X PATCH http://localhost:5000/api/outputs/bulk -d '{"ids": ["out_001", "out_002"], "tags": ["approved", "social-ready"]}'
Use cases
How teams use the Content Library
Post-generation curation and delivery
Generate a batch of 50 product images. Review them in the library's grid view, tagging keepers with approved and the rest with retry. Filter by approved, select all, and bulk-download as a ZIP. The client gets exactly the curated set without you manually sorting files in a file manager. The rejected images remain in the library for reference but stay out of the delivery package.
Prompt iteration and refinement
Find an image from last week that was close but not quite right. Open its detail panel, copy the original prompt, click "Re-generate with this prompt" to open the generator pre-populated, modify the negative prompt, adjust the guidance scale, and run a new batch. The iterative cycle — generate, review, refine, generate again — flows naturally through the library without hunting for parameters you've long since forgotten.
Cross-media content pipeline
A completed content pipeline might produce images, an upscaled version, a narration audio file, a video, and a captioned version of the video — all linked to the same project. The Content Library's filter-by-project view shows all of these together with their creation timestamps and a clear chain from image → upscaled image and video → captioned video. Instead of a fragmented file system, you have a coherent provenance record of the full production pipeline.
Guaardvark Content Library vs. managing an outputs folder
Managing generated content as raw files on disk does not scale. File names convey nothing about content. Prompts are lost. Batch outputs look identical except for a sequence number. Finding a specific output requires either a perfect memory or a long manual scroll. Guaardvark's Content Library is the structured alternative: every output is a searchable, filterable, provenance-rich entity from the moment it's created. The library is not a post-hoc organisational tool you have to maintain — it's populated automatically as part of the generation pipeline, so the archive is always current with zero administrative overhead.
See full comparison →
FAQ
Content Library — common questions
Does the Content Library include files I upload, or only generated files?
The Content Library focuses on generated outputs. Uploaded files appear in the Files browser and the Documents surface. There is overlap: if you upload a file and then generate content based on it, both the source upload and the generated output appear in their respective surfaces. The library surfaces generated content by job record; the Files browser surfaces content by upload record.
How is disk space managed for old outputs?
Disk space is managed manually via the Content Library's bulk delete feature or automatically via cleanup Celery tasks configured in backend/tasks/cleanup_tasks.py. You can configure retention policies — delete outputs older than N days, delete outputs below a certain file size, or delete outputs not tagged with a keep-tag — in Settings. The default is no automatic deletion; all outputs are retained until you explicitly delete them.
Can I search the Content Library by content, not just metadata?
Full-text search across prompt text is available. Image content search (finding images by visual similarity or described content) is on the roadmap. For now, the combination of project filter, tag filter, date filter, and prompt text search covers the most common retrieval patterns. Adding descriptive tags to batches at generation time significantly improves findability.
Are output records preserved if I delete the physical file?
If a file is deleted from disk outside of Guaardvark (via the file system or terminal), the library record remains but the preview and download will fail. The library shows a broken-file indicator for outputs where the physical file is missing. Running the cleanup task reconciles the database against the file system and removes orphaned records.
Can I move outputs between projects after the fact?
Yes. Select one or more outputs in the library and use the "Move to project" bulk operation to reassign their project_id. The outputs will then appear in the destination project's library view. This is useful when you generate exploratory content in a default project and later decide it belongs to a specific client engagement.
Every output, catalogued and retrievable
Install Guaardvark and let the Content Library handle the archiving automatically — prompt provenance, filter-ready metadata, and bulk download included from day one.