> For the complete documentation index, see [llms.txt](https://silika-studio.gitbook.io/opal/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://silika-studio.gitbook.io/opal/overview.md).

# Overview

Opal is a dynamic NFT (dNFT) management platform that emphasizes data transparency and NFT metadata access control. In Opal, users can manage their assets, generate and curate artwork, interface with decentralized storage protocols like [IPFS](https://ipfs.tech/) for asset and token storage, and deploy NFT contracts to the blockchain.&#x20;

Opal fosters the development of dNFT collections through integration with the [Tableland](https://tableland.xyz/) protocol. Tableland is "a permissionless relational database for web3 natives" that allows for rich, composable, and transparent metadata storage and querying. The tables created in Tableland are similar to those found in traditional relational databases. This frees up dNFT collection owners from having to create opaque, centralized processes for managing token updates.&#x20;

An example non-Tableland workflow is shown in Figure 1 using IPFS. In this example, each time a token is updated, the old metadata must be invalidated. Thus, a typical action a developer could take is to unpin the existing metadata, update the metadata locally, pin the new data, and update the `tokenURI()` function on the smart contract to point to the new IPFS content identifier (CID).

<figure><img src="/files/lrsM1z8adaavjzXSluvP" alt=""><figcaption><p>Figure 1: Standard Developer Workflow with IPFS</p></figcaption></figure>

In contrast, updating the metadata via Tableland is as simple as adding, removing, or mutating a table's row. In Opal, this is abstracted even further away. A user can simply update their metadata with the click of a button and the changes are reflected in Tableland and on-chain.

More information can be found in an [article](https://mirror.xyz/0xCBfed85F14337D02f2b78D42ab546712473b2AD6/qz6SpAKcDqIi0tnT_fNTTIMaXYk7cOS-4OCvK6i4mes) we wrote as a retrospective to the hackathon during which we first developed the concept that eventually became Opal.

## Tableland Usage

There are two types of tables that Opal leverages: global and user-specific.&#x20;

### Global Tables

A global table is a singleton instance created before Opal deployment. There are two global tables on the Opal platform:

* `Collections`
* `Users`

For example, when a user creates an account on Opal, a new row is inserted into the `Users` table. Similarly, whenever a user creates a new collection, a new row is inserted into the `Collections` table.

### User-specific Tables

Along with the updated `Collections` table, once a user creates a collection in Opal, there are an additional three tables created specific to the user:

* `Layers`
* `Attributes`
* `Tokens`

There are thus *n* user-specific tables, where *n* is the number of rows in the `Collections` table.

These objects are expanded upon further in the [Objects](/opal/objects/collections.md) section.
