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

Firestore Only

Currently, NOMLViewer supports only Google Cloud Firestore. Support for other NoSQL databases (MongoDB, DynamoDB, etc.) is planned for future releases.

Lenient Parsing

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: serverTimestamp

3Add 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: true

4Use 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 post

5Visualize

Paste your NOML schema into the viewer or drag & drop your YAML file to see the visualization.

YAML Schema Reference

Root Structure

FieldRequiredDescription
versionYesNOML version (e.g., "0.1")
databaseYesDatabase type (currently only "firestore")
metadataNoProject metadata (name, description, author)
enumsNoReusable enum definitions
collectionsYesCollection definitions

Enum Definition

FieldRequiredDescription
descriptionNoEnum description
valuesYesArray 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: user

Collection Definition

FieldRequiredDescription
descriptionNoCollection description
pathNoFirestore path pattern (e.g., "users/{userId}")
keysNoKey definitions (primary, foreign, unique, compositeUnique)
fieldsYesField definitions
subcollectionsNoNested subcollection definitions
indexesNoComposite index definitions (name, description, fields, order)
securityNoSecurity rules (read, create, update, delete)

Field Definition

FieldRequiredDescription
typeYesField type (Firestore types or enum name)
descriptionNoField description
requiredNoWhether field is required (default: false)
nullableNoWhether field can be null (distinguishes from optional)
defaultNoDefault value
exampleNoExample value for documentation
sourceNoValue source (e.g., "documentId")
immutableNoField cannot be updated after creation
autoUpdateNoAuto-update on each write (for updatedAt)
validationNoValidation rules (min, max, minLength, maxLength, format, pattern)
denormalizedFromNoSource of denormalized data (collection.field)
targetFor referenceTarget collection name for reference type
itemsFor arrayArray item type definition (type)

Validation Rules

Both "validation" and "constraints" keys are supported for backwards compatibility.

FieldDescription
min / maxNumber constraints (min/max value)
minLength / maxLengthString length constraints
minItems / maxItemsArray item count constraints
formatCommon formats: email, url, uuid
patternRegex pattern for validation
enumInline 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: draft

Firestore Field Types

TypeDescription
stringText data
numberInteger or float
booleanTrue or false
timestampDate and time
geopointGeographic coordinates
referenceDocument reference
arrayArray of values
mapNested object

Special Default Values

ValueDescription
serverTimestampAuto-generated server timestamp
autoIdAuto-generated document ID

Ready to start?

Go to the viewer and try with the sample schema or your own NOML file.

Open Viewer