Building 🔨 https://usenotioncms.vercel.app ( Notion as a CMS, Next.js websites templates )
My portfolio & code blogs👉🏻 https://www.sujalvanjare.com
- navbar is fully responsive for mobile, with a hamburger menu and side panel view
- footer and navbar social icons & page links are managed via a Notion database
👇🏻check out how the Notion database looks below
#buildinpublic #notion
- navbar is fully responsive for mobile, with a hamburger menu and side panel view
- footer and navbar social icons & page links are managed via a Notion database
👇🏻check out how the Notion database looks below
#buildinpublic #notion
Rate it out of 10👇🏻
#buildinpublic
Rate it out of 10👇🏻
#buildinpublic
will be using these in my Notion + Next.js portfolio + blog template.
#buildinpublic #figma
will be using these in my Notion + Next.js portfolio + blog template.
#buildinpublic #figma
If a page has multiple thumbnails, they’re shown in a carousel.
Also updated link-to-page and mention-a-page previews to show title, description, and thumbnails (with carousel).
#notion #buildinpublic
If a page has multiple thumbnails, they’re shown in a carousel.
Also updated link-to-page and mention-a-page previews to show title, description, and thumbnails (with carousel).
#notion #buildinpublic
- Through the Notion API, I get the embed block and extract the Facebook post URL.
- Facebook has an official way to embed posts using their script, I use that to render the post.
#notion #buildinpublic
- Through the Notion API, I get the embed block and extract the Facebook post URL.
- Facebook has an official way to embed posts using their script, I use that to render the post.
#notion #buildinpublic
- Through the Notion API, I get the embed block and extract the Pinterest post URL.
- Pinterest has an official way to embed pins using their script, I use that to render the post.
#notion #buildinpublic
- Through the Notion API, I get the embed block and extract the Pinterest post URL.
- Pinterest has an official way to embed pins using their script, I use that to render the post.
#notion #buildinpublic
- In a Notion page, we can embed Instagram posts
- Through the Notion API, I get the embed block and extract the Instagram post URL
- Instagram has an official way to do embeds using
and a script, I use that to render the post
#notion #buildinpublic
- In a Notion page, we can embed Instagram posts
- Through the Notion API, I get the embed block and extract the Instagram post URL
- Instagram has an official way to do embeds using
and a script, I use that to render the post
#notion #buildinpublic
✅ With this, I’ve built a fully accurate Notion block renderer that can render any Notion page perfectly in a Next.js site - block by block, pixel by pixel.
Most accurate Notion renderer yet.
#notion #buildinpublic
✅ With this, I’ve built a fully accurate Notion block renderer that can render any Notion page perfectly in a Next.js site - block by block, pixel by pixel.
Most accurate Notion renderer yet.
#notion #buildinpublic
- Previews include links, page mentions, files, images, PDFs, videos, and more.
- Mention text and previews now render exactly like @notion.com, but even better, and fully static in @nextjs.org!
Just one block left ✨
#notion #buildinpublic
- Previews include links, page mentions, files, images, PDFs, videos, and more.
- Mention text and previews now render exactly like @notion.com, but even better, and fully static in @nextjs.org!
Just one block left ✨
#notion #buildinpublic
Moving fast now only 2 block types & inline mention left to fully replicate @notion.com page rendering statically in @nextjs.org
#buildinpublic
Moving fast now only 2 block types & inline mention left to fully replicate @notion.com page rendering statically in @nextjs.org
#buildinpublic
- you can embed official Google Maps embed urls in sites
- but direct Google Maps urls aren’t embeddable they need an API key, which users may not have
- so coded it to embed with or without a key
#buildinpublic
- you can embed official Google Maps embed urls in sites
- but direct Google Maps urls aren’t embeddable they need an API key, which users may not have
- so coded it to embed with or without a key
#buildinpublic
Page properties includes
title, status, slug, path, category, description, thumbnail_url, published_date, authors, reading_time, & SEO fields, etc.
Everything is Queryable & CMS ready✅
#buildinpublic #cms
Page properties includes
title, status, slug, path, category, description, thumbnail_url, published_date, authors, reading_time, & SEO fields, etc.
Everything is Queryable & CMS ready✅
#buildinpublic #cms
- got the @codepen.io url from the @notion.com api
- converted it to /embed/ format
- rendered via iframe with dynamic theme based on site
- codepen embed in dark/light mode
#buildinpublic #nextjs
- got the @codepen.io url from the @notion.com api
- converted it to /embed/ format
- rendered via iframe with dynamic theme based on site
- codepen embed in dark/light mode
#buildinpublic #nextjs
- got the Spotify url from the notion api
- converted to /embed/ format url
- dynamically rendered via iframe with height based on content type (track, album, artist, playlist)
#buildinpublic #notion #nextjs #spotify
- got the Spotify url from the notion api
- converted to /embed/ format url
- dynamically rendered via iframe with height based on content type (track, album, artist, playlist)
#buildinpublic #notion #nextjs #spotify
- got the pdf url from the notion api
- rendered in browser using react-pdf on client side
- for multiple-page pdfs only load first 2 pages, then load more on scroll for better performance like notion
#buildinpublic #notion
- got the pdf url from the notion api
- rendered in browser using react-pdf on client side
- for multiple-page pdfs only load first 2 pages, then load more on scroll for better performance like notion
#buildinpublic #notion
- I got the embedded tweet URL from the Notion API and extracted the post ID from it
- renders completely static on the server
- supports both dark and light themes
- uses react-tweet package
#buildinpublic #nextjs
- I got the embedded tweet URL from the Notion API and extracted the post ID from it
- renders completely static on the server
- supports both dark and light themes
- uses react-tweet package
#buildinpublic #nextjs
- Got the equation expression as a plain string from the Notion API
- Rendered it with KaTeX, styled just like Notion
- Server-side render, no flicker, no layout shift
#buildinpublic #notion #buildinginpublic #cms
- Got the equation expression as a plain string from the Notion API
- Rendered it with KaTeX, styled just like Notion
- Server-side render, no flicker, no layout shift
#buildinpublic #notion #buildinginpublic #cms
- Supports both uploaded and embedded videos like ( YouTube, Vimeo, Dailymotion, Facebook, etc ).
see it here notion-as-a-cms-nextjs-portfolio-blog-template.vercel.app#video-block
#buildinpublic #notion #nextjs
- Supports both uploaded and embedded videos like ( YouTube, Vimeo, Dailymotion, Facebook, etc ).
see it here notion-as-a-cms-nextjs-portfolio-blog-template.vercel.app#video-block
#buildinpublic #notion #nextjs
- Handled uploaded Notion images by saving them locally and optimizing with Next.js
- For external URLs (Unsplash, Cloudinary etc), used
#buildinpublic
- Handled uploaded Notion images by saving them locally and optimizing with Next.js
- For external URLs (Unsplash, Cloudinary etc), used
#buildinpublic
One of the most complex blocks to render is the table of contents.
Here’s how I did it ⬇️
#buildinpublic #buildinginpublic #notion #notioncms #nextjs #tailwindcss
One of the most complex blocks to render is the table of contents.
Here’s how I did it ⬇️
#buildinpublic #buildinginpublic #notion #notioncms #nextjs #tailwindcss
view progress here👉🏻 notion-as-a-cms-nextjs-portfolio-blog-nonex.vercel.app#callout-block
#buildinpublic #buildinginpublic #notion #notioncms #nextjs #tailwindcss
view progress here👉🏻 notion-as-a-cms-nextjs-portfolio-blog-nonex.vercel.app#callout-block
#buildinpublic #buildinginpublic #notion #notioncms #nextjs #tailwindcss
- notion api only gives the url, no metadata
- used Microlink.io to fetch metadata (limit: 50 req/day)
- added a fallback to manually scrape all essential metadata from the bookmark url
#buildinpublic #notion #notionapi
- notion api only gives the url, no metadata
- used Microlink.io to fetch metadata (limit: 50 req/day)
- added a fallback to manually scrape all essential metadata from the bookmark url
#buildinpublic #notion #notionapi
- one of the trickier blocks to implement
- semantic html: thead, tbody, tr, th, proper scope roles
- recreated notion-style horizontal overflow gradient
-fixed column width issue
Detail explain⬇️
#buildinpublic #notion
- one of the trickier blocks to implement
- semantic html: thead, tbody, tr, th, proper scope roles
- recreated notion-style horizontal overflow gradient
-fixed column width issue
Detail explain⬇️
#buildinpublic #notion