diff --git a/.prettierignore b/.prettierignore
index d2fc8b903..9ac5eb9dc 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -3,3 +3,5 @@
*.lock
.cache/
public/
+node_modules/
+static/
diff --git a/.yarnrc b/.yarnrc
index 7187efe0c..b9b495176 100644
--- a/.yarnrc
+++ b/.yarnrc
@@ -1 +1 @@
---add.ignore-workspace-root-check=true
+--add.ignore-workspace-root-check true
diff --git a/contents/blog/the-posthog-array-1-21-0.mdx b/contents/blog/the-posthog-array-1-21-0.mdx
index 94d5f48e4..f0cda4753 100644
--- a/contents/blog/the-posthog-array-1-21-0.mdx
+++ b/contents/blog/the-posthog-array-1-21-0.mdx
@@ -5,13 +5,12 @@ rootPage: /blog
sidebar: Blog
showTitle: true
hideAnchor: true
-categories: ["Release notes", "Product updates"]
+categories: ['Release notes', 'Product updates']
featuredImage: ../images/blog/array/default.png
featuredImageType: standard
---
import { Link } from 'gatsby'
-import { Button } from 'antd'
Release 1.21 is a big one, on top of exciting new features and improvements, we put extra time into the overall stability of PostHog squashing dozens of issues. Some highlights of this release:
@@ -25,11 +24,13 @@ We received a lot of great feedback and issue reports and over this release cycl
Make sure to upgrade to get the new features, improvements and fixes.
-
-
-
+
+
+
+
+ Install PostHog
+
+
@@ -383,4 +384,3 @@ In addition to the highlights listed above, we also merged a bunch of PRs improv
- Enable SSL PostgreSQL configuration through env variables [\#2967](https://github.com/PostHog/posthog/pull/2967) ([tmilicic](https://github.com/tmilicic))
-
diff --git a/contents/blog/the-posthog-array-1-22-0.mdx b/contents/blog/the-posthog-array-1-22-0.mdx
index 6eadd15f6..0e5d278f4 100644
--- a/contents/blog/the-posthog-array-1-22-0.mdx
+++ b/contents/blog/the-posthog-array-1-22-0.mdx
@@ -11,7 +11,6 @@ featuredImageType: standard
---
import { Link } from 'gatsby'
-import { Button } from 'antd'
PostHog 1.22 is out with awesome new features, usability and performance improvements, and the usual bug squashing.
@@ -34,11 +33,13 @@ Thank you oshura3, we look forward to collaborating with you more!
- **Improvement:** Better tooling for updating data in dashboards
- **Improvement:** A whole new UX for individual person pages
-
-
-
+
+
+
+
+ Try PostHog Cloud Now
+
+
diff --git a/contents/docs/api/post-only-endpoints.mdx b/contents/docs/api/post-only-endpoints.mdx
index b97979d1b..6cff14bea 100644
--- a/contents/docs/api/post-only-endpoints.mdx
+++ b/contents/docs/api/post-only-endpoints.mdx
@@ -12,8 +12,6 @@ This page refers to our public endpoints, which use the same API key as the [Pos
> **Note:** For this API, you should use your 'Project API Key' from the 'Project' page in PostHog. This is the same key used in your frontend snippet.
-
-
# Sending events
To send events to PostHog, you can use any of [our libraries](/docs/integrate/overview) **or** any Mixpanel library by changing the `api_host` setting to the address of your instance.
@@ -162,74 +160,62 @@ curl -v -L --header "Content-Type: application/json" -d '{
##### Responses
```js
-{
- status: 1
+{
+ status: 1
}
```
-**Meaning:** A `200: OK` response means we have successfully received the payload, it is in the correct format, and the project API key (token) is valid. It **does not** imply that events are valid and will be ingested. As mentioned under [Invalid events](#invalid-events), certain event validation errors may cause an event not to be ingested.
-
+**Meaning:** A `200: OK` response means we have successfully received the payload, it is in the correct format, and the project API key (token) is valid. It **does not** imply that events are valid and will be ingested. As mentioned under [Invalid events](#invalid-events), certain event validation errors may cause an event not to be ingested.
#### Status code: 400
##### Responses
-
```js
-{
- type: 'validation_error',
- code: 'invalid_project',
- detail: 'Invalid Project ID.',
- attr: 'project_id'
+{
+ type: 'validation_error',
+ code: 'invalid_project',
+ detail: 'Invalid Project ID.',
+ attr: 'project_id'
}
```
**Meaning:** We were unable to determine the project to associate the events with.
-
#### Status code: 401
##### Responses
-
```js
-{
- type: 'authentication_error',
- code: 'invalid_api_key',
- detail: 'Project API key invalid. You can find your project API key in PostHog project settings.',
+{
+ type: 'authentication_error',
+ code: 'invalid_api_key',
+ detail: 'Project API key invalid. You can find your project API key in PostHog project settings.',
}
```
**Meaning:** The token/API key you provided is invalid.
-import { Divider } from 'antd'
-
-
-
-
-
-
```js
-{
- type: 'authentication_error',
- code: 'invalid_personal_api_key',
- detail: 'Invalid Personal API key.',
+{
+ type: 'authentication_error',
+ code: 'invalid_personal_api_key',
+ detail: 'Invalid Personal API key.',
}
```
-**Meaning:** The personal API key you used for authentication is invalid.
+**Meaning:** The personal API key you used for authentication is invalid.
#### Status code: 503 (Deprecated)
##### Responses
-
```js
-{
- type: 'server_error',
- code: 'fetch_team_fail',
+{
+ type: 'server_error',
+ code: 'fetch_team_fail',
detail: 'Unable to fetch team from database.'
}
```
@@ -242,14 +228,13 @@ We perform basic validation on the payload and project API key (token), returnin
However, we **will not return an error** to the client when the following happens:
-- An event does not have a name
-- An event does not have the `distinct_id` field set
-- The `distinct_id` field of an event has an empty value
+- An event does not have a name
+- An event does not have the `distinct_id` field set
+- The `distinct_id` field of an event has an empty value
-The three cases above will cause the event to not be ingested, but you will still receive a `200: OK` response from us.
-
-This approach allows us to process events asynchronously if necessary, ensuring reliability and low latency for our event ingestion endpoints.
+The three cases above will cause the event to not be ingested, but you will still receive a `200: OK` response from us.
+This approach allows us to process events asynchronously if necessary, ensuring reliability and low latency for our event ingestion endpoints.
# Feature flags
diff --git a/contents/docs/integrate/ingest-historic-data.mdx b/contents/docs/integrate/ingest-historic-data.mdx
index 6339fe47b..336c79bf4 100644
--- a/contents/docs/integrate/ingest-historic-data.mdx
+++ b/contents/docs/integrate/ingest-historic-data.mdx
@@ -4,9 +4,6 @@ sidebar: Docs
showTitle: true
---
-import { Tabs } from 'antd'
-export const TabPane = Tabs.TabPane
-
Historical data ingestion (or importing data), opposed to [live data ingestion](/docs/integrate/ingest-live-data), is the process of transporting data from external sources into PostHog so you can benefit from PostHog product analytics on historical data. It may be that you have historical data that you want to analyze along with new live data or that you have a requirement to periodically import data from third-party sources to augment your live data.
Whatever the reason for the historical data ingestion, this guide covers what to consider during that process.
@@ -87,34 +84,46 @@ import GoCapture from './server/go/snippets/capture.mdx'
import RubyCapture from './server/ruby/snippets/capture.mdx'
import CURLCapture from './server/curl/snippets/capture.mdx'
+import Tab from "components/Tab"
+
> The server libraries handle batching capture requests. If you decide to use the API directly you will need to manage this yourself.
-
-
-
-
+
+
+
diff --git a/contents/docs/integrate/ingest-live-data.mdx b/contents/docs/integrate/ingest-live-data.mdx
index ef42358a6..86d281db3 100644
--- a/contents/docs/integrate/ingest-live-data.mdx
+++ b/contents/docs/integrate/ingest-live-data.mdx
@@ -4,9 +4,6 @@ sidebar: Docs
showTitle: true
---
-import { Tabs } from 'antd'
-export const TabPane = Tabs.TabPane
-
PostHog enables you to analyze data in real-time, as events come in. Make full use of this power by ingesting live data with our analytics integrations: [client libraries](/docs/integrate/overview#client-libraries), [server libraries](/docs/integrate/overview#server-libraries), as well as [third-party platforms](/docs/integrate/overview#integrations).
The purpose of this guide is to help you understand some key concepts with a goal of ingesting live data into PostHog. For simplicity, we'll focus on _client_ libraries as a means of data ingestion.
@@ -37,27 +34,39 @@ import FlutterInstall from './client/flutter/snippets/install.mdx'
import ReactNativeInstall from './client/react-native/snippets/install.mdx'
import ReactNativeConfigure from './client/react-native/snippets/configure.mdx'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+import Tab from "components/Tab"
+
+
+
+ JavaScript
+ Android
+ iOS
+ Flutter
+ React Native
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# Use autocapture
@@ -76,26 +85,36 @@ import AndroidCapture from './client/android/snippets/capture.mdx'
import IOSCapture from './client/ios/snippets/capture.mdx'
import ReactNativeCapture from './client/react-native/snippets/capture.mdx'
-
-
-
-
-
-
-
+
+
+
+
+
+
# Event ingestion nuances
It's a priority for us that events are fully processed and saved as soon as possible. However, there is a class of events which we _deliberately_ process with a slight delay. Specifically, an event is delayed by around a minute if it fits **all** of the following three conditions:
-- isn't from an anonymous user (anonymous users are recognized by having the `distinct_id` the same as the `$device_id` property)
-- isn't an `$identify` event (e.g. from `posthog.identify()`)
-- its `distinct_id` cannot be matched to an existing person
+- isn't from an anonymous user (anonymous users are recognized by having the `distinct_id` the same as the `$device_id` property)
+- isn't an `$identify` event (e.g. from `posthog.identify()`)
+- its `distinct_id` cannot be matched to an existing person
This delay mechanism is called the **event buffer**, and it materially improves handling of an edge case which could otherwise inflate unique user counts.
@@ -138,17 +165,17 @@ This delay mechanism is called the **event buffer**, and it materially improves
How does the event buffer help?
- Starting with version 1.38.0, PostHog stores the person associated with an event inline with the event record. This greatly improves query performance, but because events are immutable, it also means that persons can't be merged retroactively. See this scenario where that's problematic:
+Starting with version 1.38.0, PostHog stores the person associated with an event inline with the event record. This greatly improves query performance, but because events are immutable, it also means that persons can't be merged retroactively. See this scenario where that's problematic:
- 1. User visits signup page, in turn frontend captures anonymous `$pageview` for distinct ID `XYZ` (anonymous distinct ID = device ID).
- This event gets person ID `A`.
- 2. User click signup button, initiating in a backend request, in turn frontend captures anonymous `$autocapture` (click) for distinct ID `XYZ`.
- This event gets person ID `A`.
- 3. Signup request is processed in the backend, in turn backend captures identified signup for distinct ID `alice@example`.com.
- OOPS! We haven't seen `alice@example.com` before, so this event gets person ID `B`.
- 4. Signup request finishes successfully, in turn frontend captures identified $identify aliasing distinct ID `XYZ` to `alice@example.com`.
- This event gets person ID `A`.
+1. User visits signup page, in turn frontend captures anonymous `$pageview` for distinct ID `XYZ` (anonymous distinct ID = device ID).
+ This event gets person ID `A`.
+2. User click signup button, initiating in a backend request, in turn frontend captures anonymous `$autocapture` (click) for distinct ID `XYZ`.
+ This event gets person ID `A`.
+3. Signup request is processed in the backend, in turn backend captures identified signup for distinct ID `alice@example`.com.
+ OOPS! We haven't seen `alice@example.com` before, so this event gets person ID `B`.
+4. Signup request finishes successfully, in turn frontend captures identified $identify aliasing distinct ID `XYZ` to `alice@example.com`.
+ This event gets person ID `A`.
- Here, the event from step 3 got a new person ID `B`, impacting unique users counts. If it were delayed just a bit and processed after the event from step 4, all events would get the expected person ID `A`. This is exactly what the event buffer achieves.
+Here, the event from step 3 got a new person ID `B`, impacting unique users counts. If it were delayed just a bit and processed after the event from step 4, all events would get the expected person ID `A`. This is exactly what the event buffer achieves.
diff --git a/contents/docs/user-guides/group-analytics.mdx b/contents/docs/user-guides/group-analytics.mdx
index a8cc8e009..63088cb91 100644
--- a/contents/docs/user-guides/group-analytics.mdx
+++ b/contents/docs/user-guides/group-analytics.mdx
@@ -85,9 +85,6 @@ The following examples use `company` as a group type and `id:5` as the group key
> **Tip:** Use a singular form of the group type throughout ingestion
-import { Tabs } from 'antd'
-export const TabPane = Tabs.TabPane
-
import GroupsIngestionPosthogJs from './snippets/groups-ingestion-posthog-js.mdx'
import GroupsIngestionPython from './snippets/groups-ingestion-python.mdx'
import GroupsIngestionPHP from './snippets/groups-ingestion-php.mdx'
@@ -96,29 +93,43 @@ import GroupsIngestionNode from './snippets/groups-ingestion-node.mdx'
import GroupsIngestionSegment from './snippets/groups-ingestion-segment.mdx'
import GroupsIngestionOther from './snippets/groups-ingestion-other.mdx'
-
-
+import Tab from "components/Tab"
+
+
+
+ JavaScript
+ Python
+ PHP
+ Go
+ Node.js
+ Segment
+ Other libraries
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
## Analysing group insights
@@ -174,23 +185,22 @@ import GroupsFeatureFlagsPHP from './snippets/groups-flags-php.mdx'
import GroupsFeatureFlagsGo from './snippets/groups-flags-go.mdx'
import GroupsFeatureFlagsNode from './snippets/groups-flags-node.mdx'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ JavaScript
+ Python
+ PHP
+ Go
+ Node.js
+
+
+
+
+
+
+
+
+
## Renaming group types
@@ -213,6 +223,6 @@ Please [reach out](/slack) if you have feedback!
Want to know more about what's possible with Groups in PostHog? Try these tutorials:
-- [How to track how teams use your product](/tutorials/tracking-teams)
+- [How to track how teams use your product](/tutorials/tracking-teams)
-Want more? Check our [full list of PostHog tutorials](https://posthog.com/tutorials).
+Want more? Check our [full list of PostHog tutorials](https://posthog.com/tutorials).
diff --git a/contents/handbook/engineering/posthog-com/mdx-setup.mdx b/contents/handbook/engineering/posthog-com/mdx-setup.mdx
index 87ecb2fb6..d6b5c7e53 100644
--- a/contents/handbook/engineering/posthog-com/mdx-setup.mdx
+++ b/contents/handbook/engineering/posthog-com/mdx-setup.mdx
@@ -43,15 +43,15 @@ In this case, we pass references to components that can then be used without imp
Because of the components passed to `MDXProvider`, I can include this hedgehog by just adding `` in my
MDX file - no import needed.
-However, if I want to include something from a module, I can also do so. Here's how one would insert a spinner component from AntD:
+However, if I want to include something from a module, I can also do so. Here's how one would insert a Transition component from Headless UI:
```js
-import { Spin } from 'antd'
+import { Transition } from '@headlessui/react'
## Some Markdown
-
+{/* ... */}
```
diff --git a/netlify.toml b/netlify.toml
index fd4db37ff..f3f137c77 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -1481,14 +1481,23 @@
# Added: 2022-07-08
[[redirects]]
from = "/startups"
- to = "/pricing#startup-plan"
+ to = "/pricing"
+
+# Added: 2022-07-11
+[[redirects]]
+ from = "/trial"
+ to = "/pricing"
+
+# Added: 2022-07-12
+[[redirects]]
+ from = "/schedule-demo"
+ to = "/book-a-demo"
# Added: 2022-07-14
[[redirects]]
from = "/apps/airbyte-export/docs"
to = "/docs/apps/airbyte-export"
-
# Added: 2022-07-14
[[redirects]]
from = "/apps/amazon-kinesis/docs"
diff --git a/package.json b/package.json
index cdf003f6c..0efb1e141 100644
--- a/package.json
+++ b/package.json
@@ -28,7 +28,8 @@
"@ant-design/icons": "^4.1.0",
"@docsearch/react": "^3.0.0-alpha.42",
"@fontsource/source-code-pro": "^4.5.4",
- "@headlessui/react": "^1.4.0",
+ "@headlessui/react": "^1.6.6",
+ "@heroicons/react": "^1.0.6",
"@mdx-js/mdx": "^1.6.19",
"@mdx-js/react": "^1.6.22",
"@popperjs/core": "^2.11.2",
@@ -36,7 +37,6 @@
"@supabase/supabase-js": "^1.29.4",
"@typescript-eslint/eslint-plugin": "^4.20.0",
"@uiw/react-md-editor": "^3.9.5",
- "antd": "^3.23.2",
"chart.js": "^2.9.4",
"chrome-aws-lambda": "^10.1.0",
"cntl": "^1.0.0",
@@ -149,6 +149,7 @@
"@types/chart.js": "^2.9.31",
"@types/gatsby-plugin-breakpoints": "^1.3.2",
"@types/mdx-js__react": "^1.5.3",
+ "@types/react": "^16.0.0",
"@types/react-burger-menu": "^2.8.3",
"@types/react-dom": "^18.0.6",
"@types/react-helmet": "^6.1.0",
diff --git a/src/components/APIDocs/Endpoint/index.tsx b/src/components/APIDocs/Endpoint/index.tsx
deleted file mode 100644
index e49c42c04..000000000
--- a/src/components/APIDocs/Endpoint/index.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import React from 'react'
-import { MethodTags, method } from '../MethodTags'
-
-interface EndpointProps {
- endpoint: string
- allowedMethods: method[]
-}
-
-export const Endpoint = ({ endpoint, allowedMethods }: EndpointProps) => {
- return (
-