datasette.io/templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<title>Datasette: An open source multi-tool for exploring and publishing data</title>
<link rel="stylesheet" type="text/css" href="/static/site.css">
{% include "_analytics.html" %}
<link rel="stylesheet" href="/static/lite-yt-embed.css" />
<script src="/static/lite-yt-embed.js"></script>
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@datasetteproj">
<meta name="twitter:title" content="Datasette">
<meta name="twitter:description" content="Datasette is a tool for exploring and publishing data. It helps people take data of any shape, analyze and explore it, and publish it as an interactive website and accompanying API.">
<meta name="twitter:image" content="https://datasette.io/static/datasette-card.png">
<meta property="og:url" content="https://datasette.io/">
<meta property="og:type" content="website">
<meta property="og:title" content="Datasette">
<meta property="og:description" content="Datasette is a tool for exploring and publishing data. It helps people take data of any shape, analyze and explore it, and publish it as an interactive website and accompanying API.">
<meta property="og:image" content="https://datasette.io/static/datasette-card.png">
</head>
<body class="homepage">
<header>
<nav>
{% include "_nav_links.html" %}
</nav>
<h1>
<img class="datasette-logo" src="/static/datasette-logo.svg" alt="Datasette">
</h1>
<p class="tagline">Find stories in data</p>
<p>
<a href="https://pypi.org/project/datasette/"><img alt="PyPI" src="https://img.shields.io/pypi/v/datasette.svg"></a>
<a href="https://docs.datasette.io/en/stable/changelog.html"><img alt="Changelog" src="https://img.shields.io/github/v/release/simonw/datasette?label=changelog"></a>
<a href="https://pypi.org/project/datasette/"><img alt="Python 3.x" src="https://img.shields.io/pypi/pyversions/datasette.svg?logo=python&logoColor=white"></a>
<a href="https://github.com/simonw/datasette/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/badge/license-Apache%202.0-blue.svg"></a>
<a href="https://datasette.io/discord"><img src="https://img.shields.io/discord/823971286308356157?label=discord" alt="discord"></a>
<a rel="me" href="https://fosstodon.org/@datasette"><img src="https://img.shields.io/badge/mastodon-@datasette-blueviolet" alt="mastodon: @datasette"></a>
</p>
<form action="/-/beta" method="get" class="beta-search"><div>
<input type="text" name="q" placeholder="Search documentation, plugins, site news and releases" style="min-width: 50%">
<input type="submit" value="Search">
</div></form>
</header>
<main>
<div class="datasette-video">
<lite-youtube videoid="7kDFBnXaw-c" playlabel="Play: Introduction to Datasette and sqlite-utils"></lite-youtube>
<p><a href="https://simonwillison.net/2021/Feb/7/video/">Annotated version</a> of this introductory video</p>
</div>
<div class="about">
<p>Datasette is a tool for exploring and publishing data. It helps people take data of any shape, analyze and explore it, and publish it as an interactive website and accompanying API.</p>
<p>Datasette is aimed at data journalists, museum curators, archivists, local governments, scientists, researchers and anyone else who has data that they wish to share with the world. It is part of a wider ecosystem of <a href="/tools"><strong>{{ sql("select count(*) from tools", database="content")[0][0] }} tools</strong></a> and <a href="/plugins"><strong>{{ sql("select count(*) from plugins", database="content")[0][0] }} plugins</strong></a> dedicated to making working with structured data as productive as possible.</p>
<p><strong><a href="https://global-power-plants.datasettes.com/global-power-plants/global-power-plants">Try a demo</a></strong> and explore 33,000 power plants around the world, then <a href="/tutorials/explore">follow the tutorial</a> or take a look at <a href="/examples">some other examples</a> of Datasette in action.</p>
<p>Then read how to <a href="https://docs.datasette.io/en/stable/getting_started.html"><strong>get started with Datasette</strong></a>, subscribe to <a href="https://datasette.substack.com/"><strong>the monthly-ish newsletter</strong></a> and consider <a href="https://calendly.com/swillison/datasette-office-hours"><strong>signing up for office hours</strong></a> for an in-person conversation about the project.</p>
<p><strong>New: <a href="/desktop">Datasette Desktop</a></strong> - a macOS desktop application for easily running Datasette on your own computer!</p>
</div>
<div class="use-cases">
<div class="card">
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="w-10 h-10" viewBox="0 0 24 24">
<line x1="18" y1="20" x2="18" y2="10"></line>
<line x1="12" y1="20" x2="12" y2="4"></line>
<line x1="6" y1="20" x2="6" y2="14"></line>
</svg>
<h2><a href="/for/exploratory-analysis">Exploratory data analysis</a></h2>
<p>Import data from CSVs, JSON, database connections and more. Datasette will automatically show you patterns in your data and help you share your findings with your colleagues.</p>
</div>
<div class="card">
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="w-10 h-10" viewBox="0 0 24 24">
<polyline points="16 16 12 12 8 16"></polyline>
<line x1="12" y1="12" x2="12" y2="21"></line>
<path d="M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3"></path>
<polyline points="16 16 12 12 8 16"></polyline>
</svg>
<h2><a href="/for/publishing-data">Instant data publishing</a></h2>
<p><code>datasette publish</code> lets you instantly publish your data to hosting providers like Google Cloud Run, Heroku or Vercel.</p>
</div>
<div class="card">
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="w-10 h-10" viewBox="0 0 24 24">
<polyline points="16 18 22 12 16 6"></polyline>
<polyline points="8 6 2 12 8 18"></polyline>
</svg>
<h2><a href="/for/rapid-prototyping">Rapid prototyping</a></h2>
<p>Spin up a JSON API for any data in minutes. Use it to prototype and prove your ideas without building a custom backend.</p>
</div>
</div>
<div style="clear: both; padding-top: 2em;" class="two-col-wrapper">
<div class="two-col-column">
<h2>Latest news <a style="text-decoration: none; padding: 0 0.3em" href="/content/feed.atom" title="Atom feed"><svg xmlns="http://www.w3.org/2000/svg" width="16px" height="16px" viewBox="0 0 256 256">
<defs>
<linearGradient id="a" x1=".1" x2=".9" y1=".1" y2=".9">
<stop offset="0" stop-color="#E3702D" />
<stop offset=".1" stop-color="#EA7D31" />
<stop offset=".4" stop-color="#F69537" />
<stop offset=".5" stop-color="#FB9E3A" />
<stop offset=".7" stop-color="#EA7C31" />
<stop offset=".9" stop-color="#DE642B" />
<stop offset="1" stop-color="#D95B29" />
</linearGradient>
</defs>
<rect width="256" height="256" fill="#CC5D15" rx="55" ry="55" />
<rect width="246" height="246" x="5" y="5" fill="#F49C52" rx="50" ry="50" />
<rect width="236" height="236" x="10" y="10" fill="url(#a)" rx="47" ry="47" />
<circle cx="68" cy="189" r="24" fill="#FFF" />
<path fill="#FFF" d="M160 213h-34a82 82 0 0 0-82-82V97a116 116 0 0 1 116 116z" />
<path fill="#FFF" d="M184 213A140 140 0 0 0 44 73V38a175 175 0 0 1 175 175z" />
</svg></a></h2>
{% set ns = namespace(current_date="") %}
{% for row in sql("select date, body from news order by date desc limit 15", database="content") %}
{% if prettydate(row["date"]) != (ns.current_date and prettydate(ns.current_date)) %}
<h3>{{ prettydate(row["date"]) }} <a href="/news/{{ row["date"] }}" style="font-size: 0.8em; opacity: 0.4">#</a></h3>
{% set ns.current_date = prettydate(row["date"]) %}
{% endif %}
{{ render_markdown(row["body"]) }}
{% endfor %}
<p><a href="/news">All news</a></p>
</div>
<div class="two-col-column">
<h2>Latest releases</h2>
{% set ns = namespace(current_date="", current_pypi_summary="") %}
{% for row in sql("""
with release_note_releases as (
select
repos.name as name,
releases.html_url as release_url,
releases.tag_name as version,
substr(releases.published_at, 0, 11) as date,
releases.body as body_markdown,
releases.published_at as released_at,
pypi_packages.summary as pypi_summary
from
releases
join repos on repos.id = releases.repo
left join pypi_packages on pypi_packages.name = repos.name
),
releases_with_no_notes as (
select
pypi_releases.package as name,
null as release_url,
pypi_versions.name as version,
substr(min(pypi_releases.upload_time), 0, 11) as date,
null as body_markdown,
min(pypi_releases.upload_time) as released_at,
pypi_packages.summary as pypi_summary
from
pypi_releases
join pypi_packages on pypi_releases.package = pypi_packages.name
join pypi_versions on pypi_releases.version = pypi_versions.id
where
pypi_releases.package not in (
select
name
from
release_note_releases
)
group by
pypi_releases.package,
pypi_releases.version
)
select
*
from
release_note_releases
union
select
*
from
releases_with_no_notes
order by
released_at desc
limit
15
""" , database="content") %}
{% if prettydate(row["released_at"]) != (ns.current_date and prettydate(ns.current_date)) %}
<h3>{{ prettydate(row["released_at"]) }}</h3>
{% set ns.current_date = prettydate(row["released_at"]) %}
{% endif %}
<h4><a href="{% if row["release_url"] %}{{ row["release_url"] }}{% else %}https://pypi.org/project/{{ row["name"] }}/{% endif %}">{{ row["name"] }} {{ row["version"]}}</a>
{% if row["pypi_summary"] != ns.current_pypi_summary and row["pypi_summary"] %}
<span style="font-weight: normal; color: #666; font-size: 0.9em;"> - {{ row["pypi_summary"] }}</span>
{% set ns.current_pypi_summary = row["pypi_summary"] %}
{% endif %}</h4>
{% if row["body_markdown"] %}
{{ adjust_header_hierarchy(render_markdown(row["body_markdown"], extensions=["fenced_code"]), max_heading_level=5) }}
{% endif %}
{% endfor %}
<p><a href="/content/recent_releases">All releases</a></p>
</div>
</div>
</main>
{% include "_footer.html" %}
<a href="https://github.com/simonw/datasette" class="github-corner" aria-label="datasette on GitHub">
<svg width="80" height="80"
viewBox="0 0 250 250"
style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"
><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
<path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>
</svg></a>
</body>
</html>