Skills DirectorySkills Directory
SkillsLearnSecurityCategoriesDocsCommunityBlog
Sign InSubmit Skill
Skills Directory

Security-tested agent skills for Claude, coding agents, and AI workflows.

Directory

  • Browse Skills
  • All Skills A–Z
  • Claude Skills
  • Claude Code Skills
  • Agent Skills
  • Categories
  • Authors
  • Submit a Skill

Learn

  • Learn Hub
  • Install Claude Skills
  • Write SKILL.md
  • Skills vs MCP
  • Directories Compared

Security

  • Security
  • Methodology
  • Secure Claude Skills
  • Security Badges

Company

  • About
  • Community
  • Blog
  • API Docs
  • Advertise

2026 Skills Directory. All rights reserved.

ProTermsPrivacyRefunds
Back to skills

Quicklook

ASecurity

Preview documents, images, audio, and 3D USDZ files with QLPreviewController and SwiftUI .quickLookPreview, and generate asynchronous thumbnails using QLThumbnailGenerator in iOS apps.

3 stars
0 votes
0 copies
0 views
Added 9/28/2026
developmentswiftapidocumentation

Works with

api

Security Analysis

A100/100

Scanned 9/28/2026

Install to Claude Code

$npx -y skills add thiennc-tesoglobal/ios-skills --skill quicklook --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Quicklook?

Add the live security badge to your README — it updates automatically with every re-scan.

Security grade badge for Quicklook
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/thiennc-tesoglobal-quicklook/badge)](https://www.skillsdirectory.com/skills/thiennc-tesoglobal-quicklook)

More formats (shields.io, HTML) on the badges page.

Files
SKILL.md
---
name: quicklook
description: "Preview documents, images, audio, and 3D USDZ files with QLPreviewController and SwiftUI .quickLookPreview, and generate asynchronous thumbnails using QLThumbnailGenerator in iOS apps."
---

# QuickLook

Preview documents, media, and 3D models with `QLPreviewController` and generate fast, cached file thumbnails with `QLThumbnailGenerator` in iOS and iPadOS.

## Contents

- [SwiftUI QuickLook Previews](#swiftui-quicklook-previews)
- [UIKit QLPreviewController](#uikit-qlpreviewcontroller)
- [Thumbnail Generation with QLThumbnailGenerator](#thumbnail-generation-with-qlthumbnailgenerator)
- [Custom QLPreviewItem Conformance](#custom-qlpreviewitem-conformance)
- [Common Mistakes](#common-mistakes)
- [Review Checklist](#review-checklist)
- [References](#references)

---

## SwiftUI QuickLook Previews

The `.quickLookPreview` modifier presents system file previews directly from SwiftUI when binding to an optional local `URL`.

```swift
import SwiftUI
import QuickLook

struct DocumentRowView: View {
    let fileURL: URL
    @State private var previewURL: URL?

    var body: some View {
        HStack {
            Image(systemName: "doc.fill")
            Text(fileURL.lastPathComponent)
            Spacer()
            Button("Preview") {
                previewURL = fileURL
            }
        }
        .quickLookPreview($previewURL)
    }
}
```

---

## UIKit QLPreviewController

For multi-item carousels, custom navigation transitions, or fine-grained preview control, use `QLPreviewController`.

```swift
import UIKit
import QuickLook

@MainActor
final class DocumentPreviewCoordinator: NSObject, QLPreviewControllerDataSource, QLPreviewControllerDelegate {
    private var previewItems: [URL] = []

    func presentPreview(from presenter: UIViewController, files: [URL], startIndex: Int = 0) {
        self.previewItems = files

        let previewController = QLPreviewController()
        previewController.dataSource = self
        previewController.delegate = self
        previewController.currentPreviewItemIndex = startIndex

        presenter.present(previewController, animated: true)
    }

    // MARK: - QLPreviewControllerDataSource

    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        previewItems.count
    }

    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> any QLPreviewItem {
        previewItems[index] as NSURL
    }
}
```

---

## Thumbnail Generation with QLThumbnailGenerator

Generate asynchronous, system-cached thumbnails for documents, images, and videos with `QLThumbnailGenerator.Request`.

```swift
import QuickLookThumbnailing
import UIKit

actor ThumbnailLoader {
    static let shared = ThumbnailLoader()
    private let cache = NSCache<NSURL, UIImage>()

    func loadThumbnail(for fileURL: URL, size: CGSize, scale: CGFloat = 2.0) async throws -> UIImage {
        if let cached = cache.object(forKey: fileURL as NSURL) {
            return cached
        }

        let request = QLThumbnailGenerator.Request(
            fileAt: fileURL,
            size: size,
            scale: scale,
            representationTypes: .all
        )

        let representation = try await QLThumbnailGenerator.shared.generateBestRepresentation(for: request)
        let image = representation.uiImage

        cache.setObject(image, forKey: fileURL as NSURL)
        return image
    }
}
```

---

## Custom QLPreviewItem Conformance

Provide custom titles or encrypted/in-memory file references wrapped in local sandbox files:

```swift
import QuickLook

final class PreviewableDocument: NSObject, QLPreviewItem {
    let previewItemURL: URL?
    let previewItemTitle: String?

    init(url: URL, title: String? = nil) {
        self.previewItemURL = url
        self.previewItemTitle = title ?? url.lastPathComponent
        super.init()
    }
}
```

---

## Common Mistakes

- **Passing remote web URLs:** QuickLook does not stream remote HTTP URLs. Files must be downloaded to a local file URL in the temporary or cache directory before previewing.
- **Ignoring scale in thumbnail generation:** Passing default scale `1.0` produces blurry thumbnails on Retina displays; always pass environment `@Environment(\.displayScale)` or `traitCollection.displayScale`.
- **Blocking main actor with thumbnail loading:** Calling synchronous thumbnail APIs freezes the UI; use async `generateBestRepresentation(for:)` or callbacks.
- **Retaining temporary preview files indefinitely:** Files copied to temp directories for QuickLook preview should be cleaned up after dismiss.
- **Missing QLPreviewItem URL validity:** Passing a file URL pointing to a non-existent file or dangling symlink displays an empty error preview.

---

## Review Checklist

- [ ] Are target files downloaded locally before passing to QuickLook?
- [ ] Is `.quickLookPreview($url)` used for standard SwiftUI single-file previewing?
- [ ] Does `QLPreviewControllerDataSource` return valid `QLPreviewItem` conforming objects?
- [ ] Does `QLThumbnailGenerator.Request` pass appropriate size, screen scale, and representation types?
- [ ] Are generated thumbnails cached in `NSCache` to prevent redundant disk decodes?
- [ ] Are temporary files cleaned up when preview presentation is completed?

---

## References

- [QuickLook Patterns](references/quicklook-patterns.md) — SwiftUI custom preview sheets, zoom transitions, and thumbnail caching.
- [QuickLook Documentation](https://sosumi.ai/documentation/quicklook) — Official Apple QuickLook API reference.
- [QuickLookThumbnailing Documentation](https://sosumi.ai/documentation/quicklookthumbnailing) — Asynchronous thumbnail generator reference.
- [QLPreviewController Guide](https://sosumi.ai/documentation/quicklook/qlpreviewcontroller) — UIKit preview controller and delegate methods.

Attribution

thiennc-tesoglobalthiennc-tesoglobal
View sourceMore from thiennc-tesoglobal →
SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments (0)

No comments yet. Be the first to comment!

SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Related Skills

Browser Extension Developer

Use this skill when developing or maintaining browser extension code in the `browser/` directory, including Chrome/Firefox/Edge compatibility, content scripts, background scripts, or i18n updates.

284972 votes

Seo Optimizer

SEO optimization with keyword analysis, readability assessment, technical validation, content quality. Use for search rankings, blog posts, content audits, or encountering keyword density, readability scores, meta tags, schema markup errors.

2222 votes

Google Official Seo Guide

Official Google SEO guide covering search optimization, best practices, Search Console, crawling, indexing, and improving website search visibility based on official Google documentation

1862 votes

Tanstack Start

Build a full-stack TanStack Start app on Cloudflare Workers from scratch — SSR, file-based routing, server functions, D1+Drizzle, better-auth, Tailwind v4+shadcn/ui. Use whenever the user mentions TanStack Start, asks to scaffold a full-stack Cloudflare app with SSR, wants an SSR dashboard, or asks for a React 19 + Cloudflare Workers app with file-based routing and server functions — even if they don't name TanStack Start specifically. No template repo — Claude generates every file fresh per ...

10311 votes

Pentest

PTES-aligned adversarial security audit for backend, frontend, and mobile applications. Produces a CVSS-scored Hacker Report with verified PoCs and phased remediation.

5491 votes
View all in development →