Blog & News

How to create, manage, and publish blog posts and news articles in CareNova — covering both the dashboard editor and the public-facing blog.

Written By Dev010

Last updated 19 days ago

CareNova includes a built-in blog system that lets your clinic publish articles, news, and health tips directly on the public-facing website. The blog has two parts — a dashboard editor where staff create and manage posts, and a public blog page where visitors read them.

Admin and Doctor roles can access the Blog module in the dashboard. Receptionist and Nurse accounts do not have access to blog management.

Accessing the Module

Sidebar → Blog / News

Direct URL:

https://yourdomain.com/dashboard/blog

The public blog is accessible to all visitors at:

https://yourdomain.com/blog
https://yourdomain.com/blog/[post-slug]

Dashboard Blog List

The blog dashboard lists all posts — both published and unpublished — in a table with the following columns:

Column

Description

Title

Post title with slug shown below

Category

Assigned blog category

Author

Staff member who created the post

Status

Published or Draft

Published At

Date the post was published

Actions

Edit or delete the post

Use the search bar to filter posts by title. Posts are ordered by creation date, newest first.

Creating a Post

Click New Post to open the post editor. Fill in the following fields:

Required:

Field

Description

Title

Post headline — displayed on the blog index and detail page

Content

Full post body — supports rich text

Optional:

Field

Description

Slug

URL-friendly identifier — auto-generated from title if left blank

Excerpt

Short summary shown on the blog index page below the title

Cover Image

Hero image displayed at the top of the post

Category

Blog category to group the post

Author

Defaults to the logged-in user — can be overridden with a custom author name

Custom Author Name

Free text — overrides the linked author when set

Tags

Comma-separated tags for the post

Published

Toggle — controls whether the post is live on the public blog

Published At

Date the post is attributed as published

Reading Time

Estimated reading time in minutes

Comments Enabled

Toggle — allow or disable visitor comments on this post

SEO Title

Custom title for search engines — overrides the post title in meta tags

SEO Description

Custom description for search engines

After filling in the fields, click Save to create the post.

A post is only visible on the public blog when Published is toggled on. Leaving it off saves the post as a draft — visible in the dashboard but not on the public site.

Editing and Deleting Posts

Click the Edit action on any post in the list to open the editor with existing values pre-filled. Make changes and click Save to update the post.

Click Delete to permanently remove a post. Deletion also removes all associated comments for that post via cascade delete.

Blog Categories

Categories group related posts and appear as filters on the public blog index page.

Sidebar → Blog / News → Categories

Direct URL:

https://yourdomain.com/dashboard/blog/categories

Creating a category requires:

Field

Description

Name

Category label (e.g. Dental Tips, News, Health)

Description

Optional — short description of the category

Color

Optional — color used to display the category badge

Categories are assigned to posts when creating or editing. A post can belong to one category. Deleting a category sets the category_id to null on all associated posts — posts are not deleted.

Comments

When Comments Enabled is toggled on for a post, a comment form appears at the bottom of the public post page for visitors to submit their name, email, and comment.

Comments require approval before they appear publicly. Submitted comments have approved = false by default. To approve or manage comments, query the blog_comments table directly in Supabase:

-- View all pending comments
SELECT bc.name, bc.email, 
       bc.content, bc.created_at,
       bp.title as post_title
FROM blog_comments bc
JOIN blog_posts bp ON bc.post_id = bp.id
WHERE bc.approved = false
ORDER BY bc.created_at DESC;

-- Approve a comment
UPDATE blog_comments
SET approved = true
WHERE id = 'paste-comment-uuid-here';

-- Delete a comment
DELETE FROM blog_comments
WHERE id = 'paste-comment-uuid-here';

Comment moderation from the dashboard UI is not currently available — use Supabase Table Editor or the SQL queries above to manage submitted comments.

Slugs and URLs

Each post has a unique slug that forms its public URL:

https://yourdomain.com/blog/[slug]

If a slug is not manually entered, CareNova auto-generates one from the post title. Slugs must be unique across all posts — saving a post with a duplicate slug will return an error.

Avoid changing a post's slug after it has been published. Changing it breaks any existing links or bookmarks to the post and affects its search engine ranking.

Public Blog

The public blog is visible to all visitors without requiring login.

The blog index page at /blog displays a list of all published posts with title, cover image, excerpt, category badge, author, and published date.

The post detail page at /blog/[slug] displays the full post content including cover image, reading time, tags, and the comments section if enabled.

The public blog automatically reflects the clinic's active theme and branding — colors, fonts, and layout adapt to the configured clinic type (dental, ophthalmology, general).

Database Schema Reference

blog_categories

Column

Type

Description

id

uuid

Unique category ID

name

text

Category name

description

text

Optional description

color

text

Badge color

created_at

timestamptz

Creation timestamp

updated_at

timestamptz

Last updated timestamp

blog_posts

Column

Type

Description

id

uuid

Unique post ID

title

text

Post headline

slug

text

Unique URL identifier

excerpt

text

Short summary for index page

content

text

Full post body

cover_image

text

URL to cover image

author_id

uuid

FK → users (set null on delete)

custom_author_name

text

Overrides linked author name

category_id

uuid

FK → blog_categories (set null on delete)

published

boolean

true = live on public blog

published_at

timestamptz

Attribution date

tags

text

Comma-separated tags

seo_title

text

Search engine title override

seo_description

text

Search engine description

reading_time

integer

Estimated minutes to read

comments_enabled

boolean

Allow visitor comments

created_at

timestamptz

Creation timestamp

updated_at

timestamptz

Last updated timestamp

blog_comments

Column

Type

Description

id

uuid

Unique comment ID

post_id

uuid

FK → blog_posts (cascade delete)

name

text

Commenter name

email

text

Commenter email (not displayed publicly)

content

text

Comment body

approved

boolean

false = pending, true = visible

created_at

timestamptz

Submission timestamp

Workflow Examples

Publishing a new health tips article:

  1. Sidebar → Blog / News → New Post

  2. Enter title and full content

  3. Add excerpt (2–3 sentence summary)

  4. Upload a cover image

  5. Assign a category (e.g. Health Tips)

  6. Toggle Published on

  7. Set Published At to today's date

  8. Save — post is immediately live at /blog/[slug]

Saving a post as a draft before it is ready:

  1. Sidebar → Blog / News → New Post

  2. Fill in title and content

  3. Leave Published toggled off

  4. Save — post appears in dashboard list but is not visible on the public blog

Publishing the draft later:

  1. Sidebar → Blog / News

  2. Click Edit on the draft post

  3. Toggle Published on

  4. Set Published At date

  5. Save — post goes live immediately

Creating a new category:

  1. Sidebar → Blog / News → Categories

  2. Click Add Category

  3. Enter name, optional description, optional color

  4. Save — category is available when creating or editing posts

Troubleshooting

Post not appearing on the public blog:

  • Confirm Published is toggled on

  • Confirm the post is saved — check Supabase → Table Editor → blog_posts and verify published = true

  • Hard refresh the public blog page

  • Confirm there are no slug conflicts with another post

Slug conflict error on save:

  • Each slug must be unique across all posts

  • Manually enter a different slug or slightly modify the title before saving

Cover image not displaying:

  • Confirm the image URL is publicly accessible — paste it directly in the browser to verify

  • If uploading to Supabase Storage, confirm the bucket is set to Public

Comments not appearing after visitor submission:

  • Comments default to approved = false — they must be approved manually

  • Use the SQL query in the Comments section above to approve pending submissions

Blog module not visible in sidebar:

  • Confirm you are logged in as Admin or Doctor

  • Receptionist and Nurse roles do not have access to Blog management