You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by xi...@apache.org on 2026/02/06 05:00:47 UTC

(pinot-site) branch new-site-dev updated: Created local images, Scarf, Blog post for 1.4 (#156)

This is an automated email from the ASF dual-hosted git repository.

xiangfu pushed a commit to branch new-site-dev
in repository https://gitbox.apache.org/repos/asf/pinot-site.git


The following commit(s) were added to refs/heads/new-site-dev by this push:
     new 378b8468 Created local images, Scarf, Blog post for 1.4 (#156)
378b8468 is described below

commit 378b8468c32757f4e173856fdc24040c014e2e50
Author: James Dilworth <gi...@jamesdilworth.com>
AuthorDate: Thu Feb 5 21:00:40 2026 -0800

    Created local images, Scarf, Blog post for 1.4 (#156)
    
    * fixed broken images across various older blog posts
    
    * Added blog images into static as ASF no longer allows external image sourcing. Updated next.config to not do image optimization as it looks like this is being served as static
    
    Updated the announcementBar to promote the Pinot Year in Review meetup. Added expiry parameter so this will gracefully disappear after Feb 12.
    
    * added scarf pixel to layout
    
    * Removed a blog unrelated to Apache Pinot. Added a quick post summarizing and linking to the 1.4 release
    
    ---------
    
    Co-authored-by: James Dilworth <in...@dilworth.org>
---
 app/layout.tsx                                     |   5 ++++
 components/AnnouncementBar.tsx                     |  15 ++++++++++-
 components/Header.tsx                              |  14 +++++++++--
 data/authors/qiaochu.mdx                           |  12 +++++++++
 ...-Function-For-Time-Series-Datasets-In-Pinot.mdx |  18 ++++++-------
 ...-11-08-Apache Pinot-How-do-I-see-my-indexes.mdx |  10 ++++----
 .../2022-11-17-Apache Pinot-Inserts-from-SQL.mdx   |  10 ++++----
 .../2022-11-22-Apache-Pinot-Timestamp-Indexes.mdx  |  12 ++++-----
 ...28-Apache-Pinot-Pausing-Real-Time-Ingestion.mdx |   4 +--
 ...che-Pinot-Deduplication-on-Real-Time-Tables.mdx |   8 +++---
 ...pache-Pinot-0-12-Configurable-Time-Boundary.mdx |   2 +-
 ...03-30-Apache-Pinot-0-12-Consumer-Record-Lag.mdx |   4 +--
 ...3-05-11-Geospatial-Indexing-in-Apache-Pinot.mdx |  14 +++++------
 ...derstanding-the-impact-on-query-performance.mdx |  20 +++++++--------
 ...al-for-getting-started-a-step-by-step-guide.mdx |  24 +++++++++---------
 ...-capture-with-apache-pinot-how-does-it-work.mdx |   8 +++---
 ...t-streaming-data-from-kafka-to-apache-pinot.mdx |  26 +++++++++----------
 ...ith-apache-kafka-apache-pinot-and-streamlit.mdx |  16 ++++++------
 ...3-understanding-the-impact-in-real-customer.mdx |   8 +++---
 ...2024-12-20-apache-pinot-year-in-review-2024.mdx |   2 +-
 ...low-latency-queries-with-raft-data-platform.mdx |  23 -----------------
 data/blog/2025-09-30-Announce-Pinot-1-4.mdx        |  28 +++++++++++++++++++++
 data/siteMetadata.js                               |   6 +++--
 next.config.js                                     |   1 +
 .../external/1661700264-entities-emitting-data.png | Bin 0 -> 81803 bytes
 .../external/1661700333-parking-data-table.png     | Bin 0 -> 58915 bytes
 .../external/1661700377-30-min-bucket-example.png  | Bin 0 -> 35235 bytes
 .../blogs/external/1661700439-innermost-sql.png    | Bin 0 -> 46063 bytes
 .../blogs/external/1661700473-second-most.png      | Bin 0 -> 35441 bytes
 .../images/blogs/external/1661700517-outermost.png | Bin 0 -> 32944 bytes
 .../blogs/external/1661700601-gapfill-steps.png    | Bin 0 -> 64879 bytes
 .../blogs/external/1661700642-execution-plan.png   | Bin 0 -> 199550 bytes
 .../blogs/external/1661700716-challenges.png       | Bin 0 -> 136260 bytes
 .../blogs/external/1667915561-image1-edittable.png | Bin 0 -> 170459 bytes
 .../images/blogs/external/1667915654-image3.png    | Bin 0 -> 59861 bytes
 .../images/blogs/external/1667915996-image7.png    | Bin 0 -> 45886 bytes
 .../images/blogs/external/1667916147-image6.png    | Bin 0 -> 45798 bytes
 .../images/blogs/external/1667916232-image2.png    | Bin 0 -> 46067 bytes
 .../images/blogs/external/1668701275-image4.png    | Bin 0 -> 40772 bytes
 .../images/blogs/external/1668701353-image1.png    | Bin 0 -> 6674 bytes
 .../images/blogs/external/1668701512-image3.png    | Bin 0 -> 111916 bytes
 .../images/blogs/external/1668701654-image5.png    | Bin 0 -> 9695 bytes
 .../images/blogs/external/1668701727-image2.png    | Bin 0 -> 45627 bytes
 .../images/blogs/external/1669132979-image3.png    | Bin 0 -> 68118 bytes
 .../images/blogs/external/1669133004-image1.png    | Bin 0 -> 8192 bytes
 .../images/blogs/external/1669133027-image6.png    | Bin 0 -> 20877 bytes
 .../images/blogs/external/1669133059-image5.png    | Bin 0 -> 17579 bytes
 .../images/blogs/external/1669133083-image4.png    | Bin 0 -> 3392 bytes
 .../images/blogs/external/1669133112-image2.png    | Bin 0 -> 47408 bytes
 .../images/blogs/external/1669668611-image2.png    | Bin 0 -> 111624 bytes
 ...33-pinot_0-11-realtime_injestion-diagram-v1.png | Bin 0 -> 32217 bytes
 .../images/blogs/external/1673273173-image4.png    | Bin 0 -> 29234 bytes
 .../images/blogs/external/1673273248-image3.png    | Bin 0 -> 47344 bytes
 ...3272-pinot_0-11-de-duplication-diagram_1-v2.png | Bin 0 -> 6237 bytes
 ...3289-pinot_0-11-de-duplication-diagram_2-v3.png | Bin 0 -> 37603 bytes
 .../images/blogs/external/1676991003-image2.png    | Bin 0 -> 12731 bytes
 .../images/blogs/external/1680190272-image2.png    | Bin 0 -> 30451 bytes
 .../images/blogs/external/1680190286-image1.png    | Bin 0 -> 178061 bytes
 .../images/blogs/external/1683813508-image5.png    | Bin 0 -> 1717886 bytes
 .../images/blogs/external/1683813581-image1.png    | Bin 0 -> 57271 bytes
 .../images/blogs/external/1683813641-image7.png    | Bin 0 -> 1215481 bytes
 .../images/blogs/external/1683813705-image3.png    | Bin 0 -> 55113 bytes
 .../images/blogs/external/1683813749-image4.png    | Bin 0 -> 90547 bytes
 .../images/blogs/external/1683813802-image2.png    | Bin 0 -> 1701086 bytes
 .../images/blogs/external/1683813851-image6.png    | Bin 0 -> 57856 bytes
 .../images/blogs/external/1684246698-image5.png    | Bin 0 -> 63401 bytes
 .../images/blogs/external/1684246716-image1.png    | Bin 0 -> 180923 bytes
 .../images/blogs/external/1684246732-image2.png    | Bin 0 -> 63406 bytes
 .../images/blogs/external/1684246748-image3.png    | Bin 0 -> 192129 bytes
 .../images/blogs/external/1684246766-image4.png    | Bin 0 -> 14181 bytes
 .../images/blogs/external/1684246806-image7.png    | Bin 0 -> 13873 bytes
 .../images/blogs/external/1684246816-image6.png    | Bin 0 -> 24608 bytes
 .../images/blogs/external/1684246852-image9.png    | Bin 0 -> 191392 bytes
 .../images/blogs/external/1684246872-image10.png   | Bin 0 -> 34827 bytes
 .../images/blogs/external/1684419409-image7.png    | Bin 0 -> 345652 bytes
 .../images/blogs/external/1684419802-image1.png    | Bin 0 -> 123778 bytes
 .../images/blogs/external/1684419932-image2.png    | Bin 0 -> 112691 bytes
 .../images/blogs/external/1684420004-image3.png    | Bin 0 -> 6035 bytes
 .../images/blogs/external/1684420103-image4.png    | Bin 0 -> 8835 bytes
 .../images/blogs/external/1684420155-image5.png    | Bin 0 -> 67323 bytes
 .../images/blogs/external/1684421163-image6.png    | Bin 0 -> 220181 bytes
 .../images/blogs/external/1684421215-image8.png    | Bin 0 -> 123178 bytes
 .../images/blogs/external/1684421358-image9.png    | Bin 0 -> 131942 bytes
 .../images/blogs/external/1684421406-image12.png   | Bin 0 -> 123718 bytes
 .../images/blogs/external/1684421493-image11.png   | Bin 0 -> 36470 bytes
 .../images/blogs/external/1684421611-image10.png   | Bin 0 -> 18745 bytes
 .../images/blogs/external/1684857201-image4.png    | Bin 0 -> 31724 bytes
 .../images/blogs/external/1684857250-image5.png    | Bin 0 -> 6473 bytes
 .../images/blogs/external/1684857317-image6.png    | Bin 0 -> 75831 bytes
 .../images/blogs/external/1684857872-image3.png    | Bin 0 -> 8929 bytes
 .../images/blogs/external/1685462020-image1.png    | Bin 0 -> 5118 bytes
 .../images/blogs/external/1685462061-image2.png    | Bin 0 -> 2355 bytes
 .../images/blogs/external/1685462099-image3.png    | Bin 0 -> 30551 bytes
 .../images/blogs/external/1685462150-image4.png    | Bin 0 -> 2172 bytes
 .../images/blogs/external/1685462203-image5.png    | Bin 0 -> 20893 bytes
 .../images/blogs/external/1685462248-image6.png    | Bin 0 -> 73518 bytes
 .../images/blogs/external/1685462274-image7.png    | Bin 0 -> 24882 bytes
 .../images/blogs/external/1685462322-image8.png    | Bin 0 -> 5541 bytes
 .../images/blogs/external/1685462366-image9.png    | Bin 0 -> 23644 bytes
 .../images/blogs/external/1685462400-image10.png   | Bin 0 -> 6532 bytes
 .../images/blogs/external/1685462441-image11.png   | Bin 0 -> 8203 bytes
 .../images/blogs/external/1685462480-image12.png   | Bin 0 -> 1883 bytes
 .../images/blogs/external/1685462510-image13.png   | Bin 0 -> 43412 bytes
 .../images/blogs/external/1685637507-image4.png    | Bin 0 -> 61496 bytes
 .../images/blogs/external/1685637607-image1.png    | Bin 0 -> 88976 bytes
 .../images/blogs/external/1685637644-image2.png    | Bin 0 -> 25961 bytes
 .../images/blogs/external/1685637772-image5.png    | Bin 0 -> 167726 bytes
 .../images/blogs/external/1685637837-image6.png    | Bin 0 -> 159378 bytes
 .../images/blogs/external/1685637876-image7.png    | Bin 0 -> 63234 bytes
 .../images/blogs/external/1685637909-image8.png    | Bin 0 -> 12169 bytes
 .../images/blogs/external/1685637945-image9.png    | Bin 0 -> 43087 bytes
 ...549350-screen-shot-2023-06-22-at-1-32-51-pm.png | Bin 0 -> 31686 bytes
 .../images/blogs/external/1689174701-image1.png    | Bin 0 -> 12954 bytes
 .../images/blogs/external/1689175033-image4.png    | Bin 0 -> 28262 bytes
 .../images/blogs/external/1689175176-image2.png    | Bin 0 -> 27410 bytes
 .../images/blogs/external/1689175271-image3.png    | Bin 0 -> 103478 bytes
 .../blogs/external/Pinot-YearinReview24-8.png      | Bin 0 -> 856791 bytes
 117 files changed, 169 insertions(+), 121 deletions(-)

diff --git a/app/layout.tsx b/app/layout.tsx
index becfd065..a29e88d6 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -122,6 +122,11 @@ _paq.push(['enableLinkTracking']);
                         </SearchProvider>
                     </div>
                 </ThemeProviders>
+                {/* Scarf Pixel */}
+                <img
+                    referrerPolicy="no-referrer-when-downgrade"
+                    src="https://static.scarf.sh/a.png?x-pxid=3dd7caad-22f5-40d7-bc2e-20c8eaf91659"
+                />
             </body>
         </html>
     );
diff --git a/components/AnnouncementBar.tsx b/components/AnnouncementBar.tsx
index 09a129b4..d127fa30 100644
--- a/components/AnnouncementBar.tsx
+++ b/components/AnnouncementBar.tsx
@@ -13,6 +13,7 @@ export interface AnnouncementBarProps {
     buttonColor?: string;
     buttonTarget?: string;
     showArrowIcon?: boolean;
+    expiresAfter?: string;
     className?: string;
 }
 
@@ -26,8 +27,20 @@ export default function AnnouncementBar({
     buttonColor = 'text-blue-600',
     buttonTarget = '_self',
     showArrowIcon = true,
+    expiresAfter,
     className = ''
 }: AnnouncementBarProps) {
+    if (expiresAfter) {
+        const expiryDate = new Date(expiresAfter);
+        if (Number.isNaN(expiryDate.getTime())) {
+            throw new Error(`Invalid AnnouncementBar expiry date: ${expiresAfter}`);
+        }
+
+        if (new Date() > expiryDate) {
+            return null;
+        }
+    }
+
     return (
         <div className={clsx('z-50', backgroundColor, className)}>
             <div
@@ -53,7 +66,7 @@ export default function AnnouncementBar({
                             {text}
                         </span>
                     </div>
-                    {buttonText}
+                    <span className="ml-2">{buttonText}</span>
                     {showArrowIcon && <ArrowRight className="ml-1 inline-block h-5 w-5" />}
                 </Link>
             </div>
diff --git a/components/Header.tsx b/components/Header.tsx
index 21072a28..968ad712 100644
--- a/components/Header.tsx
+++ b/components/Header.tsx
@@ -12,7 +12,8 @@ import { Button } from '@/components/ui/button';
 import MobileNav from './MobileNav';
 // import ThemeSwitch from './ThemeSwitch';
 import SearchButton from './SearchButton';
-import YouTubeBanner from './YouTubeBanner';
+// import YouTubeBanner from './YouTubeBanner';
+import AnnouncementBar from './AnnouncementBar';
 
 const Header = () => {
     const [stars, setStars] = useState<string | null>(null);
@@ -48,7 +49,16 @@ const Header = () => {
     return (
         <>
             {/* <ReleaseBanner /> */}
-            {!isSharePage && <YouTubeBanner />}
+            {/* !isSharePage && <YouTubeBanner /> */}
+            <AnnouncementBar
+                text={siteMetadata.announcement.text}
+                buttonText={siteMetadata.announcement.buttonText}
+                backgroundColor="bg-[#C7154A]"
+                textColor="text-white"
+                buttonHref={siteMetadata.announcement.link}
+                buttonColor="text-white"
+                expiresAfter={siteMetadata.announcement.expiresAfter}
+            />
             <header className="border-b-1 flex items-center justify-between border-b px-5 py-3 md:px-[4rem] md:py-4">
                 <div className="flex">
                     <Link href="/" aria-label={siteMetadata.headerTitle}>
diff --git a/data/authors/qiaochu.mdx b/data/authors/qiaochu.mdx
new file mode 100644
index 00000000..96ce5411
--- /dev/null
+++ b/data/authors/qiaochu.mdx
@@ -0,0 +1,12 @@
+---
+name: Qiaochu Liu
+avatar: /static/images/logomark.svg
+occupation: Staff Software Engineer
+company: Uber
+email: address@yoursite.com
+twitter: https://twitter.com/Twitter
+linkedin: https://www.linkedin.com
+github: https://github.com
+---
+
+Apache Pinot is a real-time distributed online analytical processing (OLAP) datastore. Use Pinot to ingest and immediately query data from streaming or batch data sources (including, Apache Kafka, Amazon Kinesis, Hadoop HDFS, Amazon S3, Azure ADLS, and Google Cloud Storage).
diff --git a/data/blog/2022-08-02-GapFill-Function-For-Time-Series-Datasets-In-Pinot.mdx b/data/blog/2022-08-02-GapFill-Function-For-Time-Series-Datasets-In-Pinot.mdx
index 6ccfdd24..92951492 100644
--- a/data/blog/2022-08-02-GapFill-Function-For-Time-Series-Datasets-In-Pinot.mdx
+++ b/data/blog/2022-08-02-GapFill-Function-For-Time-Series-Datasets-In-Pinot.mdx
@@ -18,7 +18,7 @@ Many real-world datasets are time-series in nature, tracking the value or state
 
 Let us use an IOT dataset tracking the occupancy status of the individual parking slots in a parking garage using automated sensors in this post. The granularity of recorded data points might be sparse or the events could be missing due to network and other device issues in the IOT environment. The following figure demonstrates entities emitting values at irregular intervals as the value changes. Polling and recording values of all entities regularly at a lower granularity would consume  [...]
 
-![Entities emitting data over time at irregular intervals](https://startree.ai/wp-content/uploads/2024/08/1661700264-entities-emitting-data.png 'Entities emitting data over time at irregular intervals')
+![Entities emitting data over time at irregular intervals](/static/images/blogs/external/1661700264-entities-emitting-data.png 'Entities emitting data over time at irregular intervals')
 
 It is important for Pinot to provide the on-the-fly interpolation (filling the missing data) functionality to better handle time-series data.
 
@@ -32,7 +32,7 @@ Let us use the following sample data set tracking the status of parking lots in
 
 ### Sample Dataset:
 
-![Sample parking lot dataset](https://startree.ai/wp-content/uploads/2024/08/1661700333-parking-data-table.png 'Sample parking lot dataset')
+![Sample parking lot dataset](/static/images/blogs/external/1661700333-parking-data-table.png 'Sample parking lot dataset')
 
 parking_data table
 
@@ -40,7 +40,7 @@ Use case: We want to find out the total number of parking lots that are occupie
 
 Let us take 30 minutes time bucket as an example:
 
-![Sample parking lot dataset with 30 minute time bucket](https://startree.ai/wp-content/uploads/2024/08/1661700377-30-min-bucket-example.png 'Sample parking lot dataset with 30 minute time bucket')
+![Sample parking lot dataset with 30 minute time bucket](/static/images/blogs/external/1661700377-30-min-bucket-example.png 'Sample parking lot dataset with 30 minute time bucket')
 
 In the 30 mins aggregation results table above, we can see a lot of missing data as many lots didn't have anything recorded in those 30-minute windows. To calculate the number of occupied parking lots per time bucket, we need to gap-fill the missing data for each of these 30-minute windows.
 
@@ -100,15 +100,15 @@ The following concepts were added to interpolate and handle time-series data.
 
 The innermost sql will convert the raw event table to the following table.
 
-![Sample parking lot query workflow innermost SQL](https://startree.ai/wp-content/uploads/2024/08/1661700439-innermost-sql.png 'Sample parking lot query workflow innermost SQL')
+![Sample parking lot query workflow innermost SQL](/static/images/blogs/external/1661700439-innermost-sql.png 'Sample parking lot query workflow innermost SQL')
 
 The second most nested sql will gap fill the returned data as below:
 
-![Sample parking lot query workflow second most SQL](https://startree.ai/wp-content/uploads/2024/08/1661700473-second-most.png 'Sample parking lot query workflow second most SQL')
+![Sample parking lot query workflow second most SQL](/static/images/blogs/external/1661700473-second-most.png 'Sample parking lot query workflow second most SQL')
 
 The outermost query will aggregate the gapfilled data as follows:
 
-![Sample parking lot query workflow outermost SQL](https://startree.ai/wp-content/uploads/2024/08/1661700517-outermost.png 'Sample parking lot query workflow outermost SQL')
+![Sample parking lot query workflow outermost SQL](/static/images/blogs/external/1661700517-outermost.png 'Sample parking lot query workflow outermost SQL')
 
 ### Other Supported Query Scenarios:
 
@@ -139,7 +139,7 @@ There are two gapfill-specific steps:
 1.  When Pinot Broker Server receives the gapfill SQL query, it will strip out gapfill related information and send out the stripped SQL query to the pinot server
 2.  GapfillProcessor will process the result from BrokerReducerService. The gapfill logic will be applied to the reduced result.
 
-![Gapfill steps](https://startree.ai/wp-content/uploads/2024/08/1661700601-gapfill-steps.png 'Gapfill steps')
+![Gapfill steps](/static/images/blogs/external/1661700601-gapfill-steps.png 'Gapfill steps')
 
 Here is the stripped version of the sql query sent to servers for the query shared above:
 
@@ -158,7 +158,7 @@ SELECT DATETIMECONVERT(event_time,'1:MILLISECONDS:EPOCH',
 
 The sample execution plan for this query is as shown in the figure below:
 
-![Sample query execution plan](https://startree.ai/wp-content/uploads/2024/08/1661700642-execution-plan.png 'Sample query execution plan')
+![Sample query execution plan](/static/images/blogs/external/1661700642-execution-plan.png 'Sample query execution plan')
 
 ### Time and Space complexity:
 
@@ -166,7 +166,7 @@ Let us say there are M entities, R rows returned from servers, and N time bucket
 
 ### Challenges
 
-![Sample server challenges graph](https://startree.ai/wp-content/uploads/2024/08/1661700716-challenges.png 'Sample server challenges graph')
+![Sample server challenges graph](/static/images/blogs/external/1661700716-challenges.png 'Sample server challenges graph')
 
 As the time-series datasets are enormous and partitioned, it's hard to get answers to the following questions:
 
diff --git a/data/blog/2022-11-08-Apache Pinot-How-do-I-see-my-indexes.mdx b/data/blog/2022-11-08-Apache Pinot-How-do-I-see-my-indexes.mdx
index 68c529ad..c6983857 100644
--- a/data/blog/2022-11-08-Apache Pinot-How-do-I-see-my-indexes.mdx	
+++ b/data/blog/2022-11-08-Apache Pinot-How-do-I-see-my-indexes.mdx	
@@ -36,11 +36,11 @@ docker run \
 
 Once that’s up and running, navigate to [http://localhost:9000/#/](http://localhost:9000/#/) and click on Tables. Under the tables section click on airlineStats_OFFLINE. You should see a page that looks like this:
 
-![airlineStats_OFFLINE page](https://startree.ai/wp-content/uploads/2024/08/1667915561-image1-edittable.png 'airlineStats_OFFLINE page')
+![airlineStats_OFFLINE page](/static/images/blogs/external/1667915561-image1-edittable.png 'airlineStats_OFFLINE page')
 
 Click on Edit Table. This will show a window with the config for this table.
 
-![Window with configuration for airlineStats_OFFLINE table](https://startree.ai/wp-content/uploads/2024/08/1667915654-image3.png 'Window with configuration for airlineStats_OFFLINE table')
+![Window with configuration for airlineStats_OFFLINE table](/static/images/blogs/external/1667915654-image3.png 'Window with configuration for airlineStats_OFFLINE table')
 
 ## Indexing Config
 
@@ -98,7 +98,7 @@ Now, close the table config modal, and under the segments section, open airlineS
 
 If you look at one of those segments, you’ll see the following grid that lists columns/field names against the indexes defined on those fields.
 
-![Segment grid that lists columns/field names against the indexes defined on those fields](https://startree.ai/wp-content/uploads/2024/08/1667915996-image7.png 'Segment grid that lists columns/field names against the indexes defined on those fields')
+![Segment grid that lists columns/field names against the indexes defined on those fields](/static/images/blogs/external/1667915996-image7.png 'Segment grid that lists columns/field names against the indexes defined on those fields')
 
 All the fields on display are persisting their values using the dictionary/forward [index format](https://docs.pinot.apache.org/basics/indexing/forward-index) ). Still, we can also see that the Quarter column is sorted and has an inverted index, neither of which we explicitly defined.
 
@@ -112,11 +112,11 @@ I’ve written a couple of blog posts explaining how sorted indexes work on offl
 
 Next, let’s see what happens if we add an explicit index. We’re going to add an inverted index to the FlightNum column. Go to Edit Table config again and update tableIndexConfig to have the following value:
 
-![Inverted index addition](https://startree.ai/wp-content/uploads/2024/08/1667916147-image6.png 'Inverted index addition')
+![Inverted index addition](/static/images/blogs/external/1667916147-image6.png 'Inverted index addition')
 
 If you go back to the page for segment airlineStats_OFFLINE_16073_16073_0, notice that it does not have an inverted index for this field.
 
-![page for segment airlineStats_OFFLINE_16073_16073_0 without an inverted index](https://startree.ai/wp-content/uploads/2024/08/1667916232-image2.png 'page for segment airlineStats_OFFLINE_16073_16073_0 without an inverted index')
+![page for segment airlineStats_OFFLINE_16073_16073_0 without an inverted index](/static/images/blogs/external/1667916232-image2.png 'page for segment airlineStats_OFFLINE_16073_16073_0 without an inverted index')
 
 This is because indexes are applied on a per segment basis. If we want the inverted index on the FlightNum column in this segment, we can click _Reload Segment_ on this page, or we can go back to the table page and click _Reload All Segments_.
 
diff --git a/data/blog/2022-11-17-Apache Pinot-Inserts-from-SQL.mdx b/data/blog/2022-11-17-Apache Pinot-Inserts-from-SQL.mdx
index 5036f288..92557cde 100644
--- a/data/blog/2022-11-17-Apache Pinot-Inserts-from-SQL.mdx	
+++ b/data/blog/2022-11-17-Apache Pinot-Inserts-from-SQL.mdx	
@@ -20,11 +20,11 @@ In the [Batch Import JSON from Amazon S3 into Apache Pinot | StarTree Recipes](h
 
 The contents of that bucket are shown in the screenshot below:
 
-![Sample data ingested into Apache Pinot from a S3 bucket](https://startree.ai/wp-content/uploads/2024/08/1668701275-image4.png 'Sample data ingested into Apache Pinot from a S3 bucket')
+![Sample data ingested into Apache Pinot from a S3 bucket](/static/images/blogs/external/1668701275-image4.png 'Sample data ingested into Apache Pinot from a S3 bucket')
 
 Let’s quickly recap the steps that we had to do to import those files into Pinot. We have a table called events, which has the following schema:
 
-![Events schema table](https://startree.ai/wp-content/uploads/2024/08/1668701353-image1.png 'Events schema table')
+![Events schema table](/static/images/blogs/external/1668701353-image1.png 'Events schema table')
 
 We first created a job specification file, which contains a description of our import job. The job file is shown below:
 
@@ -74,7 +74,7 @@ And don’t worry, those credentials have already been deleted; I find it easier
 
 Once we’ve run this command, if we go to the Pinot UI at [http://localhost:9000](http://localhost:9000/) and click through to the events table from the Query Console menu, we’ll see that the records have been imported, as shown in the screenshot below:
 
-![Sample imported records shown in the Apache Pinot Query Console menu](https://startree.ai/wp-content/uploads/2024/08/1668701512-image3.png 'Sample imported records shown in the Apache Pinot Query Console menu')
+![Sample imported records shown in the Apache Pinot Query Console menu](/static/images/blogs/external/1668701512-image3.png 'Sample imported records shown in the Apache Pinot Query Console menu')
 
 This approach works, and we may still prefer to use it when we need fine-grained control over the ingestion parameters, but it is a bit heavyweight for your everyday data import!
 
@@ -111,11 +111,11 @@ OPTION(
 
 If we run this query, we’ll see the following output:
 
-![Sample events_OFFLINE query result](https://startree.ai/wp-content/uploads/2024/08/1668701654-image5.png 'Sample events_OFFLINE query result')
+![Sample events_OFFLINE query result](/static/images/blogs/external/1668701654-image5.png 'Sample events_OFFLINE query result')
 
 We can check on the state of the ingestion job via the Swagger REST API. If we navigate to [http://localhost:9000/help#/Task/getTaskState](http://localhost:9000/help#/Task/getTaskState), paste Task_SegmentGenerationAndPushTask_events-task as our task name, and then click Execute, we’ll see the following:
 
-![Checking the state of an ingestion job screen](https://startree.ai/wp-content/uploads/2024/08/1668701727-image2.png 'Checking the state of an ingestion job screen')
+![Checking the state of an ingestion job screen](/static/images/blogs/external/1668701727-image2.png 'Checking the state of an ingestion job screen')
 
 If we see the state COMPLETED, this means the data has been ingested, which we can check by going back to the Query console and clicking on the events table.
 
diff --git a/data/blog/2022-11-22-Apache-Pinot-Timestamp-Indexes.mdx b/data/blog/2022-11-22-Apache-Pinot-Timestamp-Indexes.mdx
index ceeb6d31..bdc27043 100644
--- a/data/blog/2022-11-22-Apache-Pinot-Timestamp-Indexes.mdx
+++ b/data/blog/2022-11-22-Apache-Pinot-Timestamp-Indexes.mdx
@@ -20,7 +20,7 @@ Instead, users write queries that use the datetrunc function to filter at a coar
 
 The [timestamp index](https://docs.pinot.apache.org/basics/indexing/timestamp-index) solves that problem! In this blog post, we’ll use it to get an almost 5x query speed improvement on a relatively small dataset of only 7m rows.
 
-![Time in milliseconds with and without timestamp indexes bar chart](https://startree.ai/wp-content/uploads/2024/08/1669133004-image1.png 'Time in milliseconds with and without timestamp indexes bar chart')
+![Time in milliseconds with and without timestamp indexes bar chart](/static/images/blogs/external/1669133004-image1.png 'Time in milliseconds with and without timestamp indexes bar chart')
 
 ## Spinning up Pinot
 
@@ -86,7 +86,7 @@ We should see the following output:
 
 A screenshot of the schema is shown below:
 
-![Chicago crime dataset table schema](https://startree.ai/wp-content/uploads/2024/08/1669132979-image3.png 'Chicago crime dataset table schema')
+![Chicago crime dataset table schema](/static/images/blogs/external/1669132979-image3.png 'Chicago crime dataset table schema')
 
 We won’t go through the table config and schema files in this blog post because we did that in the last post, but you can find them in the [config](https://github.com/startreedata/pinot-recipes/tree/main/recipes/analyzing-chicago-crimes/config) directory on GitHub.
 
@@ -119,11 +119,11 @@ limit 10
 
 If we run that query, we’ll see the following results:
 
-![Chicago crime dataset query result](https://startree.ai/wp-content/uploads/2024/08/1669133027-image6.png 'Chicago crime dataset query result')
+![Chicago crime dataset query result](/static/images/blogs/external/1669133027-image6.png 'Chicago crime dataset query result')
 
 And, if we look above the query result, there’s metadata about the query, including the time that it took to run.
 
-![Chicago crime dataset metadata about the query, including the time that it took to run](https://startree.ai/wp-content/uploads/2024/08/1669133059-image5.png 'Chicago crime dataset metadata about the query, including the time that it took to run')
+![Chicago crime dataset metadata about the query, including the time that it took to run](/static/images/blogs/external/1669133059-image5.png 'Chicago crime dataset metadata about the query, including the time that it took to run')
 
 The query took 141 ms to execute, so that’s our baseline.
 
@@ -222,7 +222,7 @@ In our case, that means we’ll have these extra columns: $DateEpoch$DAY, $DateE
 
 We can check if the extra columns and indexes have been added by navigating to the [segment_page](http://localhost:9000/#/tenants/table/crimes_indexed_OFFLINE/crimes_OFFLINE_0) and typing $Date$Epoch in the search box.  You should see the following:
 
-![Apache Pinot timestamp index on a column](https://startree.ai/wp-content/uploads/2024/08/1669133112-image2.png 'Apache Pinot timestamp index on a column')
+![Apache Pinot timestamp index on a column](/static/images/blogs/external/1669133112-image2.png 'Apache Pinot timestamp index on a column')
 
 These columns will be assigned the following values:
 
@@ -276,7 +276,7 @@ limit 10
 
 Let’s now run our initial query against the _crimes_indexed_ table. We’ll get exactly the same results as before, but let’s take a look at the query stats:
 
-![Chicago crime dataset updated query stats](https://startree.ai/wp-content/uploads/2024/08/1669133083-image4.png 'Chicago crime dataset updated query stats')
+![Chicago crime dataset updated query stats](/static/images/blogs/external/1669133083-image4.png 'Chicago crime dataset updated query stats')
 
 This time the query takes 36 milliseconds rather than 140 milliseconds. That’s an almost 5x improvement, thanks to the timestamp index.
 
diff --git a/data/blog/2022-11-28-Apache-Pinot-Pausing-Real-Time-Ingestion.mdx b/data/blog/2022-11-28-Apache-Pinot-Pausing-Real-Time-Ingestion.mdx
index 5b4976b9..776e2d5b 100644
--- a/data/blog/2022-11-28-Apache-Pinot-Pausing-Real-Time-Ingestion.mdx
+++ b/data/blog/2022-11-28-Apache-Pinot-Pausing-Real-Time-Ingestion.mdx
@@ -26,7 +26,7 @@ Once a segment reaches the [segment threshold,](https://dev.startree.ai/docs/pin
 
 The diagram below shows what things might look like when we’re ingesting data from a Kafka topic that has 3 partitions:
 
-![Apache pinot 0.11 Real Time Data Ingestion](https://startree.ai/wp-content/uploads/2024/08/1669733133-pinot_0-11-realtime_injestion-diagram-v1.png 'Apache pinot 0.11 Real Time Data Ingestion')
+![Apache pinot 0.11 Real Time Data Ingestion](/static/images/blogs/external/1669733133-pinot_0-11-realtime_injestion-diagram-v1.png 'Apache pinot 0.11 Real Time Data Ingestion')
 
 A table has one consuming segment per partition but would have many completed segments.
 
@@ -298,7 +298,7 @@ This time we will see some consuming segments:
 
 Navigate to [http://localhost:9000/#/query](http://localhost:9000/#/query) and click on the events table. You should see the following:
 
-![Sample events table containing records](https://startree.ai/wp-content/uploads/2024/08/1669668611-image2.png 'Sample events table containing records')
+![Sample events table containing records](/static/images/blogs/external/1669668611-image2.png 'Sample events table containing records')
 
 We have records! We can also run our data generator again, and more events will be ingested.
 
diff --git a/data/blog/2023-01-29-Apache-Pinot-Deduplication-on-Real-Time-Tables.mdx b/data/blog/2023-01-29-Apache-Pinot-Deduplication-on-Real-Time-Tables.mdx
index 25d7b5ce..e4bd4fbc 100644
--- a/data/blog/2023-01-29-Apache-Pinot-Deduplication-on-Real-Time-Tables.mdx
+++ b/data/blog/2023-01-29-Apache-Pinot-Deduplication-on-Real-Time-Tables.mdx
@@ -245,7 +245,7 @@ limit 10
 
 The results of this query are shown below:
 
-![Sample Apache Pinot real-time query response stats including duplicates](https://startree.ai/wp-content/uploads/2024/08/1673273173-image4.png 'Sample Apache Pinot real-time query response stats including duplicates')
+![Sample Apache Pinot real-time query response stats including duplicates](/static/images/blogs/external/1673273173-image4.png 'Sample Apache Pinot real-time query response stats including duplicates')
 
 We can see loads of duplicates!
 
@@ -331,7 +331,7 @@ The changes to notice here are:
     limit 10
 ```
 
-![Sample Apache Pinot real-time query response stats deduplicated](https://startree.ai/wp-content/uploads/2024/08/1673273248-image3.png 'Sample Apache Pinot real-time query response stats deduplicated')
+![Sample Apache Pinot real-time query response stats deduplicated](/static/images/blogs/external/1673273248-image3.png 'Sample Apache Pinot real-time query response stats deduplicated')
 
 We have every combination of hex values (16^3=4096) and no duplicates! Pinot’s de-duplication feature has done its job.
 
@@ -339,11 +339,11 @@ We have every combination of hex values (16^3=4096) and no duplicates! Pinot’s
 
 When we’re not using the deduplication feature, events are ingested from our streaming platform into Pinot, as shown in the diagram below:
 
-![Events ingested from a streaming platform into Apache Pinot without using the deduplication feature](https://startree.ai/wp-content/uploads/2024/08/1673273272-pinot_0-11-de-duplication-diagram_1-v2.png 'Events ingested from a streaming platform into Apache Pinot without using the deduplication feature')
+![Events ingested from a streaming platform into Apache Pinot without using the deduplication feature](/static/images/blogs/external/1673273272-pinot_0-11-de-duplication-diagram_1-v2.png 'Events ingested from a streaming platform into Apache Pinot without using the deduplication feature')
 
 When de-dup is enabled, we have to check whether records can be ingested, as shown in the diagram below:
 
-![Events ingested from a streaming platform into Apache Pinot using the deduplication feature](https://startree.ai/wp-content/uploads/2024/08/1673273289-pinot_0-11-de-duplication-diagram_2-v3.png 'Events ingested from a streaming platform into Apache Pinot using the deduplication feature')
+![Events ingested from a streaming platform into Apache Pinot using the deduplication feature](/static/images/blogs/external/1673273289-pinot_0-11-de-duplication-diagram_2-v3.png 'Events ingested from a streaming platform into Apache Pinot using the deduplication feature')
 
 De-dup works out whether a primary key has already been ingested by using an in memory map of (primary key -> corresponding segment reference).
 
diff --git a/data/blog/2023-02-21-Apache-Pinot-0-12-Configurable-Time-Boundary.mdx b/data/blog/2023-02-21-Apache-Pinot-0-12-Configurable-Time-Boundary.mdx
index 5ec3749a..5fce10b7 100644
--- a/data/blog/2023-02-21-Apache-Pinot-0-12-Configurable-Time-Boundary.mdx
+++ b/data/blog/2023-02-21-Apache-Pinot-0-12-Configurable-Time-Boundary.mdx
@@ -32,7 +32,7 @@ The ingestion frequency can either be 1 hour or 1 day, so one of these values wi
 
 When a query for a hybrid table is received by a Pinot Broker, the broker sends a time boundary annotated version of the query to the offline and real-time tables. Any records from or before the time boundary are read from the offline table; anything greater than the boundary comes from the real-time table.
 
-![Apache Pinot computing the time boundary](https://startree.ai/wp-content/uploads/2024/08/1676991003-image2.png 'Apache Pinot computing the time boundary')
+![Apache Pinot computing the time boundary](/static/images/blogs/external/1676991003-image2.png 'Apache Pinot computing the time boundary')
 
 For example, if we executed the following query:
 
diff --git a/data/blog/2023-03-30-Apache-Pinot-0-12-Consumer-Record-Lag.mdx b/data/blog/2023-03-30-Apache-Pinot-0-12-Consumer-Record-Lag.mdx
index 16e57da9..8ae4dc9e 100644
--- a/data/blog/2023-03-30-Apache-Pinot-0-12-Consumer-Record-Lag.mdx
+++ b/data/blog/2023-03-30-Apache-Pinot-0-12-Consumer-Record-Lag.mdx
@@ -211,7 +211,7 @@ Let’s call the function:
 
 We’ll see the following output:
 
-![Consumer record lag output](https://startree.ai/wp-content/uploads/2024/08/1680190272-image2.png 'Consumer record lag output')
+![Consumer record lag output](/static/images/blogs/external/1680190272-image2.png 'Consumer record lag output')
 
 Now let’s put it in a script and call the watch command so that it will be refreshed every couple of seconds:
 
@@ -253,7 +253,7 @@ kcat -P -b localhost:9092 -t events -Kø
 
 And now if we look at the watch output:
 
-![Apache Pinot Consumer Record Lag](https://startree.ai/wp-content/uploads/2024/08/1680190286-image1.png 'Apache Pinot Consumer Record Lag')
+![Apache Pinot Consumer Record Lag](/static/images/blogs/external/1680190286-image1.png 'Apache Pinot Consumer Record Lag')
 
 We get some transitory lag, but it generally goes away by the next time the command is run.
 
diff --git a/data/blog/2023-05-11-Geospatial-Indexing-in-Apache-Pinot.mdx b/data/blog/2023-05-11-Geospatial-Indexing-in-Apache-Pinot.mdx
index e96246f8..fffdc63b 100644
--- a/data/blog/2023-05-11-Geospatial-Indexing-in-Apache-Pinot.mdx
+++ b/data/blog/2023-05-11-Geospatial-Indexing-in-Apache-Pinot.mdx
@@ -28,7 +28,7 @@ We can index points using [H3](https://h3geo.org/), an open source library that
 
 For example, if the central hexagon covers the Westminster area of central London, neighbors at distance 1 are colored blue, those at distance 2 are in green, and those at distance 3 are in red.
 
-![Geospatial Indexing In Apache Pinot](https://startree.ai/wp-content/uploads/2024/08/1683813508-image5.png 'Geospatial Indexing In Apache Pinot')
+![Geospatial Indexing In Apache Pinot](/static/images/blogs/external/1683813508-image5.png 'Geospatial Indexing In Apache Pinot')
 
 Let’s learn how to use geospatial indexing with help from a dataset that captures the latest location of trains moving around the UK. We’re streaming this data into a `trains` topic in Apache Kafka®. Here’s one message from this stream:
 
@@ -146,13 +146,13 @@ limit 10
 
 These results from running the query would follow:
 
-![Sample Geospatial Indexing In Apache Pinot Query Result](https://startree.ai/wp-content/uploads/2024/08/1683813581-image1.png 'Sample Geospatial Indexing In Apache Pinot Query Result')
+![Sample Geospatial Indexing In Apache Pinot Query Result](/static/images/blogs/external/1683813581-image1.png 'Sample Geospatial Indexing In Apache Pinot Query Result')
 
 Let’s now go into a bit more detail about what happens when we run the query.
 
 The 10 km radius covers the area inside the white circle on the diagram below:
 
-![Geospatial Indexing In Apache Pinot Circle](https://startree.ai/wp-content/uploads/2024/08/1683813641-image7.png 'Geospatial Indexing In Apache Pinot Circle')
+![Geospatial Indexing In Apache Pinot Circle](/static/images/blogs/external/1683813641-image7.png 'Geospatial Indexing In Apache Pinot Circle')
 
 Pinot’s query planner will first translate the distance of 10 km into a number of rings, in this case, two. It will then find all the hexagons located two rings away from the white one. Some of these hexagons will fit completely inside the white circle, and some will overlap with the circle.
 
@@ -182,17 +182,17 @@ limit 10
 
 The results from running the query are shown below:
 
-![Sample Geospatial Indexing In Apache Pinot Query Result](https://startree.ai/wp-content/uploads/2024/08/1683813749-image4.png 'Sample Geospatial Indexing In Apache Pinot Query Result')
+![Sample Geospatial Indexing In Apache Pinot Query Result](/static/images/blogs/external/1683813749-image4.png 'Sample Geospatial Indexing In Apache Pinot Query Result')
 
 If we change the query to show trains outside of a central London polygon, we’d see the following results:
 
-![Sample Geospatial Indexing In Apache Pinot Query Result](https://startree.ai/wp-content/uploads/2024/08/1683813705-image3.png 'Sample Geospatial Indexing In Apache Pinot Query Result')
+![Sample Geospatial Indexing In Apache Pinot Query Result](/static/images/blogs/external/1683813705-image3.png 'Sample Geospatial Indexing In Apache Pinot Query Result')
 
 So what’s actually happening when we run this query?
 
 The polygon covers the area inside the white shape as shown below:
 
-![Geospatial Indexing In Apache Pinot Polygon](https://startree.ai/wp-content/uploads/2024/08/1683813802-image2.png 'Geospatial Indexing In Apache Pinot Polygon')
+![Geospatial Indexing In Apache Pinot Polygon](/static/images/blogs/external/1683813802-image2.png 'Geospatial Indexing In Apache Pinot Polygon')
 
 Pinot’s query planner will first find all the coordinates on the exterior of the polygon. It will then find the hexagons that fit within that geofence. Those hexagons get added to the potential cells list.
 
@@ -231,7 +231,7 @@ If our query uses `STDistance`, we should expect to see the ​`​FILTER\_H3\_I
 
 See this example query plan:
 
-![Apache Pinot Geospatial Indexing Query Plan](https://startree.ai/wp-content/uploads/2024/08/1683813851-image6.png 'Apache Pinot Geospatial Indexing Query Plan')
+![Apache Pinot Geospatial Indexing Query Plan](/static/images/blogs/external/1683813851-image6.png 'Apache Pinot Geospatial Indexing Query Plan')
 
 The [StarTree Developer Hub](https://dev.startree.ai/) contains a [geospatial indexing guide](https://dev.startree.ai/docs/pinot/recipes/geospatial-indexing#how-do-i-check-that-the-geospatial-index-is-being-used) that goes through this in more detail.
 
diff --git a/data/blog/2023-05-16-star-tree-indexes-in-apache-pinot-part-1-understanding-the-impact-on-query-performance.mdx b/data/blog/2023-05-16-star-tree-indexes-in-apache-pinot-part-1-understanding-the-impact-on-query-performance.mdx
index 81f2ed81..a9f11633 100644
--- a/data/blog/2023-05-16-star-tree-indexes-in-apache-pinot-part-1-understanding-the-impact-on-query-performance.mdx
+++ b/data/blog/2023-05-16-star-tree-indexes-in-apache-pinot-part-1-understanding-the-impact-on-query-performance.mdx
@@ -16,31 +16,31 @@ _Star-Tree Index: Pinot’s Intelligent Materialized View:_
 
 _The star-tree index provides an intelligent way to build materialized views within Pinot. Traditional MVs work by fully materializing the computation for each source record that matches the specified predicates. Although useful, this can result in non-trivial storage overhead. On the other hand, the star-tree index allows us to partially materialize the computations and provide the ability to tune the space-time tradeoff by providing a configurable threshold between pre-aggregation and  [...]
 
-![](https://startree.ai/wp-content/uploads/2024/08/1684246698-image5.png)
+![](/static/images/blogs/external/1684246698-image5.png)
 
 In this three-part blog series, we will compare and contrast query performance of a star-tree index with an inverted index, something that most of the OLAP databases end up using for such queries.
 
 In this first part, we will showcase how a star-tree index brought down standalone query latency on a sizable dataset of ~633M records from 1,513ms to 4ms! — nearly 380x faster.
 
-![](https://startree.ai/wp-content/uploads/2024/08/1684246806-image7.png)
+![](/static/images/blogs/external/1684246806-image7.png)
 
 ## 1\. The Dataset:
 
 We used New York City Taxi Data for this comparison. Original source: [here](https://www.kaggle.com/c/nyc-taxi-trip-duration). Below are the high level details about this dataset.
 
-![](https://startree.ai/wp-content/uploads/2024/08/1684246816-image6.png)
+![](/static/images/blogs/external/1684246816-image6.png)
 
 ### Schema:
 
 The dataset has 8 dimension fields and 11 metric columns as listed below.
 
-![](https://startree.ai/wp-content/uploads/2024/08/1684246732-image2.png)
+![](/static/images/blogs/external/1684246732-image2.png)
 
 ## 2\. Query Pattern
 
 The query pattern involved slicing and dicing the data (GROUPING) BY various dimensions (Date, Month and Year), aggregating different metrics (total trips, distance and passengers count) and FILTERING BY a time range that could go as wide as 1 year.
 
-![](https://startree.ai/wp-content/uploads/2024/08/1684246872-image10.png)
+![](/static/images/blogs/external/1684246872-image10.png)
 
 Note: A key thing to note is that a single star-tree index covers a wide range of OLAP queries that comprise the dimensions, metrics and aggregate functions specified in it.
 
@@ -92,7 +92,7 @@ We will use one such variant query for this illustration:
 
 We used a very small infrastructure footprint for this comparison test.
 
-![](https://startree.ai/wp-content/uploads/2024/08/1687549350-screen-shot-2023-06-22-at-1-32-51-pm.png)
+![](/static/images/blogs/external/1687549350-screen-shot-2023-06-22-at-1-32-51-pm.png)
 
 ## 4\. Query Results and Stats
 
@@ -148,7 +148,7 @@ limit 1000
 option(useStarTree=false, timeoutMs=20000)
 ```
 
-![](https://startree.ai/wp-content/uploads/2024/08/1684246716-image1.png)
+![](/static/images/blogs/external/1684246716-image1.png)
 
 Result: The query completed in 1,513 milliseconds. (~1.5s); from ~131s to ~1.5s was a BIG improvement. However, results still took more than a second — which is a relatively long time for an OLAP database, especially if it is faced with multiple concurrent queries.
 
@@ -176,7 +176,7 @@ limit 1000
 option(useStarTree=true)
 ```
 
-![](https://startree.ai/wp-content/uploads/2024/08/1684246852-image9.png)
+![](/static/images/blogs/external/1684246852-image9.png)
 
 Result: The query completed in 4 milliseconds! Notice in particular that the numDocsScanned came down from ~146M to 409!
 
@@ -184,7 +184,7 @@ Result: The query completed in 4 milliseconds! Notice in particular that the num
 
 Let’s take a closer look at the [query response stats](https://docs.pinot.apache.org/users/api/querying-pinot-using-standard-sql/response-format) across all three iterations to understand the “how” part of this magic of indexing in Apache Pinot.
 
-![](https://startree.ai/wp-content/uploads/2024/08/1684246748-image3.png)
+![](/static/images/blogs/external/1684246748-image3.png)
 
 1.  The dataset has 633,694,594 records (documents) spread across 130 segments.
 2.  Query Stats:
@@ -195,7 +195,7 @@ Let’s take a closer look at the [query response stats](https://docs.pinot.apac
 
 ## 5\. Impact Summary:
 
-![](https://startree.ai/wp-content/uploads/2024/08/1684246766-image4.png)
+![](/static/images/blogs/external/1684246766-image4.png)
 
 1.  356,968x improvement (or 99.999% drop) in num docs scanned from ~146M to 409.
 2.  378.5x improvement (~99.736% drop) in query latency from 1,513 ms to 4 ms.
diff --git a/data/blog/2023-05-18-apache-pinot-tutorial-for-getting-started-a-step-by-step-guide.mdx b/data/blog/2023-05-18-apache-pinot-tutorial-for-getting-started-a-step-by-step-guide.mdx
index 331dcbac..06d43d10 100644
--- a/data/blog/2023-05-18-apache-pinot-tutorial-for-getting-started-a-step-by-step-guide.mdx
+++ b/data/blog/2023-05-18-apache-pinot-tutorial-for-getting-started-a-step-by-step-guide.mdx
@@ -53,7 +53,7 @@ _Docker is a set of platform as a service (PaaS) products that use OS-level virt
 
 Now, let’s download the Docker image. On a Windows machine, start a new PowerShell command window. Note that this is not the same as a Windows PowerShell command window, as shown below.
 
-![Download Docker image on Windows with PowerShell command window](https://startree.ai/wp-content/uploads/2024/08/1684419409-image7.png 'Download Docker image on Windows with PowerShell command window')
+![Download Docker image on Windows with PowerShell command window](/static/images/blogs/external/1684419409-image7.png 'Download Docker image on Windows with PowerShell command window')
 
 Use the following command to get (pull) the image we are looking for:
 
@@ -79,7 +79,7 @@ docker images
 
 It should show you the image like so:
 
-![Docker images command](https://startree.ai/wp-content/uploads/2024/08/1684420004-image3.png 'Docker images command')
+![Docker images command](/static/images/blogs/external/1684420004-image3.png 'Docker images command')
 
 ### Step 3:
 
@@ -89,7 +89,7 @@ Let’s run a container using the Docker image that we downloaded:
 docker run -it --entrypoint /bin/bash -p 9000:9000 apachepinot.docker.scarf.sh/apachepinot/pinot:0.12.0
 ```
 
-![Running a container with downloaded Docker image](https://startree.ai/wp-content/uploads/2024/08/1684420103-image4.png 'Running a container with downloaded Docker image')
+![Running a container with downloaded Docker image](/static/images/blogs/external/1684420103-image4.png 'Running a container with downloaded Docker image')
 
 The docker run command runs the image. The \-p 9000:00 option maps the docker container port 9000 to the local machine port 9000. This allows us to access the Pinot UI, which defaults to port 9000 to be accessible from the localhost. We are using the –entrypoint to override the default entrypoint and replace it with Bash. We want to override the default behavior so that we can start each component one at a time. The next parameter apachepinot.docker.scarf.sh/apachepinot/pinot:0.12.0 is t [...]
 
@@ -97,7 +97,7 @@ After running the command, we’ll find ourselves in the Docker container instan
 
 If you’re using VS Code, with the Docker extension installed, you can click on the Docker extension and see our container and its content:
 
-![VS Code Docker extension open to see container and content](https://startree.ai/wp-content/uploads/2024/08/1684421493-image11.png 'VS Code Docker extension open to see container and content')
+![VS Code Docker extension open to see container and content](/static/images/blogs/external/1684421493-image11.png 'VS Code Docker extension open to see container and content')
 
 Click on the Docker icon in the left menu, and apachepinot.docker.scarf.sh/apachepinot/pinot:0.12.0. This should take a few seconds to connect to the running container. Now, you can navigate to the files and see what we have under the opt folder.
 
@@ -105,7 +105,7 @@ Click on the Docker icon in the left menu, and apachepinot.docker.scarf.sh/apach
 
 Let’s run the components that are essential to running a Pinot cluster. Change directory to the bin folder and list the contents like so:
 
-![Running components, directory changed to bin folder and contents listed](https://startree.ai/wp-content/uploads/2024/08/1684421611-image10.png 'Running components, directory changed to bin folder and contents listed')
+![Running components, directory changed to bin folder and contents listed](/static/images/blogs/external/1684421611-image10.png 'Running components, directory changed to bin folder and contents listed')
 
 In order to start the Pinot cluster, we will need to run the following essential components:
 
@@ -134,7 +134,7 @@ The controller controls the cluster health and coordinates with ZooKeeper for co
 
 At this time, we should have a running Pinot cluster. We can verify via the Pinot Data Explorer by browsing to localhost:9000. You should see something like this:
 
-![Pinot data explorer](https://startree.ai/wp-content/uploads/2024/08/1684419932-image2.png 'Pinot data explorer')
+![Pinot data explorer](/static/images/blogs/external/1684419932-image2.png 'Pinot data explorer')
 
 What just happened?
 
@@ -206,7 +206,7 @@ To create a schema and table for the baseball stats file, run the following comm
 
 You should now see the schema and table created:
 
-![Apache Pinot tables created](https://startree.ai/wp-content/uploads/2024/08/1684421406-image12.png 'Apache Pinot tables created')
+![Apache Pinot tables created](/static/images/blogs/external/1684421406-image12.png 'Apache Pinot tables created')
 
 Next, we’ll want to load some data into the table that we created. We have some sample data in the folder rawdata that we can use to load. We will need a YAML file to perform the actual ingestion job and can use the following command to import data:
 
@@ -217,11 +217,11 @@ Next, we’ll want to load some data into the table that we created. We have som
 
 If you run into trouble on this step like I did, edit the ingestJobSpec.yaml file using Docker Desktop to change the inputDirURI from relative to absolute path. Then rerun the above command.
 
-![Editing the .yaml file with Docker Desktop](https://startree.ai/wp-content/uploads/2024/08/1684419802-image1.png 'Editing the .yaml file with Docker Desktop')
+![Editing the .yaml file with Docker Desktop](/static/images/blogs/external/1684419802-image1.png 'Editing the .yaml file with Docker Desktop')
 
 You should now be able to see the table has been populated like so:
 
-![Apache Pinot table populated](https://startree.ai/wp-content/uploads/2024/08/1684421215-image8.png 'Apache Pinot table populated')
+![Apache Pinot table populated](/static/images/blogs/external/1684421215-image8.png 'Apache Pinot table populated')
 
 Now, let’s run some queries. From localhost:9000, select the Query Console in the left-hand menu. Then type in some of these queries:
 
@@ -232,7 +232,7 @@ select sum(runs), playerName from baseballStats group by playerName order by sum
 
 You should see results like so:
 
-![Apache Pinot query console](https://startree.ai/wp-content/uploads/2024/08/1684421163-image6.png 'Apache Pinot query console')
+![Apache Pinot query console](/static/images/blogs/external/1684421163-image6.png 'Apache Pinot query console')
 
 And there you have it!
 
@@ -240,11 +240,11 @@ And there you have it!
 
 If you’re curious to go a step further and see what the segments look like and what the actual data on disk looks like, keep reading! In the Tables section of localhost:9000, you can scroll down to find a segment:
 
-![Apache Pinot data on disk segment](https://startree.ai/wp-content/uploads/2024/08/1684421358-image9.png 'Apache Pinot data on disk segment')
+![Apache Pinot data on disk segment](/static/images/blogs/external/1684421358-image9.png 'Apache Pinot data on disk segment')
 
 Clicking on this gives the specifics of the segment:
 
-![Segment specifics in Pinot UI](https://startree.ai/wp-content/uploads/2024/08/1684420155-image5.png 'Segment specifics in Pinot UI')
+![Segment specifics in Pinot UI](/static/images/blogs/external/1684420155-image5.png 'Segment specifics in Pinot UI')
 
 Pinot allows you to easily inspect your segments and tables in one easy-to-use UI. You can find what’s where and keep an eye on size, location, number of documents, etc.
 
diff --git a/data/blog/2023-05-23-change-data-capture-with-apache-pinot-how-does-it-work.mdx b/data/blog/2023-05-23-change-data-capture-with-apache-pinot-how-does-it-work.mdx
index da006b46..49626aaf 100644
--- a/data/blog/2023-05-23-change-data-capture-with-apache-pinot-how-does-it-work.mdx
+++ b/data/blog/2023-05-23-change-data-capture-with-apache-pinot-how-does-it-work.mdx
@@ -18,11 +18,11 @@ NOTE: NoSQL databases also have the ability to perform CDC but may use other mec
 
 The WAL is an append-only, immutable stream of events designed to replicate its data to another instance of the data store for high availability in disaster recovery scenarios (see diagram below). The transactions occurring on the left data store (primary) get replicated to the data store to the right (secondary). The applications connect to the primary data store and replicate its data to the secondary data store. If the primary data store goes down, the application switches to the seco [...]
 
-![Primary data store transactions being replicated to a secondary data store](https://startree.ai/wp-content/uploads/2024/08/1684857872-image3.png 'Primary data store transactions being replicated to a secondary data store')
+![Primary data store transactions being replicated to a secondary data store](/static/images/blogs/external/1684857872-image3.png 'Primary data store transactions being replicated to a secondary data store')
 
 The following diagram shows an example of a WAL in a data store. New transactions get appended to the end of the WAL. The old transactions are on the left, and the newer transactions are on the right.
 
-![WAL in a data store with new transactions appended to the end of the WAL](https://startree.ai/wp-content/uploads/2024/08/1684857250-image5.png 'WAL in a data store with new transactions appended to the end of the WAL')
+![WAL in a data store with new transactions appended to the end of the WAL](/static/images/blogs/external/1684857250-image5.png 'WAL in a data store with new transactions appended to the end of the WAL')
 
 Change data capture enables you to listen to this WAL by capturing these transactions and sending them downstream for processing. The data processing occurs in a different system where we can view the latest version of each record in other applications. Because of the real-time nature of the data, the subscribing applications to the stream of transactions receive real-time transaction events.
 
@@ -38,7 +38,7 @@ Capturing change events requires specific knowledge of the database from which t
 
 Kafka connectors must run in a Kafka Connect cluster, a highly available and distributed system for running connectors. Kafka connectors cannot run on their own and require a server. The Debezium project provides a Debezium server that can also run Debezium connectors capable of writing to other event streaming platforms besides Kafka, for instance, Amazon Kinesis. The diagram below shows a Debezium connector reading the WAL and writing to a Debezium server. The Debezium server can then  [...]
 
-![Diagram showing a Debezium connector reading the WAL and writing to a Debezium server](https://startree.ai/wp-content/uploads/2024/08/1684857201-image4.png 'Diagram showing a Debezium connector reading the WAL and writing to a Debezium server')
+![Diagram showing a Debezium connector reading the WAL and writing to a Debezium server](/static/images/blogs/external/1684857201-image4.png 'Diagram showing a Debezium connector reading the WAL and writing to a Debezium server')
 
 ## Debezium Data Format
 
@@ -180,7 +180,7 @@ A FULL upsert means that a new record will replace the older record completely i
 
 PARTIAL only allows updates to specific columns and employs additional strategies.
 
-![Table describing the strategy and descriptions of stream ingestion with upsert](https://startree.ai/wp-content/uploads/2024/08/1684857317-image6.png 'Table describing the strategy and descriptions of stream ingestion with upsert')
+![Table describing the strategy and descriptions of stream ingestion with upsert](/static/images/blogs/external/1684857317-image6.png 'Table describing the strategy and descriptions of stream ingestion with upsert')
 
 Source: [Stream Ingestion with Upsert](https://docs.pinot.apache.org/basics/data-import/upsert)
 
diff --git a/data/blog/2023-05-30-how-to-ingest-streaming-data-from-kafka-to-apache-pinot.mdx b/data/blog/2023-05-30-how-to-ingest-streaming-data-from-kafka-to-apache-pinot.mdx
index 2bfbc4b5..0ddfa149 100644
--- a/data/blog/2023-05-30-how-to-ingest-streaming-data-from-kafka-to-apache-pinot.mdx
+++ b/data/blog/2023-05-30-how-to-ingest-streaming-data-from-kafka-to-apache-pinot.mdx
@@ -32,7 +32,7 @@ We will be installing Apache Kafka onto our already existing Pinot docker image.
 
 docker run -it --entrypoint /bin/bash -p 9000:9000 apachepinot.docker.scarf.sh/apachepinot/pinot:0.12.0
 
-![PowerShell 7.3.4 docker run Apache Pinot](https://startree.ai/wp-content/uploads/2024/08/1685462020-image1.png 'PowerShell 7.3.4 docker run Apache Pinot')
+![PowerShell 7.3.4 docker run Apache Pinot](/static/images/blogs/external/1685462020-image1.png 'PowerShell 7.3.4 docker run Apache Pinot')
 
 We want to override the ENTRYPOINT and run Bash script within the Docker image. If you already have a container running, you can skip this step. I tend to tear down containers after use, so in my case, I created a brand new container.
 
@@ -54,11 +54,11 @@ Run each of the commands one at a time. The & allows you to continue using the s
 
 It should look like this:
 
-![Docker with container ID, Image, Command, and Created](https://startree.ai/wp-content/uploads/2024/08/1685462274-image7.png 'Docker with container ID, Image, Command, and Created')
+![Docker with container ID, Image, Command, and Created](/static/images/blogs/external/1685462274-image7.png 'Docker with container ID, Image, Command, and Created')
 
 You can now browse to [http://localhost:9000/#/zookeeper](http://localhost:9000/#/zookeeper) to see the running cluster:
 
-![Empty Zookeeper Browser](https://startree.ai/wp-content/uploads/2024/08/1685462203-image5.png 'Empty Zookeeper Browser')
+![Empty Zookeeper Browser](/static/images/blogs/external/1685462203-image5.png 'Empty Zookeeper Browser')
 
 ### Step 2: Install Kafka on the Docker container
 
@@ -75,7 +75,7 @@ curl https://downloads.apache.org/kafka/3.4.0/kafka_2.12-3.4.0.tgz --output kafk
 
 It should look this:
 
-![Code with Apache Pinot speed results](https://startree.ai/wp-content/uploads/2024/08/1685462322-image8.png 'Code with Apache Pinot speed results')
+![Code with Apache Pinot speed results](/static/images/blogs/external/1685462322-image8.png 'Code with Apache Pinot speed results')
 
 Note that we’ve changed the directory to keep the Kafka folder separate from the Pinot folder.
 
@@ -89,9 +89,9 @@ rm -rf kafka.tgz
 
 It should look like this:
 
-![Code with Apache Kafka](https://startree.ai/wp-content/uploads/2024/08/1685462061-image2.png 'Code with Apache Kafka')
+![Code with Apache Kafka](/static/images/blogs/external/1685462061-image2.png 'Code with Apache Kafka')
 
-![Code with kafka version](https://startree.ai/wp-content/uploads/2024/08/1685462480-image12.png 'Code with kafka version')
+![Code with kafka version](/static/images/blogs/external/1685462480-image12.png 'Code with kafka version')
 
 Now, Kafka and Pinot reside locally on our Docker container with Pinot up and running. Let’s run the Kafka service. Kafka will use the existing ZooKeeper for configuration management.
 
@@ -104,11 +104,11 @@ cd kafka
 
 It should look like this:
 
-![Code with cd kafka](https://startree.ai/wp-content/uploads/2024/08/1685462400-image10.png 'Code with cd kafka')
+![Code with cd kafka](/static/images/blogs/external/1685462400-image10.png 'Code with cd kafka')
 
 To verify that Kafka is running, let’s look at our ZooKeeper configs by browsing to [http://localhost:9000/#/zookeeper:](http://localhost:9000/#/zookeeper)
 
-![Zookeeper Browser](https://startree.ai/wp-content/uploads/2024/08/1685462099-image3.png 'Zookeeper Browser')
+![Zookeeper Browser](/static/images/blogs/external/1685462099-image3.png 'Zookeeper Browser')
 
 You may have to refresh the page and find many more configuration items appear thanexpectedt. These are Kafka configurations.
 
@@ -128,7 +128,7 @@ mkdir events
 
 It should look like this:
 
-![Code with realtime](https://startree.ai/wp-content/uploads/2024/08/1685462150-image4.png 'Code with realtime')
+![Code with realtime](/static/images/blogs/external/1685462150-image4.png 'Code with realtime')
 
 You may have to start a new PowerShell window and connect to Docker for this. Now, let’s install Node.js and any dependencies we might need for the event consumption script:
 
@@ -207,15 +207,15 @@ node wikievents.js
 
 Use Ctrl-C to stop the program. Navigate to the events folder to see some new folders created with the various language events downloaded from Wikipedia.
 
-![Wikievents node in code](https://startree.ai/wp-content/uploads/2024/08/1685462366-image9.png 'Wikievents node in code')
+![Wikievents node in code](/static/images/blogs/external/1685462366-image9.png 'Wikievents node in code')
 
 Navigate to the enwiki folder and review some of the downloaded JSON files.
 
-![Code with realtime wikievents](https://startree.ai/wp-content/uploads/2024/08/1685462441-image11.png 'Code with realtime wikievents')
+![Code with realtime wikievents](/static/images/blogs/external/1685462441-image11.png 'Code with realtime wikievents')
 
 At http://localhost:9000/#/zookeeper, you can find the Kafka topic by locating the ZooKeeper config and expanding config > topics. You may have to refresh your browser.
 
-![Zookeeper browser in Apache Pinot topics](https://startree.ai/wp-content/uploads/2024/08/1685462510-image13.png 'Zookeeper browser in Apache Pinot topics')
+![Zookeeper browser in Apache Pinot topics](/static/images/blogs/external/1685462510-image13.png 'Zookeeper browser in Apache Pinot topics')
 
 Here, you should see the wikipedia-events topic that we created using the Node.js script. So far, so good.
 
@@ -374,7 +374,7 @@ Now, browse to the following location [http://localhost:9000/#/tables,](http://l
 
 Run the node wikievents.js command, then query the newly created wikievents table to see the totalDocs increase in real time:
 
-![Apache Pinot query console](https://startree.ai/wp-content/uploads/2024/08/1685462248-image6.png 'Apache Pinot query console')
+![Apache Pinot query console](/static/images/blogs/external/1685462248-image6.png 'Apache Pinot query console')
 
 To avoid running out of space on your computer, make sure to stop the wikievents.js script when you’re done :-D
 
diff --git a/data/blog/2023-06-01-real-time-mastodon-usage-with-apache-kafka-apache-pinot-and-streamlit.mdx b/data/blog/2023-06-01-real-time-mastodon-usage-with-apache-kafka-apache-pinot-and-streamlit.mdx
index 12b11d07..e53df1db 100644
--- a/data/blog/2023-06-01-real-time-mastodon-usage-with-apache-kafka-apache-pinot-and-streamlit.mdx
+++ b/data/blog/2023-06-01-real-time-mastodon-usage-with-apache-kafka-apache-pinot-and-streamlit.mdx
@@ -39,7 +39,7 @@ To start, Simon wrote a listener to collect the messages, which he then publishe
 
 Finally, he queried those Parquet files using DuckDB and created some charts using the Seaborn library, as reflected in the architecture diagram below:
 
-![Flowchart of data collection to data processing](https://startree.ai/wp-content/uploads/2024/08/1685637607-image1.png 'Flowchart of data collection to data processing')
+![Flowchart of data collection to data processing](/static/images/blogs/external/1685637607-image1.png 'Flowchart of data collection to data processing')
 
 Fig: [Data Collection Architecture](https://simonaubury.com/posts/202302_mastodon_duckdb/)
 
@@ -49,7 +49,7 @@ The awesome visualizations that Simon created make me wonder whether we can chan
 
 Now [Apache Pinot](https://startree.ai/resources/what-is-apache-pinot) comes into the picture. Instead of using Kafka Connect to batch Mastodon toots into groups of 1,000 messages to generate Parquet files, we can stream the data immediately and directly, toot-by-toot into Pinot and then build a real-time dashboard using Streamlit:
 
-![Data collection in Mastodon, followed by processing in Apache Kafka, Apache Pinot, and Streamlit](https://startree.ai/wp-content/uploads/2024/08/1685637507-image4.png 'Data collection in Mastodon, followed by processing in Apache Kafka, Apache Pinot, and Streamlit')
+![Data collection in Mastodon, followed by processing in Apache Kafka, Apache Pinot, and Streamlit](/static/images/blogs/external/1685637507-image4.png 'Data collection in Mastodon, followed by processing in Apache Kafka, Apache Pinot, and Streamlit')
 
 ## Setup
 
@@ -191,7 +191,7 @@ We can then navigate to the table page of the Pinot UI:
 
 Here, we’ll see the following:
 
-![Apache Pinot table config and schema](https://startree.ai/wp-content/uploads/2024/08/1685637837-image6.png 'Apache Pinot table config and schema')
+![Apache Pinot table config and schema](/static/images/blogs/external/1685637837-image6.png 'Apache Pinot table config and schema')
 
 ## Ingest Data into Kafka
 
@@ -221,7 +221,7 @@ Now, let’s go to the Pinot UI to see what data we’ve got to play with:
 
 We’ll see the following preview of the data in the mastodon table:
 
-![SQL Editor, query response stats, and query result in Apache Pinot](https://startree.ai/wp-content/uploads/2024/08/1685637772-image5.png 'SQL Editor, query response stats, and query result in Apache Pinot')
+![SQL Editor, query response stats, and query result in Apache Pinot](/static/images/blogs/external/1685637772-image5.png 'SQL Editor, query response stats, and query result in Apache Pinot')
 
 We can then write a query to find the number of messages posted in the last five minutes:
 
@@ -234,7 +234,7 @@ where created_at*1000 > ago('PT1M')
 order by 1 DESC;
 ```
 
-![Query results for toots, users, and urls](https://startree.ai/wp-content/uploads/2024/08/1685637909-image8.png 'Query results for toots, users, and urls')
+![Query results for toots, users, and urls](/static/images/blogs/external/1685637909-image8.png 'Query results for toots, users, and urls')
 
 We can also query Pinot via the Python client, which we can install by running the following:
 
@@ -283,19 +283,19 @@ I’ve created a Streamlit app in the file [app.py](https://github.com/mneedham/
 
 First, we’ll create metrics to show the number of toots, users, and URLs in the last _n_ minutes. _n_ will be configurable from the app as shown in the screenshot below:
 
-![Chart of real-time Mastodon usage](https://startree.ai/wp-content/uploads/2024/08/1685637876-image7.png 'Chart of real-time Mastodon usage')
+![Chart of real-time Mastodon usage](/static/images/blogs/external/1685637876-image7.png 'Chart of real-time Mastodon usage')
 
 From the screenshot, we can identify mastodon.cloud as the most active server, though it produces only 1,800 messages in 10 minutes or three messages per second. The values in green indicate the change in values compared to the previous 10 minutes.
 
 We can also create a chart showing the number of messages per minute for the last 10 minutes:
 
-![Time of day Mastodon usage](https://startree.ai/wp-content/uploads/2024/08/1685637945-image9.png 'Time of day Mastodon usage')
+![Time of day Mastodon usage](/static/images/blogs/external/1685637945-image9.png 'Time of day Mastodon usage')
 
 Based on this chart, we can see that we’re creating anywhere from 200–900 messages per second. Part of the reason lies in the fact that the Mastodon servers sometimes disconnect our listener, and at the moment, I have to manually reconnect.
 
 Finally, we can look at the toot length by language:
 
-![Chart of toot length by language usage](https://startree.ai/wp-content/uploads/2024/08/1685637644-image2.png 'Chart of toot length by language usage')
+![Chart of toot length by language usage](/static/images/blogs/external/1685637644-image2.png 'Chart of toot length by language usage')
 
 We see much bigger ranges here than Simon saw in his analysis. He saw a maximum length of 200 characters, whereas we see some messages of up to 4,200 characters.
 
diff --git a/data/blog/2023-07-12-star-tree-index-in-apache-pinot-part-3-understanding-the-impact-in-real-customer.mdx b/data/blog/2023-07-12-star-tree-index-in-apache-pinot-part-3-understanding-the-impact-in-real-customer.mdx
index 2a5328c7..15348b12 100644
--- a/data/blog/2023-07-12-star-tree-index-in-apache-pinot-part-3-understanding-the-impact-in-real-customer.mdx
+++ b/data/blog/2023-07-12-star-tree-index-in-apache-pinot-part-3-understanding-the-impact-in-real-customer.mdx
@@ -70,7 +70,7 @@ This is exactly the type of scenario that the [Star-Tree Index](https://docs.pin
 -   99.76% reduction in latency vs. no Star-Tree Index (6.3 seconds to 15 ms)
 -   99.99999% reduction in amount of data scanned/aggregated per query (> 1.8B docs to < 2,400)
 
-![Visualization of the impact of start-tree index for an AdTech use case with Apache Pinot](https://startree.ai/wp-content/uploads/2024/08/1689174701-image1.png)
+![Visualization of the impact of start-tree index for an AdTech use case with Apache Pinot](/static/images/blogs/external/1689174701-image1.png)
 
 ## CyberSecurity Use Case:
 
@@ -105,7 +105,7 @@ Given the overhead while doing complex aggregations, efficient filtering (indexe
 -   99.9998% reduction in data scanned/aggregated per query
 -   Happy Customer 😃
 
-![Visualization of the impact of star-tree index for a Cybersecurity use case with Apache Pinot](https://startree.ai/wp-content/uploads/2024/08/1689175033-image4.png)
+![Visualization of the impact of star-tree index for a Cybersecurity use case with Apache Pinot](/static/images/blogs/external/1689175033-image4.png)
 
 ## Multiplayer Game Leaderboard Use Case
 
@@ -131,11 +131,11 @@ Given the overhead while doing complex aggregations, efficient filtering (indexe
 
 -   95.70% improvement in query performance as a result of 99.9962% reduction in number of documents and entries scanned.
 
-![Visualization of the impact of star-tree index for a Gaming use case with Apache Pinot](https://startree.ai/wp-content/uploads/2024/08/1689175176-image2.png)
+![Visualization of the impact of star-tree index for a Gaming use case with Apache Pinot](/static/images/blogs/external/1689175176-image2.png)
 
 ## Quick Recap: Star-Tree Index Performance Improvements
 
-![Recap Table of the Impact that star-tree index had on three real-world customers using Apache Pinot™](https://startree.ai/wp-content/uploads/2024/08/1689175271-image3.png)
+![Recap Table of the Impact that star-tree index had on three real-world customers using Apache Pinot™](/static/images/blogs/external/1689175271-image3.png)
 
 -   99.99% reduction in data scanned/aggregated per query
 -   95 to 99% improvement in query performance
diff --git a/data/blog/2024-12-20-apache-pinot-year-in-review-2024.mdx b/data/blog/2024-12-20-apache-pinot-year-in-review-2024.mdx
index 46f49377..b6713ba6 100644
--- a/data/blog/2024-12-20-apache-pinot-year-in-review-2024.mdx
+++ b/data/blog/2024-12-20-apache-pinot-year-in-review-2024.mdx
@@ -17,7 +17,7 @@ tags:
     ]
 ---
 
-![Apache Pinot: One of 2024’s Top 3 Big Data and AI Open Source Projects to Watch!](https://startree.ai/_next/image?url=https%3A%2F%2Fstartree.wpenginepowered.com%2Fwp-content%2Fuploads%2F2024%2F12%2FPinot-YearinReview24-8.png&w=3840&q=75)
+![Apache Pinot: One of 2024’s Top 3 Big Data and AI Open Source Projects to Watch!](/static/images/blogs/external/Pinot-YearinReview24-8.png)
 
 Discover Apache Pinot’s 2024 highlights, including community milestones, performance enhancements, and new integration capabilities. This retrospective offers insight into Pinot’s growth and a glimpse of its roadmap, showcasing how real-time analytics continues to evolve.
 
diff --git a/data/blog/2025-03-05-Secure-and-low-latency-queries-with-raft-data-platform.mdx b/data/blog/2025-03-05-Secure-and-low-latency-queries-with-raft-data-platform.mdx
deleted file mode 100644
index 9c99937e..00000000
--- a/data/blog/2025-03-05-Secure-and-low-latency-queries-with-raft-data-platform.mdx
+++ /dev/null
@@ -1,23 +0,0 @@
----
-title: 'Secure & Low-Latency Queries at scale with Raft Data Platform - [R]DP'
-date: 2025-03-05
-authors: ['sharma', 'zych']
-summary: 'Explore how the Raft Data Platform (RDP) meets the growing demands for secure, high-performance data analytics at scale, with flexible architecture, advanced capabilities, and a vision for the future of real-time insights.'
-
-tags:
-    [
-        data platform,
-        real-time analytics,
-        open source,
-        security,
-        cloud infrastructure,
-        data ingestion,
-        scalability
-    ]
----
-
-![RDP: Secure & Low-Latency Queries at Scale](https://teamraft.com/wp-content/uploads/Raft-RDP-Blog-Post-Thumbnail-@2x.jpg)
-
-Discover how the Raft Data Platform (RDP) delivers secure, low-latency data queries at scale by leveraging cutting-edge technology and a robust, open source foundation. This blog post dives into RDP’s multi-layered security features, performance-optimized architecture, and commitment to community-driven innovation. Gain insights into how RDP addresses real-time analytics challenges while maintaining cost efficiency and flexibility, and learn about its evolving roadmap for the future of d [...]
-
-Read more at [TeamRaft](https://teamraft.com/resources/insights/secure-low-latency-queries-at-scale-with-raft-data-platform-rdp/)
diff --git a/data/blog/2025-09-30-Announce-Pinot-1-4.mdx b/data/blog/2025-09-30-Announce-Pinot-1-4.mdx
new file mode 100644
index 00000000..9664b36c
--- /dev/null
+++ b/data/blog/2025-09-30-Announce-Pinot-1-4.mdx
@@ -0,0 +1,28 @@
+---
+title: 'Announcing Apache Pinot 1.4'
+date: 2025-09-30
+authors: ['qiaochu']
+summary: 'Another packed release with more improvements for real-time analytics with Apache Pinot.'
+
+tags: [Apache Pinot, releases, real-time analytics, open source, community updates]
+---
+
+We are pleased to announce that Apache Pinot 1.4.0 has been released!
+
+Apache Pinot is a realtime distributed OLAP datastore, designed to answer OLAP queries with low latency use-cases.
+
+This release(1.4.0) delivers significant improvements including:
+
+-   There's an all new query mode added for running Multistage Engine queries against Pinot, heavily inspired from Uber's Presto over Pinot query architecture. A new query optimizer for the Multistage Engine can automatically eliminate or simplify redundant Exchanges. We aim to make this query optimizer the default in future versions. Plus several other significant improvements to the engine.
+-   Pauseless Consumption is introduced in Pinot 1.4.0, it enhances real-time analytics by minimizing ingestion delays and improving data freshness in Apache Pinot.
+-   Time Series Engine - Introduced support for ASOF JOIN, allowing time-aligned joins commonly used in time-series analytics. This unlocks use cases where approximate matches based on time proximity are required.
+-   Logical Table support,
+-   Upsert and Deduplication Enhancement
+-   Minion Jobs (including smallSegmentMerger)
+-   Rebalancing capabilities
+
+This release also includes numerous smaller features and general bug fixes.
+
+The release can be downloaded at https://pinot.apache.org/download
+
+The release notes are available at https://github.com/apache/pinot/releases
diff --git a/data/siteMetadata.js b/data/siteMetadata.js
index 79800c15..ca0b7b06 100644
--- a/data/siteMetadata.js
+++ b/data/siteMetadata.js
@@ -111,8 +111,10 @@ const siteMetadata = {
         }
     },
     announcement: {
-        buttonText: 'learn more',
-        link: 'https://github.com/apache/pinot/releases/tag/release-1.4.0'
+        text: 'Feb 11 - Online Meetup: Query, Ingestion, and Apache Pinot Core:  ',
+        buttonText: 'RSVP Here',
+        link: 'https://www.meetup.com/apache-pinot/events/313131111/',
+        expiresAfter: '2026-02-12'
     },
     youtubeShare: {
         heading: 'Share Your Knowledge on Apache Pinot YouTube channel!',
diff --git a/next.config.js b/next.config.js
index 16a65d52..d45b9eb0 100644
--- a/next.config.js
+++ b/next.config.js
@@ -19,6 +19,7 @@ module.exports = () => {
             dirs: ['app', 'components', 'layouts', 'scripts']
         },
         images: {
+            unoptimized: true,
             remotePatterns: [
                 {
                     protocol: 'https',
diff --git a/public/static/images/blogs/external/1661700264-entities-emitting-data.png b/public/static/images/blogs/external/1661700264-entities-emitting-data.png
new file mode 100644
index 00000000..bf247ecc
Binary files /dev/null and b/public/static/images/blogs/external/1661700264-entities-emitting-data.png differ
diff --git a/public/static/images/blogs/external/1661700333-parking-data-table.png b/public/static/images/blogs/external/1661700333-parking-data-table.png
new file mode 100644
index 00000000..85e57a70
Binary files /dev/null and b/public/static/images/blogs/external/1661700333-parking-data-table.png differ
diff --git a/public/static/images/blogs/external/1661700377-30-min-bucket-example.png b/public/static/images/blogs/external/1661700377-30-min-bucket-example.png
new file mode 100644
index 00000000..aee877a4
Binary files /dev/null and b/public/static/images/blogs/external/1661700377-30-min-bucket-example.png differ
diff --git a/public/static/images/blogs/external/1661700439-innermost-sql.png b/public/static/images/blogs/external/1661700439-innermost-sql.png
new file mode 100644
index 00000000..24a558d0
Binary files /dev/null and b/public/static/images/blogs/external/1661700439-innermost-sql.png differ
diff --git a/public/static/images/blogs/external/1661700473-second-most.png b/public/static/images/blogs/external/1661700473-second-most.png
new file mode 100644
index 00000000..302a2f1d
Binary files /dev/null and b/public/static/images/blogs/external/1661700473-second-most.png differ
diff --git a/public/static/images/blogs/external/1661700517-outermost.png b/public/static/images/blogs/external/1661700517-outermost.png
new file mode 100644
index 00000000..8b7402e1
Binary files /dev/null and b/public/static/images/blogs/external/1661700517-outermost.png differ
diff --git a/public/static/images/blogs/external/1661700601-gapfill-steps.png b/public/static/images/blogs/external/1661700601-gapfill-steps.png
new file mode 100644
index 00000000..1dba1b8f
Binary files /dev/null and b/public/static/images/blogs/external/1661700601-gapfill-steps.png differ
diff --git a/public/static/images/blogs/external/1661700642-execution-plan.png b/public/static/images/blogs/external/1661700642-execution-plan.png
new file mode 100644
index 00000000..18ac6fad
Binary files /dev/null and b/public/static/images/blogs/external/1661700642-execution-plan.png differ
diff --git a/public/static/images/blogs/external/1661700716-challenges.png b/public/static/images/blogs/external/1661700716-challenges.png
new file mode 100644
index 00000000..8ecbef22
Binary files /dev/null and b/public/static/images/blogs/external/1661700716-challenges.png differ
diff --git a/public/static/images/blogs/external/1667915561-image1-edittable.png b/public/static/images/blogs/external/1667915561-image1-edittable.png
new file mode 100644
index 00000000..bad22d01
Binary files /dev/null and b/public/static/images/blogs/external/1667915561-image1-edittable.png differ
diff --git a/public/static/images/blogs/external/1667915654-image3.png b/public/static/images/blogs/external/1667915654-image3.png
new file mode 100644
index 00000000..531082c7
Binary files /dev/null and b/public/static/images/blogs/external/1667915654-image3.png differ
diff --git a/public/static/images/blogs/external/1667915996-image7.png b/public/static/images/blogs/external/1667915996-image7.png
new file mode 100644
index 00000000..069aec6f
Binary files /dev/null and b/public/static/images/blogs/external/1667915996-image7.png differ
diff --git a/public/static/images/blogs/external/1667916147-image6.png b/public/static/images/blogs/external/1667916147-image6.png
new file mode 100644
index 00000000..c7f25c61
Binary files /dev/null and b/public/static/images/blogs/external/1667916147-image6.png differ
diff --git a/public/static/images/blogs/external/1667916232-image2.png b/public/static/images/blogs/external/1667916232-image2.png
new file mode 100644
index 00000000..a46b4041
Binary files /dev/null and b/public/static/images/blogs/external/1667916232-image2.png differ
diff --git a/public/static/images/blogs/external/1668701275-image4.png b/public/static/images/blogs/external/1668701275-image4.png
new file mode 100644
index 00000000..cf60b312
Binary files /dev/null and b/public/static/images/blogs/external/1668701275-image4.png differ
diff --git a/public/static/images/blogs/external/1668701353-image1.png b/public/static/images/blogs/external/1668701353-image1.png
new file mode 100644
index 00000000..f63e309d
Binary files /dev/null and b/public/static/images/blogs/external/1668701353-image1.png differ
diff --git a/public/static/images/blogs/external/1668701512-image3.png b/public/static/images/blogs/external/1668701512-image3.png
new file mode 100644
index 00000000..a54780a6
Binary files /dev/null and b/public/static/images/blogs/external/1668701512-image3.png differ
diff --git a/public/static/images/blogs/external/1668701654-image5.png b/public/static/images/blogs/external/1668701654-image5.png
new file mode 100644
index 00000000..af5a67e8
Binary files /dev/null and b/public/static/images/blogs/external/1668701654-image5.png differ
diff --git a/public/static/images/blogs/external/1668701727-image2.png b/public/static/images/blogs/external/1668701727-image2.png
new file mode 100644
index 00000000..7db2fbb7
Binary files /dev/null and b/public/static/images/blogs/external/1668701727-image2.png differ
diff --git a/public/static/images/blogs/external/1669132979-image3.png b/public/static/images/blogs/external/1669132979-image3.png
new file mode 100644
index 00000000..16858722
Binary files /dev/null and b/public/static/images/blogs/external/1669132979-image3.png differ
diff --git a/public/static/images/blogs/external/1669133004-image1.png b/public/static/images/blogs/external/1669133004-image1.png
new file mode 100644
index 00000000..300df44d
Binary files /dev/null and b/public/static/images/blogs/external/1669133004-image1.png differ
diff --git a/public/static/images/blogs/external/1669133027-image6.png b/public/static/images/blogs/external/1669133027-image6.png
new file mode 100644
index 00000000..2c887b7d
Binary files /dev/null and b/public/static/images/blogs/external/1669133027-image6.png differ
diff --git a/public/static/images/blogs/external/1669133059-image5.png b/public/static/images/blogs/external/1669133059-image5.png
new file mode 100644
index 00000000..72d86d59
Binary files /dev/null and b/public/static/images/blogs/external/1669133059-image5.png differ
diff --git a/public/static/images/blogs/external/1669133083-image4.png b/public/static/images/blogs/external/1669133083-image4.png
new file mode 100644
index 00000000..bc7a5043
Binary files /dev/null and b/public/static/images/blogs/external/1669133083-image4.png differ
diff --git a/public/static/images/blogs/external/1669133112-image2.png b/public/static/images/blogs/external/1669133112-image2.png
new file mode 100644
index 00000000..3f9c1fa0
Binary files /dev/null and b/public/static/images/blogs/external/1669133112-image2.png differ
diff --git a/public/static/images/blogs/external/1669668611-image2.png b/public/static/images/blogs/external/1669668611-image2.png
new file mode 100644
index 00000000..5fb2c5e5
Binary files /dev/null and b/public/static/images/blogs/external/1669668611-image2.png differ
diff --git a/public/static/images/blogs/external/1669733133-pinot_0-11-realtime_injestion-diagram-v1.png b/public/static/images/blogs/external/1669733133-pinot_0-11-realtime_injestion-diagram-v1.png
new file mode 100644
index 00000000..eceb1390
Binary files /dev/null and b/public/static/images/blogs/external/1669733133-pinot_0-11-realtime_injestion-diagram-v1.png differ
diff --git a/public/static/images/blogs/external/1673273173-image4.png b/public/static/images/blogs/external/1673273173-image4.png
new file mode 100644
index 00000000..9678df8b
Binary files /dev/null and b/public/static/images/blogs/external/1673273173-image4.png differ
diff --git a/public/static/images/blogs/external/1673273248-image3.png b/public/static/images/blogs/external/1673273248-image3.png
new file mode 100644
index 00000000..01bbb246
Binary files /dev/null and b/public/static/images/blogs/external/1673273248-image3.png differ
diff --git a/public/static/images/blogs/external/1673273272-pinot_0-11-de-duplication-diagram_1-v2.png b/public/static/images/blogs/external/1673273272-pinot_0-11-de-duplication-diagram_1-v2.png
new file mode 100644
index 00000000..567c01c6
Binary files /dev/null and b/public/static/images/blogs/external/1673273272-pinot_0-11-de-duplication-diagram_1-v2.png differ
diff --git a/public/static/images/blogs/external/1673273289-pinot_0-11-de-duplication-diagram_2-v3.png b/public/static/images/blogs/external/1673273289-pinot_0-11-de-duplication-diagram_2-v3.png
new file mode 100644
index 00000000..8f83303d
Binary files /dev/null and b/public/static/images/blogs/external/1673273289-pinot_0-11-de-duplication-diagram_2-v3.png differ
diff --git a/public/static/images/blogs/external/1676991003-image2.png b/public/static/images/blogs/external/1676991003-image2.png
new file mode 100644
index 00000000..075f5005
Binary files /dev/null and b/public/static/images/blogs/external/1676991003-image2.png differ
diff --git a/public/static/images/blogs/external/1680190272-image2.png b/public/static/images/blogs/external/1680190272-image2.png
new file mode 100644
index 00000000..faa5e13a
Binary files /dev/null and b/public/static/images/blogs/external/1680190272-image2.png differ
diff --git a/public/static/images/blogs/external/1680190286-image1.png b/public/static/images/blogs/external/1680190286-image1.png
new file mode 100644
index 00000000..6620849d
Binary files /dev/null and b/public/static/images/blogs/external/1680190286-image1.png differ
diff --git a/public/static/images/blogs/external/1683813508-image5.png b/public/static/images/blogs/external/1683813508-image5.png
new file mode 100644
index 00000000..3ee1dc6a
Binary files /dev/null and b/public/static/images/blogs/external/1683813508-image5.png differ
diff --git a/public/static/images/blogs/external/1683813581-image1.png b/public/static/images/blogs/external/1683813581-image1.png
new file mode 100644
index 00000000..d1e582f5
Binary files /dev/null and b/public/static/images/blogs/external/1683813581-image1.png differ
diff --git a/public/static/images/blogs/external/1683813641-image7.png b/public/static/images/blogs/external/1683813641-image7.png
new file mode 100644
index 00000000..c85385b3
Binary files /dev/null and b/public/static/images/blogs/external/1683813641-image7.png differ
diff --git a/public/static/images/blogs/external/1683813705-image3.png b/public/static/images/blogs/external/1683813705-image3.png
new file mode 100644
index 00000000..53c0ef6a
Binary files /dev/null and b/public/static/images/blogs/external/1683813705-image3.png differ
diff --git a/public/static/images/blogs/external/1683813749-image4.png b/public/static/images/blogs/external/1683813749-image4.png
new file mode 100644
index 00000000..a66e7b45
Binary files /dev/null and b/public/static/images/blogs/external/1683813749-image4.png differ
diff --git a/public/static/images/blogs/external/1683813802-image2.png b/public/static/images/blogs/external/1683813802-image2.png
new file mode 100644
index 00000000..80d04602
Binary files /dev/null and b/public/static/images/blogs/external/1683813802-image2.png differ
diff --git a/public/static/images/blogs/external/1683813851-image6.png b/public/static/images/blogs/external/1683813851-image6.png
new file mode 100644
index 00000000..3b8792cb
Binary files /dev/null and b/public/static/images/blogs/external/1683813851-image6.png differ
diff --git a/public/static/images/blogs/external/1684246698-image5.png b/public/static/images/blogs/external/1684246698-image5.png
new file mode 100644
index 00000000..ff19d0d6
Binary files /dev/null and b/public/static/images/blogs/external/1684246698-image5.png differ
diff --git a/public/static/images/blogs/external/1684246716-image1.png b/public/static/images/blogs/external/1684246716-image1.png
new file mode 100644
index 00000000..5bf15f9d
Binary files /dev/null and b/public/static/images/blogs/external/1684246716-image1.png differ
diff --git a/public/static/images/blogs/external/1684246732-image2.png b/public/static/images/blogs/external/1684246732-image2.png
new file mode 100644
index 00000000..172d248d
Binary files /dev/null and b/public/static/images/blogs/external/1684246732-image2.png differ
diff --git a/public/static/images/blogs/external/1684246748-image3.png b/public/static/images/blogs/external/1684246748-image3.png
new file mode 100644
index 00000000..804ca2ef
Binary files /dev/null and b/public/static/images/blogs/external/1684246748-image3.png differ
diff --git a/public/static/images/blogs/external/1684246766-image4.png b/public/static/images/blogs/external/1684246766-image4.png
new file mode 100644
index 00000000..4adbc3dc
Binary files /dev/null and b/public/static/images/blogs/external/1684246766-image4.png differ
diff --git a/public/static/images/blogs/external/1684246806-image7.png b/public/static/images/blogs/external/1684246806-image7.png
new file mode 100644
index 00000000..be389c48
Binary files /dev/null and b/public/static/images/blogs/external/1684246806-image7.png differ
diff --git a/public/static/images/blogs/external/1684246816-image6.png b/public/static/images/blogs/external/1684246816-image6.png
new file mode 100644
index 00000000..738fc18a
Binary files /dev/null and b/public/static/images/blogs/external/1684246816-image6.png differ
diff --git a/public/static/images/blogs/external/1684246852-image9.png b/public/static/images/blogs/external/1684246852-image9.png
new file mode 100644
index 00000000..02bb4024
Binary files /dev/null and b/public/static/images/blogs/external/1684246852-image9.png differ
diff --git a/public/static/images/blogs/external/1684246872-image10.png b/public/static/images/blogs/external/1684246872-image10.png
new file mode 100644
index 00000000..ff94e28e
Binary files /dev/null and b/public/static/images/blogs/external/1684246872-image10.png differ
diff --git a/public/static/images/blogs/external/1684419409-image7.png b/public/static/images/blogs/external/1684419409-image7.png
new file mode 100644
index 00000000..ef57d6ca
Binary files /dev/null and b/public/static/images/blogs/external/1684419409-image7.png differ
diff --git a/public/static/images/blogs/external/1684419802-image1.png b/public/static/images/blogs/external/1684419802-image1.png
new file mode 100644
index 00000000..2fa97867
Binary files /dev/null and b/public/static/images/blogs/external/1684419802-image1.png differ
diff --git a/public/static/images/blogs/external/1684419932-image2.png b/public/static/images/blogs/external/1684419932-image2.png
new file mode 100644
index 00000000..2c8def58
Binary files /dev/null and b/public/static/images/blogs/external/1684419932-image2.png differ
diff --git a/public/static/images/blogs/external/1684420004-image3.png b/public/static/images/blogs/external/1684420004-image3.png
new file mode 100644
index 00000000..51dbabc3
Binary files /dev/null and b/public/static/images/blogs/external/1684420004-image3.png differ
diff --git a/public/static/images/blogs/external/1684420103-image4.png b/public/static/images/blogs/external/1684420103-image4.png
new file mode 100644
index 00000000..9ee18d0e
Binary files /dev/null and b/public/static/images/blogs/external/1684420103-image4.png differ
diff --git a/public/static/images/blogs/external/1684420155-image5.png b/public/static/images/blogs/external/1684420155-image5.png
new file mode 100644
index 00000000..a6c1f4f8
Binary files /dev/null and b/public/static/images/blogs/external/1684420155-image5.png differ
diff --git a/public/static/images/blogs/external/1684421163-image6.png b/public/static/images/blogs/external/1684421163-image6.png
new file mode 100644
index 00000000..0e4fd300
Binary files /dev/null and b/public/static/images/blogs/external/1684421163-image6.png differ
diff --git a/public/static/images/blogs/external/1684421215-image8.png b/public/static/images/blogs/external/1684421215-image8.png
new file mode 100644
index 00000000..da294860
Binary files /dev/null and b/public/static/images/blogs/external/1684421215-image8.png differ
diff --git a/public/static/images/blogs/external/1684421358-image9.png b/public/static/images/blogs/external/1684421358-image9.png
new file mode 100644
index 00000000..edadd073
Binary files /dev/null and b/public/static/images/blogs/external/1684421358-image9.png differ
diff --git a/public/static/images/blogs/external/1684421406-image12.png b/public/static/images/blogs/external/1684421406-image12.png
new file mode 100644
index 00000000..ce82110a
Binary files /dev/null and b/public/static/images/blogs/external/1684421406-image12.png differ
diff --git a/public/static/images/blogs/external/1684421493-image11.png b/public/static/images/blogs/external/1684421493-image11.png
new file mode 100644
index 00000000..f51169d3
Binary files /dev/null and b/public/static/images/blogs/external/1684421493-image11.png differ
diff --git a/public/static/images/blogs/external/1684421611-image10.png b/public/static/images/blogs/external/1684421611-image10.png
new file mode 100644
index 00000000..d42ddfc8
Binary files /dev/null and b/public/static/images/blogs/external/1684421611-image10.png differ
diff --git a/public/static/images/blogs/external/1684857201-image4.png b/public/static/images/blogs/external/1684857201-image4.png
new file mode 100644
index 00000000..da716da1
Binary files /dev/null and b/public/static/images/blogs/external/1684857201-image4.png differ
diff --git a/public/static/images/blogs/external/1684857250-image5.png b/public/static/images/blogs/external/1684857250-image5.png
new file mode 100644
index 00000000..c73cf0e3
Binary files /dev/null and b/public/static/images/blogs/external/1684857250-image5.png differ
diff --git a/public/static/images/blogs/external/1684857317-image6.png b/public/static/images/blogs/external/1684857317-image6.png
new file mode 100644
index 00000000..976b3a58
Binary files /dev/null and b/public/static/images/blogs/external/1684857317-image6.png differ
diff --git a/public/static/images/blogs/external/1684857872-image3.png b/public/static/images/blogs/external/1684857872-image3.png
new file mode 100644
index 00000000..678d73af
Binary files /dev/null and b/public/static/images/blogs/external/1684857872-image3.png differ
diff --git a/public/static/images/blogs/external/1685462020-image1.png b/public/static/images/blogs/external/1685462020-image1.png
new file mode 100644
index 00000000..e991c75f
Binary files /dev/null and b/public/static/images/blogs/external/1685462020-image1.png differ
diff --git a/public/static/images/blogs/external/1685462061-image2.png b/public/static/images/blogs/external/1685462061-image2.png
new file mode 100644
index 00000000..fcf4ba30
Binary files /dev/null and b/public/static/images/blogs/external/1685462061-image2.png differ
diff --git a/public/static/images/blogs/external/1685462099-image3.png b/public/static/images/blogs/external/1685462099-image3.png
new file mode 100644
index 00000000..9b38673c
Binary files /dev/null and b/public/static/images/blogs/external/1685462099-image3.png differ
diff --git a/public/static/images/blogs/external/1685462150-image4.png b/public/static/images/blogs/external/1685462150-image4.png
new file mode 100644
index 00000000..1de100ac
Binary files /dev/null and b/public/static/images/blogs/external/1685462150-image4.png differ
diff --git a/public/static/images/blogs/external/1685462203-image5.png b/public/static/images/blogs/external/1685462203-image5.png
new file mode 100644
index 00000000..996fc065
Binary files /dev/null and b/public/static/images/blogs/external/1685462203-image5.png differ
diff --git a/public/static/images/blogs/external/1685462248-image6.png b/public/static/images/blogs/external/1685462248-image6.png
new file mode 100644
index 00000000..1c358eaa
Binary files /dev/null and b/public/static/images/blogs/external/1685462248-image6.png differ
diff --git a/public/static/images/blogs/external/1685462274-image7.png b/public/static/images/blogs/external/1685462274-image7.png
new file mode 100644
index 00000000..f84006c9
Binary files /dev/null and b/public/static/images/blogs/external/1685462274-image7.png differ
diff --git a/public/static/images/blogs/external/1685462322-image8.png b/public/static/images/blogs/external/1685462322-image8.png
new file mode 100644
index 00000000..13e56aea
Binary files /dev/null and b/public/static/images/blogs/external/1685462322-image8.png differ
diff --git a/public/static/images/blogs/external/1685462366-image9.png b/public/static/images/blogs/external/1685462366-image9.png
new file mode 100644
index 00000000..c7d116a6
Binary files /dev/null and b/public/static/images/blogs/external/1685462366-image9.png differ
diff --git a/public/static/images/blogs/external/1685462400-image10.png b/public/static/images/blogs/external/1685462400-image10.png
new file mode 100644
index 00000000..ebb6354d
Binary files /dev/null and b/public/static/images/blogs/external/1685462400-image10.png differ
diff --git a/public/static/images/blogs/external/1685462441-image11.png b/public/static/images/blogs/external/1685462441-image11.png
new file mode 100644
index 00000000..772c0756
Binary files /dev/null and b/public/static/images/blogs/external/1685462441-image11.png differ
diff --git a/public/static/images/blogs/external/1685462480-image12.png b/public/static/images/blogs/external/1685462480-image12.png
new file mode 100644
index 00000000..8658bd45
Binary files /dev/null and b/public/static/images/blogs/external/1685462480-image12.png differ
diff --git a/public/static/images/blogs/external/1685462510-image13.png b/public/static/images/blogs/external/1685462510-image13.png
new file mode 100644
index 00000000..71bc1976
Binary files /dev/null and b/public/static/images/blogs/external/1685462510-image13.png differ
diff --git a/public/static/images/blogs/external/1685637507-image4.png b/public/static/images/blogs/external/1685637507-image4.png
new file mode 100644
index 00000000..d3da8c0a
Binary files /dev/null and b/public/static/images/blogs/external/1685637507-image4.png differ
diff --git a/public/static/images/blogs/external/1685637607-image1.png b/public/static/images/blogs/external/1685637607-image1.png
new file mode 100644
index 00000000..41af118a
Binary files /dev/null and b/public/static/images/blogs/external/1685637607-image1.png differ
diff --git a/public/static/images/blogs/external/1685637644-image2.png b/public/static/images/blogs/external/1685637644-image2.png
new file mode 100644
index 00000000..b18f94fa
Binary files /dev/null and b/public/static/images/blogs/external/1685637644-image2.png differ
diff --git a/public/static/images/blogs/external/1685637772-image5.png b/public/static/images/blogs/external/1685637772-image5.png
new file mode 100644
index 00000000..aea7b599
Binary files /dev/null and b/public/static/images/blogs/external/1685637772-image5.png differ
diff --git a/public/static/images/blogs/external/1685637837-image6.png b/public/static/images/blogs/external/1685637837-image6.png
new file mode 100644
index 00000000..b689c10c
Binary files /dev/null and b/public/static/images/blogs/external/1685637837-image6.png differ
diff --git a/public/static/images/blogs/external/1685637876-image7.png b/public/static/images/blogs/external/1685637876-image7.png
new file mode 100644
index 00000000..0878f5f6
Binary files /dev/null and b/public/static/images/blogs/external/1685637876-image7.png differ
diff --git a/public/static/images/blogs/external/1685637909-image8.png b/public/static/images/blogs/external/1685637909-image8.png
new file mode 100644
index 00000000..a65fd638
Binary files /dev/null and b/public/static/images/blogs/external/1685637909-image8.png differ
diff --git a/public/static/images/blogs/external/1685637945-image9.png b/public/static/images/blogs/external/1685637945-image9.png
new file mode 100644
index 00000000..98b3b4b2
Binary files /dev/null and b/public/static/images/blogs/external/1685637945-image9.png differ
diff --git a/public/static/images/blogs/external/1687549350-screen-shot-2023-06-22-at-1-32-51-pm.png b/public/static/images/blogs/external/1687549350-screen-shot-2023-06-22-at-1-32-51-pm.png
new file mode 100644
index 00000000..c14a5e19
Binary files /dev/null and b/public/static/images/blogs/external/1687549350-screen-shot-2023-06-22-at-1-32-51-pm.png differ
diff --git a/public/static/images/blogs/external/1689174701-image1.png b/public/static/images/blogs/external/1689174701-image1.png
new file mode 100644
index 00000000..db73b2a3
Binary files /dev/null and b/public/static/images/blogs/external/1689174701-image1.png differ
diff --git a/public/static/images/blogs/external/1689175033-image4.png b/public/static/images/blogs/external/1689175033-image4.png
new file mode 100644
index 00000000..c0024ac3
Binary files /dev/null and b/public/static/images/blogs/external/1689175033-image4.png differ
diff --git a/public/static/images/blogs/external/1689175176-image2.png b/public/static/images/blogs/external/1689175176-image2.png
new file mode 100644
index 00000000..4e3720af
Binary files /dev/null and b/public/static/images/blogs/external/1689175176-image2.png differ
diff --git a/public/static/images/blogs/external/1689175271-image3.png b/public/static/images/blogs/external/1689175271-image3.png
new file mode 100644
index 00000000..d7c4e372
Binary files /dev/null and b/public/static/images/blogs/external/1689175271-image3.png differ
diff --git a/public/static/images/blogs/external/Pinot-YearinReview24-8.png b/public/static/images/blogs/external/Pinot-YearinReview24-8.png
new file mode 100644
index 00000000..236745f1
Binary files /dev/null and b/public/static/images/blogs/external/Pinot-YearinReview24-8.png differ


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org