AssetMinder LogoAssetMinder

Overview

Complete guide to AssetMinder - the modern asset management platform

Introduction

AssetMinder is a modern asset management platform designed for speed, clarity, and flexibility. It's built for modern development workflows, supporting structured operations, asset tracking, and everything in between.

Key features include:

  • Type-safe content models with automatic validation
  • GraphQL and REST APIs for flexible data access
  • Real-time collaborative editing for content teams
  • Multi-environment deployments and role-based permissions

Quick Example

Here's how easy it is to get started with AssetMinder:

lib/simplasset.ts
import { createClient } from '@simplasset/api-client';

export const simplAsset = createClient({
  projectId: process.env.SIMPLASSET_PROJECT_ID,
  apiKey: process.env.SIMPLASSET_API_KEY,
});

// Fetch content
export async function getBlogPosts() {
  return await simplAsset.content.findMany({
    model: 'blogPost',
    include: ['author', 'categories'],
  });
}

Core Components

AssetMinder has several core parts:

AssetMinder Core

The data and API layer: models, validation, database handling, and schema generation. This is the foundation of your AssetMinder setup, handling all the backend operations and data management.

AssetMinder Studio

A lightweight admin UI for managing assets with live preview and model editing. The visual interface where asset managers and operators can manage your assets efficiently with real-time previews.

AssetMinder Models

Define fields, relationships, validation rules, and access settings. The heart of your asset structure. This is where you define how your assets are structured, what fields they contain, and how different asset types relate to each other.

AssetMinder CLI

A command-line interface to scaffold asset models, sync schema changes, run local servers, and deploy. Ideal for developers who prefer automation over Git-based workflows. The CLI provides powerful tools for managing your AssetMinder setup programmatically.

Installation

Configure Your Setup Follow the prompts to choose your database

(PostgreSQL, SQLite, etc.), generate models, and launch the admin panel.

Launch Your Platform Once installation completes, start your development

server: bash cd your-project-name npm run dev Your AssetMinder admin panel will be available at http://localhost:3000/admin

First-Time Setup

Once you've installed AssetMinder, you'll be guided through the initial configuration process to set up your asset models and database connection.

The setup wizard will walk you through: - Connecting to your chosen database - Defining your first content models - Setting up user permissions - Configuring the admin panel

Framework Integration

AssetMinder works seamlessly with your favorite frameworks:

app/blog/page.tsx
import { simplAsset } from '@/lib/simplasset';

export default async function BlogPage() {
  const posts = await simplAsset.content.findMany({
    model: 'blogPost',
    orderBy: { publishedAt: 'desc' }
  });

  return (
    <div>
      {posts.map(post => (
        <article key={post.id}>
          <h2>{post.title}</h2>
          <p>{post.excerpt}</p>
        </article>
      ))}
    </div>
  );
}
pages/blog.vue
<template>
  <div>
    <article v-for="post in posts" :key="post.id">
      <h2>{{ post.title }}</h2>
      <p>{{ post.excerpt }}</p>
    </article>
  </div>
</template>

<script setup>
const { $simplAsset } = useNuxtApp();

const { data: posts } = await $simplAsset.content.findMany({
  model: 'blogPost',
  orderBy: { publishedAt: 'desc' }
});
</script>
src/routes/blog/+page.svelte
<script>
  export let data;
</script>

<div>
  {#each data.posts as post}
    <article>
      <h2>{post.title}</h2>
      <p>{post.excerpt}</p>
    </article>
  {/each}
</div>
src/routes/blog/+page.server.ts
import { simplAsset } from '$lib/simplasset';

export async function load() {
  const posts = await simplAsset.content.findMany({
    model: 'blogPost',
    orderBy: { publishedAt: 'desc' }
  });
  
  return { posts };
}
src/pages/blog.astro
---
import { simplAsset } from '../lib/simplasset';

const posts = await simplAsset.content.findMany({
  model: 'blogPost',
  orderBy: { publishedAt: 'desc' }
});
---

<div>
  {posts.map(post => (
    <article>
      <h2>{post.title}</h2>
      <p>{post.excerpt}</p>
    </article>
  ))}
</div>
components/BlogList.tsx
import { useEffect, useState } from 'react';
import { simplAsset } from '../lib/simplasset';

export function BlogList() {
  const [posts, setPosts] = useState([]);

  useEffect(() => {
    simplAsset.content.findMany({
      model: 'blogPost',
      orderBy: { publishedAt: 'desc' }
    }).then(setPosts);
  }, []);

  return (
    <div>
      {posts.map(post => (
        <article key={post.id}>
          <h2>{post.title}</h2>
          <p>{post.excerpt}</p>
        </article>
      ))}
    </div>
  );
}

Content Models

Define your content structure with TypeScript-like syntax:

models/blog-post.ts
export const BlogPost = {
  title: { type: 'string', required: true },
  slug: { type: 'slug', from: 'title' },
  excerpt: { type: 'text', maxLength: 200 },
  content: { type: 'richText' },
  author: { type: 'reference', to: 'Author' },
  categories: { type: 'reference', to: 'Category', many: true },
  publishedAt: { type: 'datetime' },
  featured: { type: 'boolean', default: false },
};

Creating Content

Use the API to create and manage content programmatically:

lib/content.ts
// Create a new blog post
export async function createBlogPost(data) {
  return await simplAsset.content.create({
    model: 'blogPost',
    data: {
      title: data.title,
      slug: data.slug,
      content: data.content,
      author: { connect: { id: data.authorId } },
      publishedAt: new Date(),
    },
  });
}

// Query with filters
export async function getFeaturedPosts() {
  return await simplAsset.content.findMany({
    model: 'blogPost',
    where: { featured: true },
    include: ['author'],
    take: 5,
  });
}

GraphQL API

Access your content using GraphQL:

queries/blog.graphql
query GetBlogPosts($limit: Int = 10) {
  blogPosts(limit: $limit, orderBy: { publishedAt: DESC }) {
    id
    title
    slug
    excerpt
    publishedAt
    author {
      name
      avatar
    }
    categories {
      name
      slug
    }
  }
}

Production Ready: Configure environment variables, database backups, and HTTPS before deploying.

import Script from "next/script";