{item.description}
+string | (required) | The action name, for example, `site_read`, `package_show`… |
+| `payload` | object | (required) | The payload being sent to CKAN. When a payload is provided to a GET request, it will be converted to URL parameters and each key will be converted to snake case. |
+| `useHttpGet` | object | false | Optional, if `True` will make `GET` request, otherwise `POST`. |
+
+>[!note]The JavaScript implementation uses the CKAN dataset and resource formats (rather than Frictionless formats).
+In other words, to stick to Frictionless formats, you need to convert from Frictionless to CKAN before calling `action` , and from CKAN to Frictionless after calling `action`.
+
+## Metadata reference
+
+>[!info]Your site may have custom metadata that differs from the example set below.
+
+
+### Profile
+
+**(`string`)** Defaults to _data-resource_.
+
+The profile of this descriptor.
+
+Every Package and Resource descriptor has a profile. The default profile, if none is declared, is `data-package` for Package and `data-resource` for Resource.
+
+#### Examples
+
+- `{"profile":"tabular-data-package"}`
+
+- `{"profile":"http://example.com/my-profiles-json-schema.json"}`
+
+### Name
+
+**(`string`)**
+
+An identifier string. Lower case characters with `.`, `_`, `-` and `/` are allowed.
+
+This is ideally a url-usable and human-readable name. Name `SHOULD` be invariant, meaning it `SHOULD NOT` change when its parent descriptor is updated.
+
+#### Example
+
+- `{"name":"my-nice-name"}`
+
+### Path
+
+A reference to the data for this resource, as either a path as a string, or an array of paths as strings. of valid URIs.
+
+The dereferenced value of each referenced data source in `path` `MUST` be commensurate with a native, dereferenced representation of the data the resource describes. For example, in a *Tabular* Data Resource, this means that the dereferenced value of `path` `MUST` be an array.
+
+#### Validation
+
+##### It must satisfy one of these conditions
+
+###### Path
+
+**(`string`)**
+
+A fully qualified URL, or a POSIX file path..
+
+Implementations need to negotiate the type of path provided, and dereference the data accordingly.
+
+**Examples**
+
+- `{"path":"file.csv"}`
+
+- `{"path":"http://example.com/file.csv"}`
+
+**(`array`)**
+
+**Examples**
+
+- `["file.csv"]`
+
+- `["http://example.com/file.csv"]`
+
+#### Examples
+
+- `{"path":["file.csv","file2.csv"]}`
+
+- `{"path":["http://example.com/file.csv","http://example.com/file2.csv"]}`
+
+- `{"path":"http://example.com/file.csv"}`
+
+### Data
+
+Inline data for this resource.
+
+### Schema
+
+**(`object`)**
+
+A schema for this resource.
+
+### Title
+
+**(`string`)**
+
+A human-readable title.
+
+#### Example
+
+- `{"title":"My Package Title"}`
+
+### Description
+
+**(`string`)**
+
+A text description. Markdown is encouraged.
+
+#### Example
+
+- `{"description":"# My Package description\nAll about my package."}`
+
+### Home Page
+
+**(`string`)**
+
+The home on the web that is related to this data package.
+
+#### Example
+
+- `{"homepage":"http://example.com/"}`
+
+### Sources
+
+**(`array`)**
+
+The raw sources for this resource.
+
+#### Example
+
+- `{"sources":[{"title":"World Bank and OECD","path":"http://data.worldbank.org/indicator/NY.GDP.MKTP.CD"}]}`
+
+### Licenses
+
+**(`array`)**
+
+The license(s) under which the resource is published.
+
+This property is not legally binding and does not guarantee that the package is licensed under the terms defined herein.
+
+#### Example
+
+- `{"licenses":[{"name":"odc-pddl-1.0","path":"http://opendatacommons.org/licenses/pddl/","title":"Open Data Commons Public Domain Dedication and License v1.0"}]}`
+
+### Format
+
+**(`string`)**
+
+The file format of this resource.
+
+`csv`, `xls`, `json` are examples of common formats.
+
+#### Example
+
+- `{"format":"xls"}`
+
+### Media Type
+
+**(`string`)**
+
+The media type of this resource. Can be any valid media type listed with [IANA](https://www.iana.org/assignments/media-types/media-types.xhtml).
+
+#### Example
+
+- `{"mediatype":"text/csv"}`
+
+### Encoding
+
+**(`string`)** Defaults to _utf-8_.
+
+The file encoding of this resource.
+
+#### Example
+
+- `{"encoding":"utf-8"}`
+
+### Bytes
+
+**(`integer`)**
+
+The size of this resource in bytes.
+
+#### Example
+
+- `{"bytes":2082}`
+
+### Hash
+
+**(`string`)**
+
+The MD5 hash of this resource. Indicate other hashing algorithms with the {'{algorithm}'}:{'{hash}'} format.
+
+#### Examples
+
+- `{"hash":"d25c9c77f588f5dc32059d2da1136c02"}`
+
+- `{"hash":"SHA256:5262f12512590031bbcc9a430452bfd75c2791ad6771320bb4b5728bfb78c4d0"}`
+
+## Generating templates
+
+You can use [`jsv`](https://github.com/datopian/jsv) to generate a template script in Python, JavaScript, and R.
+
+To install it:
+
+```
+$ npm install -g git+https://github.com/datopian/jsv.git
+```
+
+### Python
+
+```
+$ jsv data-resource.json --output py
+```
+
+**Output**
+```python
+dataset_metadata = {
+ "profile": "data-resource", # The profile of this descriptor.
+ # [example] "profile": "tabular-data-package"
+ # [example] "profile": "http://example.com/my-profiles-json-schema.json"
+ "name": "my-nice-name", # An identifier string. Lower case characters with `.`, `_`, `-` and `/` are allowed.
+ "path": ["file.csv","file2.csv"], # A reference to the data for this resource, as either a path as a string, or an array of paths as strings. of valid URIs.
+ # [example] "path": ["http://example.com/file.csv","http://example.com/file2.csv"]
+ # [example] "path": "http://example.com/file.csv"
+ "data": None, # Inline data for this resource.
+ "schema": None, # A schema for this resource.
+ "title": "My Package Title", # A human-readable title.
+ "description": "# My Package description\nAll about my package.", # A text description. Markdown is encouraged.
+ "homepage": "http://example.com/", # The home on the web that is related to this data package.
+ "sources": [{"title":"World Bank and OECD","path":"http://data.worldbank.org/indicator/NY.GDP.MKTP.CD"}], # The raw sources for this resource.
+ "licenses": [{"name":"odc-pddl-1.0","path":"http://opendatacommons.org/licenses/pddl/","title":"Open Data Commons Public Domain Dedication and License v1.0"}], # The license(s) under which the resource is published.
+ "format": "xls", # The file format of this resource.
+ "mediatype": "text/csv", # The media type of this resource. Can be any valid media type listed with [IANA](https://www.iana.org/assignments/media-types/media-types.xhtml).
+ "encoding": "utf-8", # The file encoding of this resource.
+ # [example] "encoding": "utf-8"
+ "bytes": 2082, # The size of this resource in bytes.
+ "hash": "d25c9c77f588f5dc32059d2da1136c02", # The MD5 hash of this resource. Indicate other hashing algorithms with the {algorithm}:{hash} format.
+ # [example] "hash": "SHA256:5262f12512590031bbcc9a430452bfd75c2791ad6771320bb4b5728bfb78c4d0"
+}
+```
+
+
+### JavaScript
+
+```
+$ jsv data-resource.json --output js
+```
+
+**Output**
+```javascript
+const datasetMetadata = {
+ // The profile of this descriptor.
+ profile: "data-resource",
+ // [example] profile: "tabular-data-package"
+ // [example] profile: "http://example.com/my-profiles-json-schema.json"
+ // An identifier string. Lower case characters with `.`, `_`, `-` and `/` are allowed.
+ name: "my-nice-name",
+ // A reference to the data for this resource, as either a path as a string, or an array of paths as strings. of valid URIs.
+ path: ["file.csv", "file2.csv"],
+ // [example] path: ["http://example.com/file.csv","http://example.com/file2.csv"]
+ // [example] path: "http://example.com/file.csv"
+ // Inline data for this resource.
+ data: null,
+ // A schema for this resource.
+ schema: null,
+ // A human-readable title.
+ title: "My Package Title",
+ // A text description. Markdown is encouraged.
+ description: "# My Package description\nAll about my package.",
+ // The home on the web that is related to this data package.
+ homepage: "http://example.com/",
+ // The raw sources for this resource.
+ sources: [
+ {
+ title: "World Bank and OECD",
+ path: "http://data.worldbank.org/indicator/NY.GDP.MKTP.CD",
+ },
+ ],
+ // The license(s) under which the resource is published.
+ licenses: [
+ {
+ name: "odc-pddl-1.0",
+ path: "http://opendatacommons.org/licenses/pddl/",
+ title: "Open Data Commons Public Domain Dedication and License v1.0",
+ },
+ ],
+ // The file format of this resource.
+ format: "xls",
+ // The media type of this resource. Can be any valid media type listed with [IANA](https://www.iana.org/assignments/media-types/media-types.xhtml).
+ mediatype: "text/csv",
+ // The file encoding of this resource.
+ encoding: "utf-8",
+ // [example] encoding: "utf-8"
+ // The size of this resource in bytes.
+ bytes: 2082,
+ // The MD5 hash of this resource. Indicate other hashing algorithms with the {algorithm}:{hash} format.
+ hash: "d25c9c77f588f5dc32059d2da1136c02",
+ // [example] hash: "SHA256:5262f12512590031bbcc9a430452bfd75c2791ad6771320bb4b5728bfb78c4d0"
+};
+```
+
+### R
+
+```
+$ jsv data-resource.json --output r
+```
+
+**Output**
+```r
+# The profile of this descriptor.
+profile <- "data-resource"
+# [example] profile <- "tabular-data-package"
+# [example] profile <- "http://example.com/my-profiles-json-schema.json"
+# An identifier string. Lower case characters with `.`, `_`, `-` and `/` are allowed.
+name <- "my-nice-name"
+# A reference to the data for this resource, as either a path as a string, or an array of paths as strings. of valid URIs.
+path <- ["file.csv","file2.csv"]
+# [example] path <- ["http://example.com/file.csv","http://example.com/file2.csv"]
+# [example] path <- "http://example.com/file.csv"
+# Inline data for this resource.
+data <- NA
+# A schema for this resource.
+schema <- NA
+# A human-readable title.
+title <- "My Package Title"
+# A text description. Markdown is encouraged.
+description <- "# My Package description\nAll about my package."
+# The home on the web that is related to this data package.
+homepage <- "http://example.com/"
+# The raw sources for this resource.
+sources <- [{"title":"World Bank and OECD","path":"http://data.worldbank.org/indicator/NY.GDP.MKTP.CD"}]
+# The license(s) under which the resource is published.
+licenses <- [{"name":"odc-pddl-1.0","path":"http://opendatacommons.org/licenses/pddl/","title":"Open Data Commons Public Domain Dedication and License v1.0"}]
+# The file format of this resource.
+format <- "xls"
+# The media type of this resource. Can be any valid media type listed with [IANA](https://www.iana.org/assignments/media-types/media-types.xhtml).
+mediatype <- "text/csv"
+# The file encoding of this resource.
+encoding <- "utf-8"
+# [example] encoding <- "utf-8"
+# The size of this resource in bytes.
+bytes <- 2082L
+# The MD5 hash of this resource. Indicate other hashing algorithms with the {algorithm}:{hash} format.
+hash <- "d25c9c77f588f5dc32059d2da1136c02"
+# [example] hash <- "SHA256:5262f12512590031bbcc9a430452bfd75c2791ad6771320bb4b5728bfb78c4d0"
+
+```
+
+
+## Design Principles
+
+The client **should** use Frictionless formats by default for describing dataset and resource objects passed to client methods.
+
+In addition, where more than metadata is needed (e.g., we need to access the data stream, or get the schema) we expect the _Dataset_ and _Resource_ objects to follow the [Frictionless Data Lib pattern](https://github.com/frictionlessdata/project/blob/master/rfcs/0004-frictionless-data-lib-pattern.md).
diff --git a/site/content/docs/dms/ckan-enterprise/index.md b/site/content/docs/dms/ckan-enterprise/index.md
new file mode 100644
index 00000000..b44f9d5d
--- /dev/null
+++ b/site/content/docs/dms/ckan-enterprise/index.md
@@ -0,0 +1,108 @@
+# CKAN Enterprise
+
+## Introduction
+
+CKAN Enterprise is our name for what we plan would become our standard "base" distribution for CKAN going forward:
+
+* It is a CKAN standard code base with micro-services.
+* Enterprise grade data catalog and portal targeted at Gov (open data portals) and Enterprise (Data Catalogs +).
+* It is also known as [Datopian DMS](https://www.datopian.com/datopian-dms/).
+
+## Roadmap 2021 and beyond
+
+| | Current | CKAN Enterprise |
+|-------------------|--------------------------------------------------------------------------------------------|-----------------------------------------------------------------|
+| Raw storage | Filestore | Giftless |
+| Data Loader (db) | DataPusher extension | Aircan |
+| Data Storage (db) | Postgres | Any database engine. By default, Postgres |
+| Data API (read) | Built-in DataStore extension's API including SQL endpoint | GraphQL based standalone micro-service |
+| Frontend (public) | Build-in frontend into CKAN Classic python app (some projects are using nodejs app) | PortalJS or nodejs app |
+| Data Explorer | ReclineJS (some projects that uses nodejs app for frontend have React based Data Explorer) | GraphQL based Data Explorer |
+| Auth | Traditional login/password + extendable with CKAN Classic extensions | SSO with default Google, Github, Facebook and Microsoft options |
+| Permissions | CKAN Classic based permissions | Existing permissions exposed via JWT based authz API |
+
+## Timeline 2021
+
+To develop a base distribution of CKAN Enterprise, we want to build a demo project with the features from the roadmap. This way we can:
+
+* understand its advantages/limitations;
+* compare against other instances of CKAN;
+* demonstrate for the potential clients.
+
+High level overview of the planned features with ETA:
+
+| Name | Description | Effort | ETA |
+| ----------------------------- | ------------------------------------ | ------ | --- |
+| [Init](#Init) | Select CKAN version and deploy to DX | xs | Q2 |
+| [Blobstore](#Blobstore) | Integrate Giftless for raw storage | s | Q2 |
+| [Versioning](#Versioning) | Develop/integrate new versioning sys | l | Q3 |
+| [DataLoader](#DataLoader) | Develop/integrate Aircan | xl | Q3 |
+| [Data API](#Data-API) | Integrate new Data API (read) | m | Q2 |
+| [Frontend](#Frontend) | Build a theme using PortalJS | s | Q2 |
+| [DataExplorer](#DataExplorer) | Integrate into PortalJS | s | Q2 |
+| [Permissions](#Permissions) | Develop permissions in read frontend | m | Q4 |
+| [Auth](#Auth) | Integrate | s | Q4 |
+
+### Init
+
+Initialize a new project for development of CKAN Enterprise.
+
+Tasks:
+
+* Boot project in Datopian-DX cluster
+* Use CKAN v2.8.x (latest patch) or 2.9.x
+* Don't setup DataPusher
+* Namespace: `ckan-enterprise`
+* Domain: `enterprise.ckan.datopian.com`
+
+### Blobstore
+
+See [blob storage](/docs/dms/blob-storage#ckan-v3)
+
+### Versioning
+
+See [versioning](/docs/dms/versioning#ckan-v3)
+
+### DataLoader
+
+See [DataLoader](/docs/dms/load)
+
+### Data API
+
+* Install new [Data API service](https://github.com/datopian/data-api) in the project
+* Install Hasura service in the project
+* Set it up to work with DB of CKAN Enterprise
+* Read more about Data API [here](/docs/dms/data-api#read-api-3)
+
+Notes:
+
+* We could experiment and use various features of Hasura, eg:
+ * Setting up row/column limits per user role (permissions)
+ * Subscriptions to auto load new data rows
+
+### Frontend
+
+PortalJS for the read frontend of CKAN Enterprise. [Read more](/docs/dms/frontend/#frontend).
+
+### DataExplorer
+
+A new Data Explorer based on GraphQL API: https://github.com/datopian/data-explorer-graphql
+
+### Permissions
+
+See [permissions](/docs/dms/permissions#permissions-authorization).
+
+### Auth
+
+Next generation, Kratos based, authentication (mostly SSO with no Traditional login by default) with following options out of the box:
+
+* GitHub
+* Google
+* Facebook
+* Microsoft
+
+Easy to add:
+
+* Discord
+* GitLab
+* Slack
diff --git a/site/content/docs/dms/ckan-v3/index.md b/site/content/docs/dms/ckan-v3/index.md
new file mode 100644
index 00000000..d161aa49
--- /dev/null
+++ b/site/content/docs/dms/ckan-v3/index.md
@@ -0,0 +1,365 @@
+# CKAN v3
+
+## Introduction
+
+This document describes the architectures of CKAN v2 ("CKAN Classic"), CKAN v3 (also known as "CKAN Next Gen" for Next Generation), and CKAN v3 hybrid. The latter is an intermediate approach towards v3, where we still use CKAN v2 and common extensions, and only create microservices for new features.
+
+You will also find out how to do common tasks such as theming or testing, in each of the architectures.
+
+*Note: this blog post has an overview of the more decoupled, microservices approach at the core of v3: https://www.datopian.com/2021/05/17/a-more-decoupled-ckan/*
+
+## CKAN v2, CKAN v3 and Why v3
+
+In yellow, you see one single Python process:
+
+```mermaid
+graph TB
+ subgraph ckanclassic["CKAN Classic"]
+ ckancore["Core"]
+ end
+```
+
+When you want to extend core functionality of CKAN v2 (Classic), you write a Python package that must be installed in CKAN. This way, the extension will also run in the same process as the core functionality. This is known as a monolithic architecture.
+
+```mermaid
+graph TB
+ subgraph ckanclassic["CKAN Classic"]
+ ckancore["Core"] --> ckanext["CKAN Extension 1"]
+ end
+```
+
+When you start to add multiple features, through extensions, what you get is one single Python process running many non-related functionalities.
+
+```mermaid
+graph TB
+ subgraph ckanclassic["CKAN Classic"]
+ ckancore["Core"] --> ckanext["CKAN Extension 1"]
+ ckancore --> ckanext2["CKAN Extension 2"]
+ ckancore --> ckanext3["CKAN Extension 3"]
+ ckancore --> ckanext4["CKAN Extension 4"]
+ ckancore --> ckanext5["CKAN Extension 5"]
+ end
+```
+
+This monolithic approach has advantages in terms of simplicity of development and deployment, especially when the system is small. However, as it grows in scale and scope, there are an increasing number of issues.
+
+In this approach, an optional extension has the ability to crash the whole CKAN instance. Every new feature must be written in the same language and framework (e.g. Python, leveraging Flask or Django). And, perhaps most fundamentally, the overall system is highly coupled, making it complex and hard to understand, debug, extend, and evolve.
+
+### Microservices and CKAN v3
+
+The main way to address these problems while gaining extra benefits is to move to a microservices-based architecture.
+
+Thus, we recommend building the next version of CKAN – CKAN v3 – on a microservices approach.
+
+[!tip]CKAN v3 is sometimes also referred to as CKAN Next Gen(eration).
+
+With microservices, each piece of functionality runs in its own service and process.
+
+```mermaid
+graph TB
+ subgraph ckanapi3["CKAN API 3"]
+ ckanapi31["API 3"]
+ end
+
+ subgraph ckanapi2["CKAN API 2"]
+ ckanapi21["API 2"]
+ end
+
+ subgraph ckanapi1["CKAN API 1"]
+ ckanapi11["API 1"]
+ end
+
+ subgraph ckanfrontend["CKAN frontend"]
+ ckanfrontend1["Frontend"]
+ end
+
+ ckanfrontend1 --> ckanapi11
+ ckanfrontend1 --> ckanapi21
+ ckanfrontend1 --> ckanapi31
+```
+
+### Incremental Evolution – Hybrid v3
+
+One of the other advantages of the microservices approach is that it can also be used to extend and evolve current CKAN v2 solutions in an incremental way. We term these kinds of solutions "Hybrid v3," as they are a mix of v2 and v3 together.
+
+For example, a Hybrid v3 data portal could use a new microservice written in Node for the frontend, and combine that with CKAN v2 (with v2 extensions).
+
+```mermaid
+graph TB
+ subgraph ckanapi3["CKAN API 3"]
+ ckanapi31["API 3"]
+ end
+
+ subgraph ckanapi2["CKAN API 2"]
+ ckanapi21["API 2"]
+ end
+
+ subgraph ckanapi1["CKAN API 1"]
+ ckanapi11["API 1"]
+ end
+
+ subgraph ckanfrontend["CKAN frontend"]
+ ckanfrontend1["Frontend"]
+ end
+
+ subgraph ckanclassic["CKAN Classic"]
+ ckancore["Core"] --> ckanext["CKAN Extension 1"]
+ ckancore --> ckanext2["CKAN Extension 2"]
+ end
+
+ ckanfrontend1 --> ckancore
+ ckanfrontend1 --> ckanapi11
+ ckanfrontend1 --> ckanapi21
+ ckanfrontend1 --> ckanapi31
+```
+
+The hybrid approach means we can evolve CKAN v2 "Classic" to CKAN v3 "Next Gen" incrementally. In particular, it allows people to keep using their existing v2 extensions, and upgrade them to new microservices gradually.
+
+### Comparison of Approaches
+
+| | CKAN v2 (Classic) | CKAN v3 (Next Gen) | CKAN v3 Hybrid |
+| ------------ | ------------------| -------------------| ---------------|
+| Architecture | Monolithic | Microservice | Microservice with v2 core |
+| Language | Python | You can write services in any language you like.
+
+The Datastore Query Builder interfaces with the Datastore API to allow users to search data resources using an SQL like interface. See the docs for this module here - [Datastore Query Builder docs](/docs/dms/data-explorer/datastore-query-builder/).
+
+### [Map Builder](https://github.com/datopian/map-builder)
+
+
+
+Map Builder allows users to build maps based on geo-data contained in tabular resources.
+
+Supported geo formats:
+* lon / lat (separate columns)
+
+### [Chart Builder](https://github.com/datopian/chart-builder)
+
+
+
+Chart Builder allows users to create charts and graphs from tabular data.
+
+## Quick-start (Sandbox)
+
+* Clone the data explorer
+```bash
+$ git clone git@gitlab.com:datopian/data-explorer.git
+```
+* Use yarn to install the project dependencies
+```bash
+$ cd data-explorer
+$ yarn
+```
+* To see the Data Explorer running in a sandbox environment run [Cosmos](https://github.com/react-cosmos/react-cosmos)
+```bash
+$ yarn cosmos
+```
+
+## Configuration
+
+[`data-datapackage` attribute](#add-data-explorer-tags-to-the-page-markup) may influence how the element will be displayed. It can be created from a [datapackage descriptor](https://frictionlessdata.io/specs/data-package/).
+
+### Fixtures
+
+Until we have better documentation on Data Explorer settings, use the [Cosmos fixtures](https://gitlab.com/datopian/data-explorer/blob/master/__fixtures__/with_widgets/geojson_simple.js) as an example of how to instantiate / configure the Data Explorer.
+
+### Serialized state
+
+`store->serializedState` is a representation of the application state _without fetched data_
+A data-explorer can be "hydrated" using the serialized state, it will refetch the data, and will render in the same state it was exported in
+
+### Share links
+
+Share links can be added in `datapakage.resources[0].api` attribute.
+
+There is common limit of up 2000 characters on URL strings. Our share links contain the entire application store tree, which is often larger than 2000 characters, in which the application state cannot be shared via URL. Thems the breaks.
+
+## Translations
+
+### Add a Translation To Data Explorer
+
+To add a translation to a new language to the data explorer you need to:
+
+1. clone the repository you need to update
+
+ ```bash
+ git clone git@gitlab.com:datopian/data-explorer.git
+ ```
+2. go to `src/i18n/locales/` folder
+3. add a new sub-folder with locale name and the new language json file (e.g. `src/i18n/locales/ru/translation.json`)
+4. add the new file to resources settings in `i18n.js`:
+`src/i18n/i18n.js`:
+```javascript
+import en from './locales/en/translation.json'
+import da from './locales/da/translation.json'
+import ru from './locales/ru/translation.json'
+ ...
+ ru: {
+ translation: {
+ ...require('./locales/ru/translation.json'),
+ ...
+ }
+ },
+ ...
+```
+5. create a merge request with the changes
+
+### Add a translation To a Component
+
+Some strings may come from a component, to add translation for them will require some extra steps, e.g. datapackage-views-js:
+
+1. clone the repository
+ ```bash
+ https://github.com/datopian/datapackage-views-js.git
+ ```
+2. go to `src/i18n/locales/` folder
+3. add a new sub-folder with locale name and the new language json file (e.g. `src/i18n/locales/ru/translation.json`)
+4. add the new file to resources settings in `i18n.js`:
+`src/i18n/i18n.js`:
+```javascript
+...
+import ru from './locales/ru/translation.json'
+ ...
+ resources: {
+ ...
+ ru: {translation: ru},
+ },
+ ...
+```
+5. create a pull request for datapackage-views-js
+6. get the new datapackage-views-js version after merging (e.g. 1.3.0)
+7. clone data-explorer
+8. upgrade the data-explorer's datapackage-views-js dependency with the new version:
+ a. update package.json
+ b. run `yarn install`
+9. add the component's translations path to Data Explorer:
+```javascript
+import en from './locales/en/translation.json'
+import da from './locales/da/translation.json'
+import ru from './locales/ru/translation.json'
+ ...
+ ru: {
+ translation: {
+ ...require('./locales/ru/translation.json'),
+ ...require('datapackage-views-js/src/i18n/locales/ru/translation.json'),
+ }
+ },
+ ...
+```
+10. create a merge request for data-explorer
+
+### Testing a Newly Added Language
+
+To see your language changes in Data Explorer you can run `yarn start` and change the language cookie of the page (`defaultLocale`):
+
+
+
+### Language detection
+
+Language detection rules are determined by `detection` option in `src/i18n/i18n.js` file. Please edit with care, as other projects may already depend on them.
+
+## Embedding in CKAN NG Theme
+
+### Copy bundle files to theme's `public` directory
+
+```bash
+$ cp data-explorer/build/static/js/*.js frontend-v2/themes/your_theme/public/js
+$ cp data-explorer/build/static/js/*.map frontend-v2/themes/your_theme/public/js
+$ cp data-explorer/build/static/css/* frontend-v2/themes/your_theme/public/css
+```
+
+
+#### Note on app bundles
+
+The bundled resources have a hash in the filename, for example `2.a3e71132.chunk.js`
+
+During development it may be preferable to remove the hash from the file name to avoid having to update the script tag during iteration, for example
+
+```bash
+$ mv 2.a3e71132.chunk.js 2.chunk.js
+```
+
+A couple caveats:
+* The `.map` file names should remain the same so that they are loaded properly
+* Browser cache may need to be invalidated manually to ensure that the latest script is loaded
+
+
+### Require Data Explorer resources in NG theme template
+
+In `/themes/your-theme/views/your-template-wth-explplorer.html`
+
+```html
+
+{% block content %}
+
+
+
+
+
+```
+
+### Configure datapackage
+
+```htmlmixed=
+
+