+
+
+
+
+
+Dynamo-Browse is a terminal-based UI (TUI) app for working with DynamoDB tables.
+With it, you can quickly connect to and browse the contents of a DynamoDB table
+in your AWS account or local machine. There are some basic facilities for
+editing as well.
+
+
+
+## Getting Started
+
+Instructions for installing Dynamo-Browse can be found on the [Downloads page](/download).
+
+This video gives a brief introduction of how to use Dynamo-Browse to view the items of a DynamoDB table:
+
+{{< youtube cQnTIg1_tfg >}}
+
+More information about the tool can be found within the [Dynamo-Browse user manual](/docs).
+
diff --git a/_site/content/docs/_index.md b/_site/content/docs/_index.md
new file mode 100644
index 0000000..ee4c39b
--- /dev/null
+++ b/_site/content/docs/_index.md
@@ -0,0 +1,35 @@
+# User Guide
+
+## Table Of Contents
+
+- [Launching and Quitting](/docs/launching)
+ - [Selecting a Table](/docs/launching#selecting-a-table)
+ - [Selecting a Workspace](/docs/launching#selecting-a-workspace)
+ - [Quitting](/docs/launching#quitting)
+- [Getting Around](/docs/getting-around)
+ - [The Back-stack](/docs/getting-around#the-back-stack)
+ - [Adjusting The Layout](/docs/getting-around#adjusting-the-layout)
+ - [Adjusting The Displayed Columns](/docs/getting-around#adjusting-the-displayed-columns)
+ - [Entering Commands](/docs/getting-around#entering-commands)
+- [Filtering and Querying](/docs/filtering-querying)
+ - [Filtering](/docs/filtering-querying#filtering)
+ - [Querying](/docs/filtering-querying#querying)
+- [Editing Items](/docs/editing-items)
+ - [Marking Items](/docs/editing-items#marking-items)
+ - [Modifying Attributes](/docs/editing-items#modifying-attributes)
+ - [Deleting Attributes](/docs/editing-items#deleting-attributes)
+ - [Adding Items](/docs/editing-items#adding-items)
+ - [Deleting Items](/docs/editing-items#deleting-items)
+ - [Committing Changes](/docs/editing-items#committing-changes)
+ - [Backing Out of Changes](/docs/editing-items#backing-out-of-changes)
+- [Customising Dynamo-Browse](/docs/customising)
+ - [The RC File](/docs/customising#rc-file)
+ - [Rebinding Keys](/docs/customising#rebinding-keys)
+
+References
+
+- [Key Bindings](/docs/reference/key-bindings)
+- [Commands](/docs/reference/commands)
+- [Query Expressions](/docs/reference/query-expressions)
+- [Launch Flags](/docs/reference/launch-flags)
+- [Settings](/docs/reference/settings)
diff --git a/_site/content/docs/customising.md b/_site/content/docs/customising.md
new file mode 100644
index 0000000..34e4a3a
--- /dev/null
+++ b/_site/content/docs/customising.md
@@ -0,0 +1,41 @@
+# Customising Dynamo-Browse
+
+Some commands can be used to customise Dynamo-Browse, such as modify key bindings.
+The effect of these commands will only be applied for the duration of the session: they are currently not
+tracked within the workspace file. So in order to keep customisations across relaunches, these commands
+can be added to an RC file.
+
+## The RC File
+
+The RC file is a text file containing commands that will be executed by Dynamo-Browse upon launch.
+By default, the RC file is located at the following path:
+
+```
+$HOME/.config/audax/dynamo-browse/init.rc
+```
+
+This file is primarily intended for commands that customise Dynamo-Browse in a particular way, but any
+command can be entered here. If this file is found, Dynamo-Browse will invoke each command before loading
+or prompting the table.
+
+## Rebinding Keys
+
+The default key bindings of Dynamo-Browse can be changed using the [rebind](/docs/reference/commands#rebind) command. This takes
+a binding name corresponding to the particular action to invoke, and the key
+to which it should be mapped to.
+
+Putting these commands in the RC file will effectively change the default bindings of Dynamo-Browse.
+
+```
+# Rebind T to prompt for a table
+rebind "view.prompt-for-table" "T"
+
+# Rebind escape to prompt for a command
+rebind "view.prompt-for-command" "esc"
+```
+
+At the moment each binding name can only be mapped to a single key. It's also currently not possible
+to setup bindings for commands. These may be supported in the future.
+
+A list of available binding names can be found the the [reference](/docs/reference/key-bindings)
+(check the "Show binding names" checkbox). Note that some bindings may not have default key bindings.
\ No newline at end of file
diff --git a/_site/content/docs/editing-items.md b/_site/content/docs/editing-items.md
new file mode 100644
index 0000000..e7d38b0
--- /dev/null
+++ b/_site/content/docs/editing-items.md
@@ -0,0 +1,91 @@
+# Editing Items
+
+Dynamo-Browse offers some basic facilities for editing items — such as creating items, deleting items,
+and modifying their attribute values.
+
+
+
+
+
+## Marking Items
+
+Most modifications are applied to items that are marked. A marked item is indicated by a grey
+background and a bullet indicator (`•`) on the left side of the table.
+
+To mark or unmark the selected item, press m.
+
+The command `unmark` can be used to clear all marked items.
+
+## Modifying Attributes
+
+Item attributes can be added or modified by using the command `set-attr` or the alias `sa`.
+This command can be used to modify the value and type of an attribute of the currently selected items, or
+from any marked items.
+
+The format of the command is as follows:
+
+```
+:set-attr []
+```
+
+Where type is one of the following (case insensitive):
+
+- `-S`: string
+- `-N`: number
+- `-BOOL`: boolean
+- `-NULL`: null
+
+If the type is not specified, and the attribute exists, then the attribute type will not change.
+The type must be specified if this is a new attribute or multiple items have been marked.
+After executing the command, Dynamo-Browse will prompt for the value of the new attribute if one is
+required.
+
+Modified attributes will only be tracked in memory: they will not be written
+to the actual table until it is "putted" (see [Committing Changes](#committing-changes)).
+An item that has been modified will be displayed in red and a modified indicator (`M`) will appear
+on the left-most column.
+
+## Deleting Attributes
+
+An attribute can be deleted by using the command `del-attr` or the alias `da`. The format of the command
+is as follows:
+
+```
+:del-attr
+```
+
+When executed, the attribute with the name _attributeName_ will be deleted from the selected item, or
+from any marked items.
+
+Deleted attributes will only be tracked in memory: they will not be removed from
+the actual table until it is "putted" (see [Committing Changes](#committing-changes)).
+An item that has been modified will be displayed in red and a modified indicator (`M`) will appear
+on the left-most column.
+
+## Adding Items
+
+A new item can be created by typing in the command `new-item`.
+
+When entered, Dynamo-Browse will prompt for the partition and sort key. Once these are entered,
+the item will appear in the top pane in green with an asterisk indicator (`*`) on the left left-most column.
+Any additional attributes can be set by using `set-attr`.
+
+A new item will only appear in memory: it will not be written
+to the actual table until it is "putted" (see [Committing Changes](#committing-changes)).
+
+## Deleting Items
+
+Items can be deleted by marking them and then typing in the command `delete`.
+
+Unlike most of the other modified commands, running `delete` WILL make changes to the table
+immediately.
+
+## Committing Changes
+
+New or modified items (but not deleted items) will be kept in memory until they are committed
+or "putted" to the table. To put the changes, use the `put` command or `w` alias.
+
+## Backing Out of Changes
+
+Any modified items can be reverted back to what they are in the actual table by rerunning the
+current query. This can be done by pressing ⇧R.
\ No newline at end of file
diff --git a/_site/content/docs/filtering-querying.md b/_site/content/docs/filtering-querying.md
new file mode 100644
index 0000000..87096cd
--- /dev/null
+++ b/_site/content/docs/filtering-querying.md
@@ -0,0 +1,39 @@
+# Querying And Viewing Results
+
+## Querying
+
+
+
+
+
+A query or scan over the table can be performed by entering a _Query Expression_.
+Query expressions are a built-in expression language which translates to either a DynamoDB query
+or scan, depending on the expression. Details about the Query Expression language can be found in the
+[Query Expressions references](/docs/reference/query-expressions/).
+
+To run a query, press ?, and enter the query expression.
+
+To clear a query, press ?, and press Enter without entering any value.
+
+While the query is running, a spinner indicating activity will be shown in the status bar. A running
+query can be cancelled while this spinner is visible by pressing ^C. You have the option
+to view any partial results that have been retrieved at the time.
+
+## Filtering
+
+
+
+
+
+The displayed items of the current result-set can be filtered down to those that contain a specific substring.
+
+To set the filter, press /, and enter the substring you wish to filter on.
+
+To clear the filter, press /, and press Enter without entering any value.
+
+When a filter is set, any item that does not have a top-level attribute containing the substring will be hidden.
+
+Filtering will only consist the items that are in the current result-set. It will not result in a call to the actual
+table itself.
+
+Note that filtering is case sensitive.
diff --git a/_site/content/docs/getting-around.md b/_site/content/docs/getting-around.md
new file mode 100644
index 0000000..c899947
--- /dev/null
+++ b/_site/content/docs/getting-around.md
@@ -0,0 +1,153 @@
+# Getting Around
+
+After selecting a table, Dynamo-Browse will perform a scan and present the results in the default view mode.
+
+
+
+
+
+This mode consists of three panes:
+
+- The top pane displays the result-set of the last scan or query. The table name is at the top-left.
+- The middle pane displays the attributes of the currently selected item, along with their type.
+- The bottom pane displays the current query or filter, plus any messages. Prompts for input will
+ also appear at the bottom.
+
+The result-set is sorted in ascending order based on the value and type of the partition and sort key.
+Up to 1,000 rows will be displayed for the current result-set.
+
+Since DynamoDB does not require all items to have the same attribute (unless they are pre-defined), any
+attribute not set for a column is indicated with a grey tilde character `~`.
+
+Use the following keys to change the currently selected row, which is highlighted in purple:
+
+- ↑/i: Move selection up
+- ↓/k: Move selection down
+- PgUp/⇧I: Page up
+- PgDn/⇧K: Page down
+- Home/0: First row
+- End/$: Last row
+
+The columns of the table
+consist of the top-level attributes of the result-set. The partition key, sort key, plus any explicitly defined
+attributes will always be displayed from the left margin onwards. The other attributes are determined
+from the results of the last scan or query, and may change depending on the result.
+
+The display columns of the table can be scrolled across by using the following keys:
+
+- ←/j: Scroll to the left
+- →/l: Scroll to the right
+
+The attributes of the currently selected item will appear in the middle pane. Both the type and the value of each
+attribute will be displayed. Any nested attributes will be indented, and will below their parent item. A value
+displayed in grey does not represent the actual value of the item, but indicates some meta-information about the item,
+such as the length.
+
+## The Back-stack
+
+Changes to the view of Dynamo-Browse will be maintained in back-stack, similar to how a
+web-browse keeps track of the webpages you've visited. This stack will record the
+currently viewed table, filter, or query, allowing you to "go back" to a previous view
+by pressing Backspace. Pressing \\ will allow you to go forward through the stack.
+
+The back-stack is preserved in the workspace file, and can be restored by launching Dynamo-Browse with the `-w`
+switch. Launching Dynamo-Browse with a workspace that has a non-empty stack will restore the last viewed
+table, filter, or query from the session that was previously using the workspace.
+
+{{}}
+ **Note:** the back-stack does not preserve the actual items in the workspace. Going backwards or forwards
+ through the back-stack will execute any queries or filters against the actual table itself.
+{{}}
+
+## Adjusting The Layout
+
+The horizontal size of the item table and currently selected item pane can be changed to one of the
+following layout configurations:
+
+- Item view taking up 14 rows on the bottom with the table pane taking up the rest of the vertical space (the default)
+- Item view and table view taking up half of the available space
+- Table view taking up 7 rows on the top with the item view taking up the rest of the vertical space
+- Table view hidden
+- Item view hidden
+
+Pressing w will cycle forward though these layouts. For example, while in the
+default layout, pressing w will switch to the second layout, where both the table view take up half the
+screen. Pressing ⇧W will cycle through the layouts in the reverse order.
+
+## Adjusting The Displayed Columns
+
+The columns of the result-set can be adjusted by opening up the _Fields Popup_. This popup can be opened by pressing f.
+
+
+
+
+
+While this popup is opened, the following changes can be applied to the displayed columns of the main table:
+
+- Columns can be hidden
+- The order columns appear in the main table can be rearranged
+- New columns can be added
+
+The popup will display the list of columns of the main result-set table. Pressing ↑/i
+or ↓/k will move the selection indicator to the column to apply the operation. Pressing
+←/j or →/l will scroll the main table left or right so that any
+operations can be previewed.
+
+To reset the columns to the top-level fields of the current result set, press ⇧R.
+
+To close the popup, press Escape.
+
+### Showing And Hiding Columns
+
+In the Fields Popup, each row has a symbol indicating whether the row is currently visible (`.`) or hidden (`✕`). Pressing
+Space will toggle whether the currently selected column is shown or hidden.
+
+### Re-arranging The Order Of Columns
+
+The currently selected row can be moved up or down the table. This will move the corresponding column in the main table either
+left or right.
+
+Press ⇧I to the selected row up, which will move the corresponding column left.
+
+Press ⇧K to the selected row down, which will move the corresponding column right.
+
+### Adding And Removing Columns
+
+New columns can be added in the table. The value of these columns will be determined by the result of a query expression,
+and can be used to expose fields that are not at the top level.
+
+Any nested fields of maps or lists will not be included as a column by default. Consider, for example, a table of books
+with authors structured as so:
+
+```
+{
+ "book": {"S": "The Lord Of The Rings"},
+ "author": {"M": {
+ "firstName": {"S": "John"},
+ "middleName": {"S": "Ronald Reuel"},
+ "lastName": {"S": "Tolkien"},
+ }}
+}
+```
+
+If you wanted to show the the author's first and last name in the main table, rather than just see the description `(3 items)`, you
+can add a new column with an expression selecting the fields of the author map. The expressions that can be used here
+are as follows:
+
+- First name: `author.firstName`
+- Last name: `author.lastName`
+
+This can be extended to expressions that perform comparisons or operations. For example, the expression `author.firstName ^= "J"` can be
+use in a new column to display `True` for any first name that begins with a J.
+
+To add a new column, press a while the Fields Popup is visible. You'll be prompted to enter a query expression,
+which will be evaluated over each row within the result-set when displaying the table.
+
+Any column, that was either retrieved from the result-set or added by the user, can be deleted by selecting the column
+within the Fields Popup and pressing d.
+
+## Entering Commands
+
+Commands can be entered by pressing : and entering the command, with any arguments, at the prompt.
+
+The list of available commands can be found within the [reference section](/docs/reference/#commands).
\ No newline at end of file
diff --git a/_site/content/docs/launching.md b/_site/content/docs/launching.md
new file mode 100644
index 0000000..26f169e
--- /dev/null
+++ b/_site/content/docs/launching.md
@@ -0,0 +1,62 @@
+# Launching And Quitting
+
+To launch Dynamo-Browse, run the following command at the terminal:
+
+```
+dynamo-browse
+```
+
+This will use your current AWS configuration and region, which can be changed by setting
+the relevant `AWS_` environment variables.
+
+To connect to a local instance of DynamoDB, such as one
+running in a Docker container, use the `--local` flag. This takes as the argument the hostname
+and endpoint of the local DynamoDB server. The hostname can be omitted, and will default to `localhost`:
+
+```
+dynamo-browse --local :8080
+```
+
+## Selecting a Table
+
+Upon launch, Dynamo-Browse will present a list of all the tables within the region:
+
+
+
+
+
+Select the table to view by pressing Enter. Use the following keys to navigate
+the items within the list:
+
+- ↑/i: Move selection up
+- ↓/k: Move selection down
+
+Once the table is selected, the table will be scanned and Dynamo-Browse will be presented in
+[View Mode](#view-mode). Another table can be selected from within view mode using the `:table` command.
+
+Dynamo-Browse can also be launched directly in view mode by specifying a table using the `-t` flag:
+
+```
+dynamo-browse -t user-accounts
+```
+
+## Selecting a Workspace
+
+Dynamo-Browse tracks session state, such as the back-stack, in a workspace file. By default the workspace
+file will be a new file created within the temporary directory, but a specific workspace filename can be
+specified by using the `-w` flag:
+
+```
+dynamo-browse -w my-workspace.ws
+```
+
+If the workspace filename references an existing file, Dynamo-Browse will restore the workspace and use it for the duration of
+the session. If the workspace filename references a non-existing file, Dynamo-Browse will initialise a new workspace
+using the specified filename.
+
+Only one running instance of Dynamo-Browse can use a single workspace file at any one time.
+
+## Quitting
+
+To quit dynamodb-browse, enter the command `q` by pressing :, then typing qEnter.
+The keystroke Ctrl+C can also be used to quit.
\ No newline at end of file
diff --git a/_site/content/docs/reference/commands.md b/_site/content/docs/reference/commands.md
new file mode 100644
index 0000000..2a9d407
--- /dev/null
+++ b/_site/content/docs/reference/commands.md
@@ -0,0 +1,150 @@
+# Commands
+
+## clone
+
+```
+:clone
+```
+
+Copies the currently selected item to a new item, which will appear at the bottom of the table.
+
+Cloning an item will prompt for a new partition key and sort key but will not check for duplicates.
+
+## del-attr
+
+```
+:del-attr
+```
+
+Alias: `da`
+
+Deletes _attribute_ from the currently selected item; or if there are any marked items, the marked items.
+
+## delete
+
+```
+:delete
+```
+
+Deletes the marked items. Unlike the other commands that modify items, this command will be executed on
+the table straight away.
+
+## echo
+
+```
+:echo [message ...]
+```
+
+Displays _message_ in the status bar. Mainly used for debugging.
+
+## export
+
+```
+:export [-all]
+```
+
+Writes the currently loaded items as a CSV file to _filename_.
+
+Only string, numerical, and boolean values will be written to the export; all other value types will be
+black. Exporting will honour the columns currently visible in the table. Filtered items will also be included
+in the exported file.
+
+When called with the `-all` flag, any subsequent pages will be included in the export. If invoked after running
+a query, all items returned from that query will be exported to file.
+
+## mark
+
+```
+:mark [all | none | toggle] [-where ]
+```
+
+Mark the rows in the following way:
+
+- `all`: will mark all rows. This is the default when invoked without an argument.
+- `none`: will unmark all rows.
+- `toggle`: will toggle all marked and unmarked rows.
+
+Adding the `-where` option would only select rows that match the given query expression.
+
+
+## new-item
+
+```
+:new-item
+```
+
+Creates a new item. When executed, the value for the partition key and sort key will be prompted.
+The new item will not be written to the table until it is committed with the `put` command.
+
+## put
+
+```
+:put
+```
+
+Alias: `w`
+
+Commits all new and modified items to the table.
+
+## quit
+
+```
+:quit
+```
+
+Alias: `q`
+
+Quits Dynamo-Browse.
+
+## rebind
+
+```
+:rebind
+```
+
+Rebinds the action with _bindingName_ to _key_. This will replace any existing binding for that action.
+See [Key Bindings](#key-bindings) with "Show binding names" checked to see available binding names.
+
+## set
+
+```
+:set [value]
+```
+
+Set the value of a setting. Flag setting types can be enabled without any value. See [Settings](#settings) for possible setting values.
+
+## set-attr
+
+```
+:set-attr [type]
+```
+
+Alias: `sa`
+
+Modifies the value of _attribute_ of the currently selected item; or if there are any marked items, the marked items.
+
+The value of _type_ can be use to specify the type of the attribute. It can be one of the following (case insensitive):
+
+- `-S`: string value
+- `-N`: number value
+- `-BOOL`: boolean value
+- `-NULL`: null value
+- `-TO`: value of an expression
+
+If unset, the attribute type will not be changed. _type_ must be set if multiple items have been marked.
+
+## table
+
+```
+:table
+```
+
+Select the table to display.
+
+## unmark
+
+```
+:unmark
+```
+
+Unmark all marked items. This is essentially an alias for `mark none`.
diff --git a/_site/content/docs/reference/key-bindings.md b/_site/content/docs/reference/key-bindings.md
new file mode 100644
index 0000000..84d7230
--- /dev/null
+++ b/_site/content/docs/reference/key-bindings.md
@@ -0,0 +1,189 @@
+# Key Bindings
+
+
+
+
+
+
+
+
+
Key
+
Binding Name
+
Action
+
+
+
+
+
Main View Mode
+
+
+
↑/i
+
table.move-up
+
Move selection up
+
+
+
↓/k
+
table.move-down
+
Move selection down
+
+
+
PgUp/⇧I
+
table.page-up
+
Page up
+
+
+
PgDn/⇧K
+
table.page-down
+
Page down
+
+
+
Home/0
+
table.goto-top
+
Move selection to first item
+
+
+
End/$
+
table.goto-bottom
+
Move selection to last item
+
+
+
←/j
+
table.move-left
+
Scroll displayed columns left
+
+
+
→/l
+
table.move-right
+
Scroll displayed columns right
+
+
+
Backspace
+
view.view-back
+
Go back
+
+
+
\
+
view.view-forward
+
Go forward
+
+
+
w
+
view.cycle-layout-forward
+
Cycle forward through layout
+
+
+
⇧W
+
view.cycle-layout-backwards
+
Cycle backwards through layout
+
+
+
m
+
view.mark
+
Mark/unmark currently selected item
+
+
+
M
+
view.toggle-marked-items
+
Toggle marked/unmarked items
+
+
+
c
+
view.copy-item-to-clipboard
+
Copy displayed item to pasteboard
+
+
+
C
+
view.copy-table-to-clipboard
+
Copy displayed table to pasteboard as a CSV
+
+
+
/
+
view.prompt-for-filter
+
Filter
+
+
+
?
+
view.prompt-for-query
+
Run scan/query
+
+
+
+
view.prompt-for-table
+
Select table
+
+
+
R
+
view.rescan
+
Rerun last scan/query
+
+
+
>
+
view.fetch-next-page
+
Fetch the next page of results
+
+
+
:
+
view.prompt-for-command
+
Enter command
+
+
+
f
+
view.show-fields-popup
+
Show fields popup
+
+
+
^C
+
view.cancel-running-job
+
Cancel running operation
+
+
+
^C/Esc
+
view.quit
+
Quit
+
+
+
Field Popup Mode
+
+
+
⇧I
+
fields-popup.shift-column-left
+
Shift selected column left
+
+
+
⇧K
+
fields-popup.shift-column-right
+
Shift selected column right
+
+
+
Space
+
fields-popup.toggle-column-visible
+
Toggle selected column visible
+
+
+
a
+
fields-popup.add-column
+
Add new column
+
+
+
d
+
fields-popup.delete-column
+
Delete selected column
+
+
+
⇧R
+
fields-popup.reset-columns
+
Reset columns to that of the result-set
+
+
+
^C/Esc
+
fields-popup.close
+
Close field popup
+
+
+
+
+
+
diff --git a/_site/content/docs/reference/launch-flags.md b/_site/content/docs/reference/launch-flags.md
new file mode 100644
index 0000000..145d8fd
--- /dev/null
+++ b/_site/content/docs/reference/launch-flags.md
@@ -0,0 +1,49 @@
+# Launch Flags
+
+## -debug
+
+```
+-debug
+```
+
+Enable debug logs, which will be written to _filename_.
+
+## -default-limit
+
+```
+-default-limit
+```
+
+Sets the default limit of queries or scans. The default is 1,000 items.
+
+## -local
+
+```
+-local [host]:
+```
+
+Connect to a local DynamoDB service listening on _host_:_port_. The default _host_ is `localhost`.
+
+## -ro
+
+```
+-ro
+```
+
+Enable read-only mode.
+
+## -t
+
+```
+-t
+```
+
+Open the table _tableName_, instead of prompting for a table.
+
+## -w
+
+```
+-w
+```
+
+Use _workspaceFile_ as the workspace file. If unset, a temporary file will be used for the workspace.
\ No newline at end of file
diff --git a/_site/content/docs/reference/query-expressions.md b/_site/content/docs/reference/query-expressions.md
new file mode 100644
index 0000000..cf0b128
--- /dev/null
+++ b/_site/content/docs/reference/query-expressions.md
@@ -0,0 +1,251 @@
+# Query Expression
+
+Query expressions are used to select rows of a table. When executed as a query (i.e. by pressing ?),
+they will be translated into query or table scans that will run over the DynamoDB table in AWS.
+They work similar to the "where" clause in PartiQL except that they only require Query and Scan permission
+on the AWS table and do not require "select" clauses.
+Such expressions can also be used in other areas of Dynamo-Browse, such as populating the value of new columns.
+
+## Names And Values
+
+A query expressions support the following literals:
+
+- Strings: `"Hello"`
+- Integers: `123`
+- Boolean: `true` or `false`
+
+Field names are represented as regular identifiers, such as `pk` or `address`.
+
+## Equality
+
+To select rows with a field that equals a given value, use the `=` operator:
+
+```
+pk = "something"
+```
+
+Either operand will can be an identifier, placeholder, or value that resolves to any type.
+The result will be true if both the LHS and RHS equal the same type and value. If the types differ or
+the values differ, the result will be false. The field types can be different, but will always produce false.
+
+The compliment is the `!=` operator:
+
+```
+pk != "not this"
+```
+
+## Numerical Comparison
+
+The operands `<`, `<=`, `>`, `>=` can be used to compare numerical fields and values:
+
+```
+three < 5 // true
+three <= 3 // true
+three > 12 // false
+three >= 1 // true
+```
+
+To verify that a number exists within a range, use the `between` operand:
+
+```
+three between 1 and 5 // true
+```
+
+## Prefix Operator
+
+To select rows with a field that starts with a given substring, use the `^=` operator:
+
+```
+pk ^= "some"
+```
+
+This is equivalent to using the [begins_with](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html) function in AWS query expressions.
+
+## Logical Operators
+
+The logical operators `and`, `or` and `not` can be used to express conjunctions, disjunctions and logical negation
+between multiple expressions:
+
+```
+pk = "this" and sk = "that"
+pk != "that" and count > 123
+not count = 21
+```
+
+The order of precedence of these operators, from lowest to highest, is `or`, `and`, then `not`. This differs
+from AWS, in which all operators have the same precedence. For example, the query:
+
+```
+pk="this" or pk="that" and sk="foo"
+```
+
+is equivalent to:
+
+```
+pk="this" or (pk="that" and sk="foo")
+```
+
+The order can be overridden using brackets:
+
+```
+(pk="this" or pk="that") and sk="foo"
+```
+{{< hint info >}}
+If a query expression is of the form `pk = ` or `pk = and sk `,
+where:
+
+- _pk_ and _sk_ are the partition and sort keys of the base table or a GSI,
+- _val_ resolves to a constant value, and,
+- _op_ is either `=`, `^=`, `<`, `<=`, `>`, `>=`, or `between`
+
+the expression will be executed as a Query call. Unlike expressions on the AWS Query API method itself,
+the order of the `pk` and `sk` subexpressions can be swapped.
+
+Other expressions are supported but they will be executed as a table Scan.
+{{< /hint >}}
+
+## The `in` Operator
+
+The `in` operator can be used to determine if a value exists in a collection:
+
+```
+three in (1, 2, 3, 4, 5)
+
+name in ("Tom", "Dick", "Harry")
+```
+
+The result will be a boolean, which will be true if the value of the LHS equals any of the items within the RHS.
+
+The collection can be one or more fixed set of values within parenthesis separated by commas. A single
+value present within parenthesis is equivalent to the equality test:
+
+```
+three in (3) // equivalent to: three = 3
+```
+
+The right hand side can also be a subexpression without parenthesis that will resolve to either a string,
+list or map. The operand will behave differently based on the RHS type:
+
+- If the RHS is a string, the result will be true if the LHS is a substring of the RHS (equivalent to the `contains` AWS conditional expressions function)
+- If the RHS is a list, the result will be true if the LHS equals any of the items of the list
+- If the RHS is a map, the result will be true if the LHS appears as a key of the map
+
+The compliment operand is `not in`:
+
+```
+three not in (6, 7, 8, 9)
+```
+
+## The `is` Operator
+
+The `is` operator can be used to assert the value type. The RHS operand is a string which is to represent an AWS
+DynamoDB item attribute type, for example `S` for strings, `N` for numbers, etc.
+
+```
+"hello" is "S" // true
+123 is "N" // true
+"hello" is "N" // false
+```
+
+This is equivalent to the `attribute_type` AWS conditional expressions function.
+
+The special value `any` can be used to check that a field is set, regardless of type:
+
+```
+pk is "any" // true
+```
+
+This is equivalent to the `attribute_exists` AWS conditional expressions function.
+
+The compliment operand is `not is`. Using it with the "any" special value (`not is "any"`) is equivalent to the
+`attribute_not_exists` AWS conditional expressions function.
+
+## The `using` Options
+
+A query that is to be executed on the actual table in AWS will go though a short planning phase to determine
+whether it's possible to invoke the expression as a `Query` call. If the attributes map to partition and sort keys
+of either the main table, or exactly one GSI associated with the table, the expression will be executed as a Query
+over the table or the GSI found with those attributes.
+
+In cases where multiple GSI candidates exist on the base table, the query will fail with the following error:
+
+```
+multiple plans with index found. Specify index or scan with 'using' clause
+```
+
+In these cases, the index will need to be specified with the `using` keyword with the `index` option:
+
+```
+address="something" using index("specific-gsi-name")
+```
+
+The `using` keyword can also be used to force the expression to run as a table scan,
+even if the query can be invoked using a Query call over the base table or GSI:
+
+```
+address="something" using scan
+```
+
+## Builtin Functions
+
+Query expressions support a number of builtin functions.
+
+### The `marked` function
+
+```
+marked(fieldname)
+```
+
+The `marked` function will return a list of field values of all marked rows of the current result set. The
+items will appear in the list as they appear in the result set. The _fieldname_ currently only supports top-level fields.
+If no fields are marked, the empty list is returned.
+
+```
+marked("city")
+```
+
+### The `range` function
+
+```
+range(from, to)
+```
+
+The `range` function will return a list of integers between _from_ and _to_ inclusive. Non integers will be truncated
+to integers, and the step is always be 1.
+
+```
+range(2, 5) // [2, 3, 4, 5]
+three in range(2, 5) // true
+```
+
+### The `size` function
+
+```
+size(v)
+```
+
+The `size` function will return the number of items of a list or map, or the length of a string.
+
+{{< hint info >}}
+The `size` function is equivalent to the `size` AWS conditional expressions function, and as such is the
+only function that is included as is in the generated Query or Scan expression. All other functions are evaluated
+prior to making the Query or Scan AWS call.
+{{}}
+
+
+## Placeholders
+
+In some circumstances, such as the [session.query](/docs/reference/script-api/#session-query) method, it's possible to use a placeholder as a field or value. To expand a placeholder to an identifier, use the `:` prefix. To expanded the placeholder as a value, use the `$` prefix. For example, the expression `:key = $value` in the following script:
+
+```
+out := session.query(":key = $value", {
+ table: "some-table",
+ args: {
+ key: "pk",
+ value: "value"
+ }
+}
+```
+
+Is equivalent to the query `pk = "hello"`, as the placeholder `:key` is expanded to an identifier and `$value` is expanded
+to a value, in this case a string.
diff --git a/_site/content/docs/reference/script-api.md b/_site/content/docs/reference/script-api.md
new file mode 100644
index 0000000..90fbeb6
--- /dev/null
+++ b/_site/content/docs/reference/script-api.md
@@ -0,0 +1,5 @@
+---
+title: "Script API"
+type: script-api
+---
+# Script API
\ No newline at end of file
diff --git a/_site/content/docs/reference/settings.md b/_site/content/docs/reference/settings.md
new file mode 100644
index 0000000..5eea365
--- /dev/null
+++ b/_site/content/docs/reference/settings.md
@@ -0,0 +1,21 @@
+# Settings
+
+## default-limit
+
+- Type: int
+- Default: `1000`
+
+The maximum number of rows returned from a query or scan.
+
+## ro
+
+- Type: flag
+
+Enable read-only mode. When enabled, all modification operations are disabled, and will fail with a `Read-only mode` error.
+The `rw` setting will disable read-only mode.
+
+## rw
+
+- Type: flag
+
+Disable read-only mode. The `ro` setting will enable read-only mode.
\ No newline at end of file
diff --git a/_site/content/docs/scripting.md b/_site/content/docs/scripting.md
new file mode 100644
index 0000000..5bd6ba5
--- /dev/null
+++ b/_site/content/docs/scripting.md
@@ -0,0 +1,103 @@
+---
+title: "Scripting"
+---
+# Scripting
+
+Scripts can be used to automate certain tasks with Dynamo-Browse. They can also be used to define
+new commands or key bindings.
+
+## Scripting Basics
+
+Dynamo-Browse scripts are written using the [Tamarin](https://cloudcmds.github.io/tamarin/) scripting language,
+which looks a lot like [Go](https://go.dev). All features of the language are available in Dynamo-Browse.
+
+The typical "hello world" script for Dynamo-Browse is below:
+
+```
+ui.print("Hello, world")
+```
+
+This uses the [ui](/docs/reference/script-api/#module-ui) package, which is the package used to interact with
+the Dynamo-Browse user interface.
+A full list of supported packages can be found in the [Script API](/docs/reference/script-api/) reference, along
+with the builtins and packages supported by Tamarin itself.
+
+{{}}
+ **Note:** the [ext](/docs/reference/script-api/#module-ext) package is only available to Extension Scripts.
+{{}}
+
+To execute this script, use the `run-script` command:
+
+```
+run-script /path/to/script/hello.tm
+```
+
+You'll see that the message "Hello, world" will appear in the status bar of Dynamo-Browse.
+
+
+
+Any `print` or `printf` messages will be written to the debug log with the prefix `script `. The
+debug log is turned off by default, but it can be enabled using the [-debug](/docs/reference/launch-flags/#-debug) flag on launch.
+
+Scripts loaded using the `run-script` command are for ad-hoc automation tasks that are not necessarily designed for
+repeated use. These ad-hoc scripts are executed, then immediately unloaded, and are not generally allowed to extend
+Dynamo-Browse. In order to do so, you will need to write an Extension Script.
+
+## Extension Scripts
+
+Extension scripts are scripts designed to extend Dynamo-Browse in some way, such as with new commands or key bindings.
+They are traditionally loaded on startup and exist in the predefined "script" directory. They are usually designed for
+repeated operations, including those that can be bound to command name or keys.
+
+The following is an example script which will define a "goto" command. When invoked, the script will prompt the
+user for the value of the partition key. It will then perform a query over the currently viewed table for any rows with
+that partition key. If no error occurred, the results of the query will be shown to the user.
+
+```
+// Define a new "goto" command, which can be invoked when the user presses ':' and types in 'goto'
+ext.command("goto", func() {
+ // Use the information of the current table to get the name of the partition key.
+ pkName := session.current_table().keys["partition"]
+
+ // Prompt the user for the value to go to. The user can press Esc, which will cancel
+ // the input and return 'nil'.
+ keyVal := ui.prompt(pkName + "? ")
+ if keyVal == nil {
+ return nil
+ }
+
+ // Run a query over the DynamoDB table for any rows with the partition key. Notice
+ // the use of the 'args' option, and the presence of both the name prefix (':key')
+ // and value prefix ('$val').
+ res := session.query(":key = $val", {
+ args: {
+ key: pkName,
+ val: keyVal,
+ },
+ })
+
+ // The query method will return either an error or a result. If it's an error, print
+ // a notice and exist.
+ if res.is_err() {
+ ui.print("Can't goto: " + res.err_msg())
+ return nil
+ }
+
+ // If no error, unwrap the result object to get the result-set returned from the query.
+ // Then change the current result-set to this one. This will change the result-set the
+ // user is currently seeing.
+ session.set_result_set(res.unwrap())
+})
+```
+
+To load an extension script, use the `load-script` command:
+
+```
+load-script script.tm
+```
+
+The script must exist in the "script" directory, which by default is:
+
+```
+$HOME/.config/audax/dynamo-browse/scripts
+```
diff --git a/_site/content/download.md b/_site/content/download.md
new file mode 100644
index 0000000..3fc727d
--- /dev/null
+++ b/_site/content/download.md
@@ -0,0 +1,41 @@
++++
+layout = "single"
++++
+
+# Download
+
+Binary packages can be [download from GitHub](https://github.com/lmika/audax/releases/latest).
+
+## MacOS Using Homebrew
+
+If you have Homebrew, you can install using the following command:
+
+```
+brew tap lmika/audax
+brew install audax
+```
+
+## Linux
+
+To install the Debian package, download the `.deb` file, and install the package by running:
+
+```
+sudo apt install ./audax_0.4.0_linux_amd64.deb
+```
+
+To install the RPM package, download the `.rpm` file, and install the package by running:
+
+```
+sudo yum install ./audax_0.4.0_linux_amd64.rpm
+```
+
+## Install Using Go
+
+If you have Go 1.22, you can install using the following command:
+
+```
+go install github.com/lmika/audax/cmd/dynamo-browse@v0.4.0
+```
+
+
+The source code can be [found on GitHub](https://github.com/lmika/audax).
\ No newline at end of file
diff --git a/_site/content/menu/index.md b/_site/content/menu/index.md
new file mode 100644
index 0000000..564161c
--- /dev/null
+++ b/_site/content/menu/index.md
@@ -0,0 +1,25 @@
++++
+headless = true
++++
+- [Download]({{< relref "/download" >}})
+- [Releases](https://github.com/lmika/audax/releases)
+- [Github](https://github.com/lmika/audax)
+
+
+[**User Guide**]({{< relref "/docs" >}})
+- [Launching]({{< relref "/docs/launching" >}})
+- [Getting Around]({{< relref "/docs/getting-around" >}})
+- [Filtering And Querying]({{< relref "/docs/filtering-querying" >}})
+- [Editing Items]({{< relref "/docs/editing-items" >}})
+- [Customising]({{< relref "/docs/customising" >}})
+- [Scripting]({{< relref "/docs/scripting" >}})
+
+
+**References**
+- [Key Bindings]({{< relref "/docs/reference/key-bindings" >}})
+- [Commands]({{< relref "/docs/reference/commands" >}})
+- [Query Expressions]({{< relref "/docs/reference/query-expressions" >}})
+- [Launch Flags]({{< relref "/docs/reference/launch-flags" >}})
+- [Settings]({{< relref "/docs/reference/settings" >}})
+- [Script API]({{< relref "/docs/reference/script-api" >}})
+
\ No newline at end of file
diff --git a/_site/data/scriptmods/ext.yaml b/_site/data/scriptmods/ext.yaml
new file mode 100644
index 0000000..95c20a5
--- /dev/null
+++ b/_site/data/scriptmods/ext.yaml
@@ -0,0 +1,75 @@
+module: ext
+docs: |
+ Provides access to the extension points scripts can used to extend the functionality of Dynamo-Browse.
+
+ This module is only available for scripts loaded using the [load-script]() command.
+symbols:
+ - name: command
+ syntax: ext.command(name, fn)
+ docs: |
+ Defines a new command, which can be invoked by entering _name_ within the main view mode.
+ The parameter _fn_ must be a function, which will be executed when the _name_ command is entered
+ while in view mode.
+
+ The command can accept arguments, which will be passed in to the parameters of _fn_. The number
+ of command arguments must match the number of parameters, except for any function arguments with
+ a default value.
+ example: |
+ ext.command("add", func(x, y) {
+ sum := x + y
+ ui.print("x + y = ", sum)
+ })
+ - name: related_items
+ syntax: ext.related_items(table, fn)
+ docs: |
+ Defines a "related item" for a table. These act as quick jumps between tables.
+ When the user presses Shift+O, all the related item functions that match the given
+ table will be evaluated. Each one is to return zero or more related queries, which are presented
+ to the user as a list. When the user selects one, the query will be evaluated and the result set will
+ be shown.
+
+ The _table_ parameter is the name of the table of the related items managed by this function.
+ If the last character of the table is `*`, then _table_ will be treated as a name prefix.
+
+ The _fn_ will produce a list of queries that are related to a given item. The function takes the currently
+ selected item as the argument, and is expected to produce a list of maps, with each map having the following
+ fields:
+
+ - `label`: The label to use for the picker option
+ - `query`: The query expression that will run when the option is chosen
+ - `table`: The table to run the query over. If not set, the current table will be used
+ - `args`: A map of query placeholder values
+ - `on_select`: An optional function that will run in place of a predefined query. If set, the `query` field will
+ be ignored.
+ example: |
+ ext.related_items("user-account", func(item) {
+ return [
+ {
+ "label": "Customer",
+ "table": "billing",
+ "query": "email=$email",
+ "args": {"email": item.attr("email")},
+ },
+ ]
+ })
+ - name: key_binding
+ syntax: ext.key_binding(name, options, fn)
+ docs: |
+ Defines a new key binding, which can be invoked while viewing the table.
+
+ The _name_ parameter defines the binding name. The binding names will be prefixed with
+ `ext.`. This name can be used with the [rebind]() command.
+
+ The _option_ parameter defines a map of options. The only valid option is
+ `default`, which is the default key to use for this binding. If unset, the binding will
+ have no key binding and can only be bound using the [rebind]() command.
+
+ The _fn_ parameter is the function that will be invoked when the key is pressed.
+ It must accept no parameters.
+ example: |
+ // Script name: sayhello.tm
+ //
+ // This binding can be rebound with the command "rebind ext.sayhello.hello "
+ ext.key_binding("hello", {"default": "H"}, func() {
+ ui.print("Hello")
+ })
\ No newline at end of file
diff --git a/_site/data/scriptmods/item.yaml b/_site/data/scriptmods/item.yaml
new file mode 100644
index 0000000..72ae8a0
--- /dev/null
+++ b/_site/data/scriptmods/item.yaml
@@ -0,0 +1,44 @@
+module: item
+type: type
+docs: |
+ A single record from a DynamoDB table.
+
+ Item values are converted to tamarin types using the following:
+
+ | Attribute Type | Tamarin Type |
+ |:---------------|:-------------|
+ | S | string |
+ | N | int, float \[1\] |
+ | BOOL | bool |
+ | NULL | nil |
+ | L | list |
+ | M | map |
+ | SS | set, with string values |
+ | NS | set, with number values |
+
+ Notes:
+
+ - \[1\]: int will be used if the value can be parsed as an integer, otherwise it will be returned as a float.
+ - Byte array (B or BS) values are currently not supported.
+
+symbols:
+ - name: resultset
+ syntax: item.resultset
+ docs: |
+ Returns the result-set this item is a member of.
+ - name: index
+ syntax: item.index
+ docs: |
+ Returns the index of this item within the result set.
+ - name: attr
+ syntax: item.attr(expression)
+ docs: |
+ Returns the attribute value from the query expression.
+ - name: set_attr
+ syntax: item.set_attr(expression, value)
+ docs: |
+ Sets the value of the attribute.
+ - name: delete_attr
+ syntax: item.delete_attr(expression)
+ docs: |
+ Delete the attribute.
\ No newline at end of file
diff --git a/_site/data/scriptmods/resultset.yaml b/_site/data/scriptmods/resultset.yaml
new file mode 100644
index 0000000..a839e58
--- /dev/null
+++ b/_site/data/scriptmods/resultset.yaml
@@ -0,0 +1,20 @@
+module: resultset
+type: type
+docs: |
+ Holds a collection of items returned from a query, or presented to a user.
+
+ A specific item of a result-set can be retrived using the subscript option. For example, `result[21]` will
+ return the 21st item of the result-set from the first item. A negative index can be used to retrieve an
+ item from the last item.
+
+ There is no guarantee to the ordering of items within the result-set, although items are usually
+ ordered based on the partition and sort key.
+symbols:
+ - name: length
+ syntax: resultset.length
+ docs: |
+ Returns the number of items within the result set.
+ - name: table
+ syntax: resultset.table
+ docs: |
+ Returns information about the table this result set belongs to.
\ No newline at end of file
diff --git a/_site/data/scriptmods/session.yaml b/_site/data/scriptmods/session.yaml
new file mode 100644
index 0000000..6ce7231
--- /dev/null
+++ b/_site/data/scriptmods/session.yaml
@@ -0,0 +1,52 @@
+module: session
+docs: |
+ Provides access to the currently viewed table and result-set.
+symbols:
+ - name: query
+ syntax: session.query(expression, [options])
+ docs: |
+ Executes a query against a DynamoDB table. This returns a resultset if the query was successful.
+ A query with no results will be an empty result-set.
+
+ The _expression_ is the query expression to execute. This is similar to the type of expressions entered
+ after pression ?.
+
+ The _options_ map can contain the following key/value pairs:
+
+ - `table`: the DynamoDB table to execute the query against. Default is the currently displayed table.
+ - `args`: A map containing names and values that can be used as placeholders in the query expression.
+ example: |
+ out := session.query("pk = $key", {
+ table: "some-table",
+ args: {
+ key: "my partition key"
+ }
+ }
+ session.set_result_set(out.unwrap())
+ - name: current_table
+ syntax: session.current_table()
+ docs: |
+ Returns information about the currently displayed table. This will be returned as a `table` object. If no
+ table is displayed, this function will return `nil`.
+ - name: resultset
+ syntax: session.resultset
+ docs: |
+ Returns the currently displayed result set. This is the set of items that are shown to the user in the items
+ table. This will be returned as a `resultset` object.
+
+ Note that this only contains the items of the current result set that exists in memory. As such, it will be
+ capped to the configured query limit.
+ - name: selected_item
+ syntax: session.selected_item()
+ docs: |
+ Returns the item currently highlighted in the items table. This will be returned as an `item` object. If no
+ item is highlighted, it will return `nil`.
+ - name: set_result_set
+ syntax: session.set_result_set(new_result_set)
+ docs: |
+ Replaces the currently displayed result-set with a new one. This can be used alongside the `query` function
+ to display the results of a query.
+
+ Changing the displayed result-set will trigger a redraw of the viewport and will push a new history record to
+ the backstack. Therefore, it's not recommended to call this method too often during a script execution session.
+ At most once with the final result-set you'd like to show the user is considered best practice.
\ No newline at end of file
diff --git a/_site/data/scriptmods/table.yaml b/_site/data/scriptmods/table.yaml
new file mode 100644
index 0000000..6ddb589
--- /dev/null
+++ b/_site/data/scriptmods/table.yaml
@@ -0,0 +1,20 @@
+module: table
+type: type
+docs: |
+ Provides information about a DynamoDB table.
+symbols:
+ - name: name
+ syntax: table.name
+ docs: |
+ Returns the name of the table.
+ - name: keys
+ syntax: table.keys
+ docs: |
+ Returns the keys of the table. This will be returned as a map with the following names:
+
+ - `hash`: the attribute name of the partition (hash) key
+ - `range`: the attribute name of the sort (range) key, or `nil` if one is not defined.
+ - name: gsis
+ syntax: table.gsis
+ docs: |
+ Returns a list of the GSIs used by this table. The elements of the list will have the type table_index
\ No newline at end of file
diff --git a/_site/data/scriptmods/table_index.yaml b/_site/data/scriptmods/table_index.yaml
new file mode 100644
index 0000000..d31883b
--- /dev/null
+++ b/_site/data/scriptmods/table_index.yaml
@@ -0,0 +1,16 @@
+module: table_index
+type: type
+docs: |
+ Provides information about an DynamoDB index.
+symbols:
+ - name: name
+ syntax: table_index.name
+ docs: |
+ Returns the name of the index.
+ - name: keys
+ syntax: table_index.keys
+ docs: |
+ Returns the keys of the index. This will be returned as a map with the following names:
+
+ - `hash`: the attribute name of the partition (hash) key
+ - `range`: the attribute name of the sort (range) key, or `nil` if one is not defined.
\ No newline at end of file
diff --git a/_site/data/scriptmods/ui.yaml b/_site/data/scriptmods/ui.yaml
new file mode 100644
index 0000000..04723c5
--- /dev/null
+++ b/_site/data/scriptmods/ui.yaml
@@ -0,0 +1,18 @@
+module: ui
+docs: |
+ Provides control over the user interface.
+symbols:
+ - name: print
+ syntax: ui.print(args...)
+ docs: |
+ Displays a message in the status bar.
+ - name: prompt
+ syntax: ui.prompt(message)
+ docs: |
+ Request a line of input from the user, using _message_ as the prompt.
+
+ This function will return the user's input as a string, or `nil` if the user cancels
+ the prompt by pressing Esc
+ example: |
+ line := ui.prompt("What is your name? ")
+ ui.print("Hello, ", line)
\ No newline at end of file
diff --git a/_site/images/fields-popup.png b/_site/images/fields-popup.png
new file mode 100644
index 0000000..59c456c
Binary files /dev/null and b/_site/images/fields-popup.png differ
diff --git a/_site/images/filter-items.png b/_site/images/filter-items.png
new file mode 100644
index 0000000..2ae54bc
Binary files /dev/null and b/_site/images/filter-items.png differ
diff --git a/_site/images/main-item-view.png b/_site/images/main-item-view.png
new file mode 100644
index 0000000..f5491c6
Binary files /dev/null and b/_site/images/main-item-view.png differ
diff --git a/_site/images/modified-items.png b/_site/images/modified-items.png
new file mode 100644
index 0000000..97a361a
Binary files /dev/null and b/_site/images/modified-items.png differ
diff --git a/_site/images/query-items.png b/_site/images/query-items.png
new file mode 100644
index 0000000..8c7613e
Binary files /dev/null and b/_site/images/query-items.png differ
diff --git a/_site/images/table-selection.png b/_site/images/table-selection.png
new file mode 100644
index 0000000..c5fd69b
Binary files /dev/null and b/_site/images/table-selection.png differ
diff --git a/_site/layouts/partials/docs/inject/body.html b/_site/layouts/partials/docs/inject/body.html
new file mode 100644
index 0000000..7fdd1a6
--- /dev/null
+++ b/_site/layouts/partials/docs/inject/body.html
@@ -0,0 +1,3 @@
+{{- $options := dict "targetPath" "js/bundle.js" -}}
+{{- $jsBundle := resources.Get "js/index.js" | js.Build $options | resources.Minify | fingerprint -}}
+
diff --git a/_site/layouts/partials/docs/inject/head.html b/_site/layouts/partials/docs/inject/head.html
new file mode 100644
index 0000000..cb5f941
--- /dev/null
+++ b/_site/layouts/partials/docs/inject/head.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/_site/layouts/script-api/single.html b/_site/layouts/script-api/single.html
new file mode 100644
index 0000000..bb72968
--- /dev/null
+++ b/_site/layouts/script-api/single.html
@@ -0,0 +1,62 @@
+{{ define "main" }}
+
+ {{ partial "docs/post-meta" . }}
+ {{- .Content -}}
+
+
+ {{ range sort $.Site.Data.scriptmods }}
+
+ {{ if eq .type "type" }}
+