Datasette Apps: мини-приложения прямо внутри Datasette

18 июня 2026 года Саймон Уиллисон (Simon Willison) — создатель популярного инструмента для работы с данными Datasette — объявил о запуске нового плагина datasette-apps. Сегодня мы запустили новый плагин для Datasette — datasette-apps. Если официальный анонс на блоге проекта отвечает на вопрос «что это», то сам Уиллисон в своём посте хотел ответить на другой вопрос: «зачем это нужно».

Что такое Datasette Apps

Datasette Apps — это самодостаточные HTML+JavaScript приложения, которые работают в строго ограниченной <iframe>-песочнице (sandbox), размещённой внутри вашего экземпляра Datasette. Они могут использовать JavaScript для выполнения read-only SQL-запросов к данным в Datasette, а также запускать write-запросы, если вы настроите для них хранимые запросы (stored queries).

Проще говоря: вместо того чтобы поднимать отдельный бэкенд, писать API и разворачивать ещё один сервис — вы просто пишете один HTML-файл и размещаете его прямо в Datasette. Приложение получает доступ к вашим SQLite-базам данных через специальный JavaScript-мост.

Думайте об этом как о Claude Artifacts, переосмысленном для Datasette — со всей мощью артефактов, но с JSON API к полноценной реляционной базе данных.

ℹ Что такое Datasette?
Datasette — это open-source инструмент на Python для исследования и публикации данных из SQLite баз данных. Он предоставляет браузерный интерфейс, JSON API и расширяемую систему плагинов. Datasette насчитывает более 11 000 звёзд на GitHub и активно используется аналитиками и инженерами данных по всему миру.

Как это работает технически

Песочница на основе iframe

Datasette Apps работают в <iframe sandbox="allow-scripts allow-forms"> — тщательно настроенной песочнице, которая не позволяет приложениям совершать вредоносные действия, влияющие на родительскую страницу.

Атрибут sandbox= позволяет запускать ненадёжный код таким образом, что он не может взаимодействовать с родительским приложением — не может читать DOM, получать доступ к cookies или похищать данные из localStorage.

Для передачи данных между приложением и Datasette используется механизм postMessage:

Хранимые приложения могут запрашивать данные Datasette с помощью встроенного помощника datasette.query(database, sql, params). Также можно выполнять разрешённые хранимые запросы через datasette.storedQuery(database, query, params). iframe отправляет эти запросы на родительскую страницу через postMessage, а та пересылает их к специальному query-эндпоинту приложения.

Пример простого приложения

Вот как выглядит минимальное Datasette App — оно просто показывает количество строк в двух таблицах:

<!DOCTYPE html>
<html lang="en">
<head>
  <style>
    body { font-family: Helvetica }
  </style>
</head>
<body>
  <div id="output"></div>
  <script>
    async function main() {
      const SQL = `
        select 'blog_posts' as t, count(*) as c from blog_posts
        union
        select 'datasette_repos', count(*) from datasette_repos
      `;
      const results = await datasette.query("content", SQL);
      const html = results.rows.map(row =>
        `<strong>${row.t}</strong>: ${row.c}`
      ).join("");
      document.getElementById('output').innerHTML = html;
    }
    main();
  </script>
</body>
</html>

JavaScript выполняет read-only SQL-запрос с помощью метода await datasette.query() и затем отображает результаты в <div> на странице.

Защита от утечки данных через CSP

Одна из ключевых угроз — утечка данных наружу. Настройки CSP (Content Security Policy — политика безопасности контента) внутри iframe запрещают загрузку контента из любых внешних доменов. Администраторы сайта могут настроить список разрешённых доменов для отдельного приложения.

Уиллисон исправил потенциальную уязвимость, ограничив возможность добавлять домены в белый список новым разрешением apps-set-csp, предназначенным только для доверенных сотрудников. Администраторы сайта также могут задать список allowed_csp_origins, из которого обычные пользователи смогут выбирать. Это позволяет, например, разрешить cdnjs.cloudflare.com, и пользователи смогут подключать дополнительные JavaScript-библиотеки из этого CDN.

⚠ Важно: это альфа-версия
Пакет datasette-apps нацелен на разработчиков расширений Datasette и практикующих специалистов по данным, которые хотят встраивать кастомные приложения рядом с наборами данных; API может измениться до стабильного релиза.

Система прав доступа

Плагин регистрирует следующие права Datasette: create-app, view-app, edit-app, delete-app, manage-app-access и apps-set-csp. Владельцы хранимых приложений всегда могут просматривать, редактировать, удалять свои приложения и управлять доступом к ним. Приложения, помеченные как приватные, видны только их владельцу, даже если другие пользователи имеют широкие права view-app. Для создания хранимых приложений требуется явное предоставление права create-app.


graph TD
    A[Пользователь создаёт приложение] --> B{Проверка прав create-app}
    B -- Есть право --> C[Редактор кода HTML/JS/CSS]
    B -- Нет права --> X[Отказ в доступе]
    C --> D[Приложение сохраняется в internal.db]
    D --> E[Рендеринг в iframe sandbox]
    E --> F{Запрос данных}
    F -- datasette.query() --> G[Read-only SQL]
    F -- datasette.storedQuery() --> H[Разрешённые write-запросы]
    G --> I[Данные возвращаются через postMessage]
    H --> I
    I --> J[Отображение в приложении]

Отладка и разработка

Одна из приятных особенностей — встроенный механизм отладки:

iframe-мост сообщает об ошибках JavaScript, необработанных Promise-rejection, нарушениях CSP, сбоях при загрузке ресурсов, ошибках fetch, вызовах console.error() и неудачных запросах к данным Datasette обратно на родительскую страницу. Страница приложения показывает их в небольшой раскрывающейся панели ошибок над iframe. Также захватываются сообщения console.log() и вызовы data-хелперов Datasette в сворачиваемой панели логов под iframe.

Интеграция с LLM: приложения, написанные ИИ

Вот где начинается настоящая магия. Плагин Datasette Apps не зависит от LLM вообще, но эти самодостаточные приложения идеально подходят для написания современными LLM-моделями.

Форма создания приложения включает копируемый промпт. Этот промпт содержит всё, что модели нужно знать для создания нового приложения, включая схему выбранных баз данных. Это означает, что вы можете нажать «копировать», вставить в ChatGPT, Claude или Gemini, объяснить задачу — и есть хороший шанс, что модель выдаст код для создания приложения.

Если у вас установлен Datasette Agent, ваш ИИ-ассистент также получит инструменты для создания новых приложений и редактирования существующих — в стиле Claude Artifacts.

💡 Попробуйте прямо сейчас

Вы можете опробовать Datasette Apps, войдя через GitHub на демо-инстанс agent.datasette.io.

Или запустите локально с помощью одной команды через uv:

uvx --prerelease=allow --with datasette-apps \
  datasette --internal internal.db --root

При желании сразу подключить собственную базу данных — просто добавьте путь к .db-файлу в конец команды.

Предыстория: от экспериментов к ключевой фиче

Datasette Apps начался как попытка Уиллисона создать механизм Claude Artifacts для Datasette Agent, но он быстро понял, что паттерн с песочницей интересен гораздо шире, чем просто добавление кастомных приложений в чат-интерфейс, и превратил его в самостоятельную концепцию верхнего уровня в экосистеме Datasette.

С самого первого релиза Datasette предлагал гибкий бэкенд для создания кастомных HTML-приложений через свой JSON API. Один из первых проектов Уиллисона на Datasette — внутренний поисковик по документации во время его работы в Eventbrite: он импортировал документы из разных систем в SQLite по крону и раздавал их через экземпляр Datasette с кастомным HTML+JavaScript интерфейсом поиска.

Сравнение подходов: Datasette App vs. традиционное приложение

КритерийDatasette AppТрадиционное приложение
БэкендВстроен в DatasetteОтдельный сервис (Flask, FastAPI…)
База данныхSQLite через JSON APIЛюбая СУБД, отдельная настройка
ДеплойОдин HTML-файлКонтейнер / сервер / CI-CD
Безопасностьiframe sandbox + CSPЗависит от разработчика
Генерация через LLMГотовый промпт из интерфейсаНужно писать промпт вручную
Поддержка write-запросовЧерез stored queriesПолная свобода
СтатусAlpha (0.1a2)Stable

Зачем это важно: мощь простоты

Опыт создания собственной коллекции HTML-инструментов и эксперименты с Claude Artifacts убедили Уиллисона в том, что добавление Datasette-бэкенда к самодостаточному HTML-фронтенду — это поразительно мощная комбинация. Представьте, насколько более полезными могли бы быть Claude Artifacts, если бы у них был доступ к постоянной реляционной базе данных. Именно это строится в Datasette Apps.

Запуск приложений в песочнице означает, что можно позволить большему числу людей создавать и делиться ими, и использовать ИИ-инструменты для их разработки без страха, что ошибки ИИ приведут к утечке или повреждению данных.

📝 Пример практического применения
Представьте: у вас есть SQLite-база с данными о продажах вашего продукта. Вместо того чтобы разворачивать отдельный дашборд-сервис, вы пишете один HTML+JS файл с графиками, вставляете его в Datasette Apps — и ваша команда получает интерактивный дашборд прямо внутри того же интерфейса, где аналитики уже работают с данными. Никаких дополнительных серверов, никаких настроек CORS, никаких отдельных деплойментов.

Итог

Datasette Apps — это не просто ещё один плагин. Это новая парадигма работы с данными, где граница между «посмотреть данные» и «сделать приложение поверх данных» практически исчезает. Саймон Уиллисон умело объединил три тренда: sandboxed execution (изолированное выполнение кода), SQLite как универсальная база данных и LLM-генерация кода — в один инструмент, который можно запустить одной командой в терминале.

Пока это альфа, но направление задано чётко: будущее — за приложениями, которые живут рядом с данными, а не отдельно от них.