Skip to main content

Overview

The Devarno Ecosystem is a real-world example of integrating organizational data into V01T. It demonstrates:
  • Representing 18 GitHub organizations as NodeData
  • Seeding data from DEVARNO.json
  • Consuming ecosystem metadata via the public API
  • Serving organization data to frontend dashboards

Data Structure

DEVARNO.json

The source data is a JSON file containing all organizations:
{
  "organisations": [
    {
      "name": "sparki-tools",
      "url": "https://github.com/sparki-tools",
      "website": "sparki.tools",
      "description": "Zero-fuss CICD tools for all developers and frameworks",
      "created": "2025-12-23",
      "stack": ["Go", "TypeScript", "Rust"],
      "repo_count": 23,
      "repos": ["web-app", "api-engine", "..."],
      "highlights": ["Full CI/CD platform", "..."],
      "status": "active"
    },
    // ... 17 more organizations
  ]
}

NodeData Model

Each organization is stored as a NodeData record with:
FieldTypeDescription
titlestringOrganization name (e.g., “sparki-tools”)
slugstringURL-safe identifier (e.g., “sparki-tools”)
clusterstringAlways “devarno-orgs” (groups all ecosystem orgs)
raw_dataJSONFull organization data from DEVARNO.json
_metaobjectSystem metadata (external_id, last_synced)
Example:
{
  "title": "sparki-tools",
  "slug": "sparki-tools",
  "cluster": "devarno-orgs",
  "_meta": {
    "external_id": "https://github.com/sparki-tools",
    "last_synced": "2025-03-11T10:00:00Z"
  },
  "raw_data": {
    "name": "sparki-tools",
    "url": "https://github.com/sparki-tools",
    "website": "sparki.tools",
    "description": "Zero-fuss CICD tools for all developers and frameworks",
    "stack": ["Go", "TypeScript", "Rust"],
    "repo_count": 23,
    // ... full org metadata
  }
}

Seeding the Ecosystem

Automatic Seeding

Use the management command to seed all 18 organizations:
python api/manage.py seed_ecosystem
This:
  1. Creates the devarno-ecosystem application (if it doesn’t exist)
  2. Creates a synthetic data source of type node
  3. Parses DEVARNO.json
  4. Creates 18 NodeData records (one per organization)
  5. Stores full org metadata in raw_data

Manual Seeding

You can also register organizations manually via the Django admin at http://localhost:8000/admin.

Custom Path

If DEVARNO.json is at a non-standard location:
python api/manage.py seed_ecosystem --devarno-json-path=/path/to/DEVARNO.json

Dry Run

Validate data without writing to the database:
python api/manage.py seed_ecosystem --dry-run

API Contract

List all organizations

GET /trace/devarno-ecosystem/node/
Response:
{
  "success": true,
  "data": [
    {
      "title": "sparki-tools",
      "slug": "sparki-tools",
      "cluster": "devarno-orgs",
      "_meta": { "external_id": "...", "last_synced": "..." },
      "url": "https://github.com/sparki-tools",
      "website": "sparki.tools",
      "description": "Zero-fuss CICD tools...",
      "stack": ["Go", "TypeScript", "Rust"],
      "repo_count": 23,
      "repos": ["web-app", "api-engine", "..."],
      "highlights": ["Full CI/CD platform", "..."],
      "status": "active"
    },
    // ... 17 more organizations
  ],
  "metadata": {
    "application": "devarno-ecosystem",
    "component_type": "node",
    "total_count": 18,
    "filtered_count": 18,
    "page": 1,
    "page_size": 50,
    "total_pages": 1,
    "has_next": false,
    "has_previous": false
  },
  "timestamp": "2025-03-11T10:00:00Z"
}

Filter by cluster

GET /trace/devarno-ecosystem/node/?cluster=devarno-orgs

Search by title

GET /trace/devarno-ecosystem/node/?search=sparki

Pagination

GET /trace/devarno-ecosystem/node/?page=1&page_size=10

Frontend Integration

Using @v01t/client

import { createV01tClient } from '@v01t/client';

const client = createV01tClient({
  baseUrl: 'http://localhost:8000',
});

// Fetch all ecosystem organizations
const response = await client.getNodes('devarno-ecosystem', {
  page_size: 50,
});

const organizations = response.data.map(node => ({
  name: node.title,
  slug: node.slug,
  url: node.url, // from raw_data
  description: node.description,
  repos: node.repos,
  stack: node.stack,
}));

In Next.js

See devarno-landing integration for a complete example. The dashboard (src/app/dashboard/page.tsx) fetches ecosystem data via:
import { loadDevarnoData } from '@/content/devarno-data-loader';

export default async function DashboardPage() {
  const data = await loadDevarnoData();
  return <Dashboard data={data} />;
}

Data Refresh

Manual Refresh

python api/manage.py seed_ecosystem --skip-existing=false
This updates all existing records and adds any new organizations.

Automated Sync (via n8n)

A scheduled n8n workflow can periodically:
  1. Check for updates to DEVARNO.json
  2. Call the seed command
  3. Notify consumers of changes
See Operations Runbooks for setup.

Cluster Architecture

All ecosystem organizations use a shared cluster: "devarno-orgs". This allows:
  • Querying all organizations with ?cluster=devarno-orgs
  • Grouping related data in consumer applications
  • Future multi-cluster support (e.g., by domain, geography)

Schema

The full organization schema stored in raw_data:
interface Organization {
  name: string;
  url: string;
  website: string;
  description: string;
  created: string; // ISO 8601 date
  stack: string[]; // Technologies (Go, TypeScript, etc.)
  repo_count: number;
  repos: string[]; // Repository names
  highlights: string[]; // Key features/achievements
  status: 'active' | 'archived' | 'planned';
}