LiveWe're live on Product Hunt! Introducing Team Agents: your CMS just joined the conversation.

Follow the steps below to get started with Cosmic to power content for your Bun application.

Create folder and install Bun and React Dom

mkdir cosmic-bun
cd cosmic-bun
npm init
npm i bun -g
npm i react-dom

Install the Cosmic JavaScript SDK

Install the Cosmic JavaScript SDK in the location of the codebase.

npm i @cosmicjs/sdk

Add an Object type in the Cosmic dashboard

Log in to the Cosmic dashboard and create a new Blog Posts Object type in a new or existing Project with the following metafields:

  1. Image: Image type with key image
  2. Content: Rich text with key content

Blog model

Add content

Add a few blog posts to get some content ready to be delivered.

Create a new file index.tsx and add the following:

// index.tsx
import { renderToReadableStream } from 'react-dom/server';
import { createBucketClient } from '@cosmicjs/sdk';

const cosmic = createBucketClient({
  bucketSlug: process.env.BUCKET_SLUG || '',
  readKey: process.env.BUCKET_READ_KEY || '',
});

type PostType = {
  title: string,
  metadata: { image: { imgix_url: string }, content: string },
};

function Home({ posts }: { posts: PostType[] }) {
  return (
    <>
      {posts?.map((post: PostType) => {
        return (
          <div key={post.title}>
            <div>{post.title}</div>
            <div>
              <img
                src={`${post.metadata.image.imgix_url}?w=500&auto=format,compression`}
                alt={post.title}
              />
            </div>
            <div dangerouslySetInnerHTML={{ __html: post.metadata.content }} />
          </div>
        );
      })}
    </>
  );
}

const server = Bun.serve({
  port: 3000,
  async fetch(req) {
    const { objects: posts } = await cosmic.objects
      .find({
        type: 'blog-posts',
      })
      .props('title,metadata.image,metadata.content');
    const stream = await renderToReadableStream(<Home posts={posts} />);
    return new Response(stream, {
      headers: { 'Content-Type': 'text/html' },
    });
  },
});

console.log(`Listening on ${server.url}`);

Add your Cosmic API keys

In a new file titled .env.local add the following environment variables and make sure to switch out the values with your Cosmic API keys found in Project / API keys.

# .env.local
BUCKET_SLUG=add_your_bucket_slug_here
BUCKET_READ_KEY=add_your_bucket_read_key_here

Start the app

Start your app with the following command, go to http://localhost:3000, and see your blog posts. Note: we are using bun which enables environment variable reading without a separate package and the ability to use ES6 imports.

bun index.tsx