diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9ad331d..f0ba3b8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [0.3.0] - 2026-09-27
+
+Everything from 0.2.0 keeps working unchanged.
+
+### Added
+
+- `Table`, with cells as slots named after their column
+- `GlobalSearch`, a search field opened with Ctrl or Cmd K, handed groups of
+ results the application has already narrowed
+
## [0.2.0] - 2026-09-01
The components the dashboard kept for itself, so both surfaces can share one
diff --git a/README.md b/README.md
index 76e967c..abca897 100644
--- a/README.md
+++ b/README.md
@@ -10,8 +10,8 @@ notices the two products no longer look like one.
## What is in it, and what is not
Tokens, and the pieces a screen is assembled from: `Avatar`, `Badge`, `Button`,
-`Card`, `Field`, `Input`, `ItemCard`, `Logo`, `Modal`, `PageHead`, `Select`,
-`Tabs`, `Textarea`, and `CodeGraph`.
+`Card`, `Field`, `Input`, `ItemCard`, `Logo`, `Modal`,
+`GlobalSearch`, `PageHead`, `Select`, `Table`, `Tabs`, `Textarea`, and `CodeGraph`. `src/index.js` is the list that is actually true.
Nothing that knows what a workspace, a review or a proposal is. Those belong to
whichever application has them, and a package that grew to hold them would be
diff --git a/package.json b/package.json
index 6f6d932..b386cc1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@sourceant/design",
- "version": "0.2.0",
+ "version": "0.3.0",
"description": "SourceAnt design system: tokens, primitives, and the graph renderer",
"license": "MIT",
"type": "module",
diff --git a/src/components/GlobalSearch.vue b/src/components/GlobalSearch.vue
new file mode 100644
index 0000000..fa8c543
--- /dev/null
+++ b/src/components/GlobalSearch.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
diff --git a/src/index.js b/src/index.js
index 200d570..471aa31 100644
--- a/src/index.js
+++ b/src/index.js
@@ -10,12 +10,14 @@ export { default as Badge } from './components/Badge.vue'
export { default as Button } from './components/Button.vue'
export { default as Card } from './components/Card.vue'
export { default as CodeGraph } from './components/CodeGraph.vue'
+export { default as GlobalSearch } from './components/GlobalSearch.vue'
export { default as Field } from './components/Field.vue'
export { default as Input } from './components/Input.vue'
export { default as ItemCard } from './components/ItemCard.vue'
export { default as PageHead } from './components/PageHead.vue'
export { default as Select } from './components/Select.vue'
export { default as SearchableSelect } from './components/SearchableSelect.vue'
+export { default as Table } from './components/Table.vue'
export { default as Tabs } from './components/Tabs.vue'
export { default as Textarea } from './components/Textarea.vue'
export { default as ListInput } from './components/ListInput.vue'