NOMLViewer
NoSQL Schema Documentation
What is NOMLViewer?
NOMLViewer is a design document viewer for NoSQL database structures. It transforms YAML-based schema definitions into beautiful, readable documentation.
What is NOML?
NOML stands for NoSQL Modeling Language - a specification for describing NoSQL database schemas. It provides a standardized way to document NoSQL database structures using familiar YAML syntax.
Current Status
Currently, NOMLViewer supports only Google Cloud Firestore. Support for other NoSQL databases (MongoDB, DynamoDB, etc.) is planned for future releases.
NOMLViewer uses lenient parsing. Unknown or undefined parameters will be silently ignored (not rendered, no errors). This allows forward compatibility and custom extensions.
Vision
- Visual Schema Builder: Build schema definitions through an intuitive UI without writing YAML manually, then export to YAML with one click
- Firestore Code Generation: Auto-generate Firestore security rules, composite indexes (firestore.indexes.json), TypeScript type definitions, and seed data scripts from NOML schema
- Multi-database support: MongoDB, DynamoDB, Cassandra, and more
- Export features: Generate documentation in various formats (PDF, HTML)
- Schema validation: Real-time validation rules and security rule generation
- Team collaboration: Share schemas with your team
- VS Code extension: Edit and preview NOML files directly in your editor
How to Use (Firestore)
1Create a NOML file
Create a YAML file with the following basic structure:
version: "0.1" database: firestore metadata: name: My App description: Description of your database schema collections: # Define your collections here
2Define Collections
Add your Firestore collections with their fields:
collections:
users:
description: User accounts
fields:
email:
type: string
required: true
description: User email address
example: "user@example.com"
displayName:
type: string
description: Display name
createdAt:
type: timestamp
default: serverTimestamp3Add Subcollections
Nest subcollections within parent collections:
collections:
users:
fields:
email:
type: string
required: true
subcollections:
settings:
description: User preferences
fields:
theme:
type: string
default: light
notifications:
type: boolean
default: true4Use References
Define relationships between collections using references:
collections:
posts:
description: Blog posts
fields:
title:
type: string
required: true
authorRef:
type: reference
target: users # Reference to users collection
description: Author of the post5Visualize
Paste your NOML schema into the viewer or drag & drop your YAML file to see the visualization.
YAML Schema Reference
Root Structure
| Field | Required | Description |
|---|---|---|
| version | Yes | NOML version (e.g., "0.1") |
| database | Yes | Database type (currently only "firestore") |
| metadata | No | Project metadata (name, description, author) |
| enums | No | Reusable enum definitions |
| collections | Yes | Collection definitions |
Enum Definition
| Field | Required | Description |
|---|---|---|
| description | No | Enum description |
| values | Yes | Array of allowed values |
Use the enum name directly as the field type:
enums:
UserRole:
description: User permission levels
values: [user, admin, moderator]
collections:
users:
fields:
role:
type: UserRole # enum名をtypeに指定
default: userCollection Definition
| Field | Required | Description |
|---|---|---|
| description | No | Collection description |
| path | No | Firestore path pattern (e.g., "users/{userId}") |
| keys | No | Key definitions (primary, foreign, unique, compositeUnique) |
| fields | Yes | Field definitions |
| subcollections | No | Nested subcollection definitions |
| indexes | No | Composite index definitions (name, description, fields, order) |
| security | No | Security rules (read, create, update, delete) |
Field Definition
| Field | Required | Description |
|---|---|---|
| type | Yes | Field type (Firestore types or enum name) |
| description | No | Field description |
| required | No | Whether field is required (default: false) |
| nullable | No | Whether field can be null (distinguishes from optional) |
| default | No | Default value |
| example | No | Example value for documentation |
| source | No | Value source (e.g., "documentId") |
| immutable | No | Field cannot be updated after creation |
| autoUpdate | No | Auto-update on each write (for updatedAt) |
| validation | No | Validation rules (min, max, minLength, maxLength, format, pattern) |
| denormalizedFrom | No | Source of denormalized data (collection.field) |
| target | For reference | Target collection name for reference type |
| items | For array | Array item type definition (type) |
Validation Rules
Both "validation" and "constraints" keys are supported for backwards compatibility.
| Field | Description |
|---|---|
| min / max | Number constraints (min/max value) |
| minLength / maxLength | String length constraints |
| minItems / maxItems | Array item count constraints |
| format | Common formats: email, url, uuid |
| pattern | Regex pattern for validation |
| enum | Inline list of allowed values (use enums definition for reusability) |
Complete Example
version: "1.0"
database: firestore
description: Sample Application Schema
enums:
UserRole:
description: User permission levels
values:
- value: user
label: User
description: Standard user
- value: admin
label: Administrator
- value: moderator
label: Moderator
Status:
values: [draft, published, archived]
transitions:
draft: [published]
published: [archived]
collections:
users:
description: User accounts
path: users/{userId}
keys:
primary: userId
description: Document ID = Firebase Auth UID
unique:
- field: email
enforceBy: firebaseAuth
fields:
userId:
type: string
required: true
source: documentId
description: User ID (Firebase Auth UID)
email:
type: string
required: true
description: Email address
example: "user@example.com"
validation:
format: email
name:
type: string
required: true
description: Display name
validation:
minLength: 1
maxLength: 50
role:
type: UserRole
default: user
description: Permission level
createdAt:
type: timestamp
required: true
immutable: true
description: Account creation date
updatedAt:
type: timestamp
required: true
autoUpdate: true
description: Last update date
subcollections:
settings:
description: User preferences
fields:
theme:
type: string
default: light
notifications:
type: boolean
default: true
indexes:
- name: users_by_role
description: List users by role
fields:
- field: role
order: asc
- field: createdAt
order: desc
posts:
description: Blog posts
path: posts/{postId}
keys:
primary: postId
foreign:
- field: authorId
references: users.userId
onDelete: restrict
fields:
postId:
type: string
required: true
source: documentId
title:
type: string
required: true
validation:
maxLength: 100
authorId:
type: string
required: true
authorName:
type: string
required: true
denormalizedFrom:
collection: users
field: name
key: authorId
status:
type: Status
default: draftFirestore Field Types
| Type | Description |
|---|---|
| string | Text data |
| number | Integer or float |
| boolean | True or false |
| timestamp | Date and time |
| geopoint | Geographic coordinates |
| reference | Document reference |
| array | Array of values |
| map | Nested object |
Special Default Values
| Value | Description |
|---|---|
| serverTimestamp | Auto-generated server timestamp |
| autoId | Auto-generated document ID |
Ready to start?
Go to the viewer and try with the sample schema or your own NOML file.
Open Viewer