diff --git a/.github/ISSUE_TEMPLATE/suggest_resource.yaml b/.github/ISSUE_TEMPLATE/suggest_resource.yaml
new file mode 100644
index 00000000000..6df8803f163
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/suggest_resource.yaml
@@ -0,0 +1,63 @@
+name: Suggest a resource
+description: Suggest a new resource to list on ethereum.org/resources
+title: Suggest a resource
+labels: ["resource π"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Before suggesting a resource, make sure you've read [our listing policy](https://www.ethereum.org/en/contributing/adding-resources/).
+ - type: markdown
+ attributes:
+ value: Only continue with the issue if your resource meets the criteria listed there.
+ - type: markdown
+ attributes:
+ value: If it does, complete the following information which we need to accurately list the resource.
+ - type: markdown
+ id: resource_info
+ attributes:
+ value: "## Resource info"
+ - type: input
+ id: resource_name
+ attributes:
+ label: Name
+ description: Please provide the official name of the resource
+ validations:
+ required: true
+ - type: input
+ id: resource_url
+ attributes:
+ label: Resource URL
+ description: Please provide a URL to the resource
+ validations:
+ required: true
+ - type: textarea
+ id: resource_description
+ attributes:
+ label: Description
+ description: Please provide a short 1-2 sentence description of the resource
+ validations:
+ required: true
+ - type: textarea
+ id: resource_logo
+ attributes:
+ label: Logo
+ description: |
+ Please provide an SVG or transparent PNG
+ Tip: You can attach images by clicking this area to highlight it and then dragging files in.
+ - type: input
+ id: resource_category
+ attributes:
+ label: Category
+ description: Please specify a best fit to categorize the resource (e.g., DeFi, NFT, Scaling, etc.)
+ - type: checkboxes
+ id: resource_work_on
+ attributes:
+ label: Would you like to work on this issue?
+ options:
+ - label: "Yes"
+ required: false
+ - label: "No"
+ required: false
+ validations:
+ required: true
diff --git a/public/_redirects b/public/_redirects
index d6ca9de7a30..e2b3b5fae35 100644
--- a/public/_redirects
+++ b/public/_redirects
@@ -177,3 +177,7 @@
/*/deprecated-software /:splat/dapps/ 301!
/*/enterprise/private-ethereum/ /:splat/enterprise/ 301!
+
+/dashboards /en/resources 301!
+
+/*/dashboards /:splat/resources 301!
diff --git a/public/content/contributing/adding-resources/index.md b/public/content/contributing/adding-resources/index.md
new file mode 100644
index 00000000000..c79de073d60
--- /dev/null
+++ b/public/content/contributing/adding-resources/index.md
@@ -0,0 +1,53 @@
+---
+title: Adding Resources
+description: The policy we use when adding resources to ethereum.org
+lang: en
+---
+
+# Adding Resources {#adding-resources}
+
+We want to make sure we list the best resources possible while keeping users safe and confident.
+
+Anyone is free to suggest new resources to add to the resource dashboard on ethereum.org, currently found at [ethereum.org/resources](/resources/).
+
+Although we welcome new additions, the current resources were chosen based on an experience we're trying to create for our users. These are based on some of our design principles:
+
+- _Inspirational_: anything on ethereum.org should offer something new to users
+- _A good story_: what's listed should provide an "aha" moment
+- _Credible_: everything should be legitimate businesses/projects to minimize risk to users
+
+Overall **ethereum.org aims to provide a seamless onboarding experience for new users**. For that reason, we add resources based on their:
+
+- ease of use
+- accuracy
+- maintenance
+
+## The decision framework {#decision-framework}
+
+### Criteria {#criteria}
+
+- **Honest and accurate listing information** - Any suggested listings must come with honest and accurate information. Products that falsify information will be removed.
+- **Active project** β The resource should be maintained by an active team to ensure quality and support for users. Outdated resources are subject to removal.
+
+### Product Ordering {#product-ordering}
+
+We reserve the right to order products based on their impact. New products will generally be added to the bottom of the list unless otherwise specified.
+
+## Maintenance {#maintenance}
+
+As the Ethereum ecosystem evolves, we will routinely check our content to:
+
+- Ensure that all resources listed still fulfill our criteria
+- Verify there aren't products that have been suggested that meet more of our criteria than the ones currently listed
+
+You can help with this by checking and letting us know. [Create an issue](https://github.com/ethereum/ethereum-org-website/issues/new?template=bug_report.yaml) or send an email to [website@ethereum.org](mailto:website@ethereum.org).
+
+---
+
+## Add your resource {#add-your-resource}
+
+If you want to add a resource to ethereum.org and it meets the criteria, create an issue on GitHub.
+
+
+ Create an issue
+
diff --git a/public/images/resources/beaconcha-in.png b/public/images/resources/beaconcha-in.png
new file mode 100644
index 00000000000..58cb0f5e3cf
Binary files /dev/null and b/public/images/resources/beaconcha-in.png differ
diff --git a/public/images/resources/blobsguru.png b/public/images/resources/blobsguru.png
new file mode 100644
index 00000000000..19ce09eb8c8
Binary files /dev/null and b/public/images/resources/blobsguru.png differ
diff --git a/public/images/resources/blocknative.png b/public/images/resources/blocknative.png
new file mode 100644
index 00000000000..3c91bce7722
Binary files /dev/null and b/public/images/resources/blocknative.png differ
diff --git a/public/images/resources/blockscout.webp b/public/images/resources/blockscout.webp
new file mode 100644
index 00000000000..2224fa970e8
Binary files /dev/null and b/public/images/resources/blockscout.webp differ
diff --git a/public/images/resources/cryptowerk.png b/public/images/resources/cryptowerk.png
new file mode 100644
index 00000000000..efc0405bb9a
Binary files /dev/null and b/public/images/resources/cryptowerk.png differ
diff --git a/public/images/resources/defi-llama.png b/public/images/resources/defi-llama.png
new file mode 100644
index 00000000000..c0f44698920
Binary files /dev/null and b/public/images/resources/defi-llama.png differ
diff --git a/public/images/resources/defi-market-cap.png b/public/images/resources/defi-market-cap.png
new file mode 100644
index 00000000000..64371a8c8ef
Binary files /dev/null and b/public/images/resources/defi-market-cap.png differ
diff --git a/public/images/resources/defi-scan.png b/public/images/resources/defi-scan.png
new file mode 100644
index 00000000000..c10eca423be
Binary files /dev/null and b/public/images/resources/defi-scan.png differ
diff --git a/public/images/resources/eas.png b/public/images/resources/eas.png
new file mode 100644
index 00000000000..f6d4b65cb45
Binary files /dev/null and b/public/images/resources/eas.png differ
diff --git a/public/images/resources/eigenphi.png b/public/images/resources/eigenphi.png
new file mode 100644
index 00000000000..8cfa8873cff
Binary files /dev/null and b/public/images/resources/eigenphi.png differ
diff --git a/public/images/resources/eth-glyph-black.png b/public/images/resources/eth-glyph-black.png
new file mode 100644
index 00000000000..991c4d27aa5
Binary files /dev/null and b/public/images/resources/eth-glyph-black.png differ
diff --git a/public/images/resources/eth-glyph-blue-circle.png b/public/images/resources/eth-glyph-blue-circle.png
new file mode 100644
index 00000000000..b811169710d
Binary files /dev/null and b/public/images/resources/eth-glyph-blue-circle.png differ
diff --git a/public/images/resources/eth-glyph-e-org.png b/public/images/resources/eth-glyph-e-org.png
new file mode 100644
index 00000000000..dfe97a1db86
Binary files /dev/null and b/public/images/resources/eth-glyph-e-org.png differ
diff --git a/public/images/resources/eth-glyph-rainbow.frame.png b/public/images/resources/eth-glyph-rainbow.frame.png
new file mode 100644
index 00000000000..ff150fe28e4
Binary files /dev/null and b/public/images/resources/eth-glyph-rainbow.frame.png differ
diff --git a/public/images/resources/etherealize.png b/public/images/resources/etherealize.png
new file mode 100644
index 00000000000..999fc0c5c30
Binary files /dev/null and b/public/images/resources/etherealize.png differ
diff --git a/public/images/resources/etherscan.png b/public/images/resources/etherscan.png
new file mode 100644
index 00000000000..77cba5c68c8
Binary files /dev/null and b/public/images/resources/etherscan.png differ
diff --git a/public/images/resources/ethproofs.png b/public/images/resources/ethproofs.png
new file mode 100644
index 00000000000..d40c4730fff
Binary files /dev/null and b/public/images/resources/ethproofs.png differ
diff --git a/public/images/resources/ethstaker.png b/public/images/resources/ethstaker.png
new file mode 100644
index 00000000000..ad100752a55
Binary files /dev/null and b/public/images/resources/ethstaker.png differ
diff --git a/public/images/resources/farcaster.png b/public/images/resources/farcaster.png
new file mode 100644
index 00000000000..e063ce20dc6
Binary files /dev/null and b/public/images/resources/farcaster.png differ
diff --git a/public/images/resources/growthepie.png b/public/images/resources/growthepie.png
new file mode 100644
index 00000000000..1a633a3b216
Binary files /dev/null and b/public/images/resources/growthepie.png differ
diff --git a/public/images/resources/l2beat.png b/public/images/resources/l2beat.png
new file mode 100644
index 00000000000..66d6a7ab17e
Binary files /dev/null and b/public/images/resources/l2beat.png differ
diff --git a/public/images/resources/mev-watch.png b/public/images/resources/mev-watch.png
new file mode 100644
index 00000000000..ae7257c4cc0
Binary files /dev/null and b/public/images/resources/mev-watch.png differ
diff --git a/public/images/resources/nftgo.png b/public/images/resources/nftgo.png
new file mode 100644
index 00000000000..d2deb18179c
Binary files /dev/null and b/public/images/resources/nftgo.png differ
diff --git a/public/images/resources/nodewatch.png b/public/images/resources/nodewatch.png
new file mode 100644
index 00000000000..3c7927d38a6
Binary files /dev/null and b/public/images/resources/nodewatch.png differ
diff --git a/public/images/resources/rated-network.png b/public/images/resources/rated-network.png
new file mode 100644
index 00000000000..606e084ce40
Binary files /dev/null and b/public/images/resources/rated-network.png differ
diff --git a/public/images/resources/relayscan.png b/public/images/resources/relayscan.png
new file mode 100644
index 00000000000..b8eb5155749
Binary files /dev/null and b/public/images/resources/relayscan.png differ
diff --git a/public/images/resources/rwa.png b/public/images/resources/rwa.png
new file mode 100644
index 00000000000..85d737daf0c
Binary files /dev/null and b/public/images/resources/rwa.png differ
diff --git a/public/images/resources/stablecoins-wtf.png b/public/images/resources/stablecoins-wtf.png
new file mode 100644
index 00000000000..32c7b8e92db
Binary files /dev/null and b/public/images/resources/stablecoins-wtf.png differ
diff --git a/public/images/resources/supermajority.png b/public/images/resources/supermajority.png
new file mode 100644
index 00000000000..dfaf8f9262d
Binary files /dev/null and b/public/images/resources/supermajority.png differ
diff --git a/public/images/resources/txcity.png b/public/images/resources/txcity.png
new file mode 100644
index 00000000000..f317fcd0e58
Binary files /dev/null and b/public/images/resources/txcity.png differ
diff --git a/public/images/resources/ultrasound-money.png b/public/images/resources/ultrasound-money.png
new file mode 100644
index 00000000000..147154193b5
Binary files /dev/null and b/public/images/resources/ultrasound-money.png differ
diff --git a/public/images/resources/visa-onchain-analytcs.png b/public/images/resources/visa-onchain-analytcs.png
new file mode 100644
index 00000000000..06454e4fb26
Binary files /dev/null and b/public/images/resources/visa-onchain-analytcs.png differ
diff --git a/src/components/AreaChart/index.tsx b/src/components/AreaChart/index.tsx
new file mode 100644
index 00000000000..94ab25f068f
--- /dev/null
+++ b/src/components/AreaChart/index.tsx
@@ -0,0 +1,138 @@
+"use client"
+
+import { FaArrowTrendUp } from "react-icons/fa6"
+import {
+ Area,
+ AreaChart as RechartsAreaChart,
+ CartesianGrid,
+ XAxis,
+} from "recharts"
+
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card"
+import {
+ ChartConfig,
+ ChartContainer,
+ ChartTooltip,
+ ChartTooltipContent,
+} from "@/components/ui/chart"
+
+type AreaChartDataPoint = { xValue: string; yValue: number }
+
+/**
+ * AreaChartProps defines the properties for the AreaChart component.
+ *
+ * @property {AreaChartDataPoint[]} data - The data to be displayed in the chart. Each object should have an `xValue` and `yValue` property.
+ * @property {string} [title] - The title of the chart.
+ * @property {string} [description] - The description of the chart.
+ * @property {string} [footerText] - The footer text of the chart.
+ * @property {string} [footerSubText] - The footer subtext of the chart.
+ */
+type AreaChartProps = {
+ data: AreaChartDataPoint[]
+ title?: string
+ description?: string
+ footerText?: string
+ footerSubText?: string
+}
+
+const defaultChartConfig = {
+ value: {
+ label: "Value",
+ color: "hsl(var(--accent-a))",
+ },
+} satisfies ChartConfig
+
+/**
+ * AreaChart component renders an area chart with the provided data and optional title, description, footer text, and footer subtext.
+ *
+ * @param {AreaChartProps} props - The properties for the AreaChart component.
+ * @returns {JSX.Element} The rendered AreaChart component.
+ */
+export function AreaChart({
+ data,
+ title,
+ description,
+ footerText,
+ footerSubText,
+}: AreaChartProps) {
+ return (
+
+
+ {title && {title}}
+ {description && {description}}
+
+
+
+
+
+ value.slice(0, 3)}
+ />
+ } />
+
+
+
+
+
+
+
+
+
+
+ {(footerText || footerSubText) && (
+
+
+
+ {footerText && (
+
+ {footerText}
+
+ )}
+ {footerSubText && (
+
+ {footerSubText}
+
+ )}
+
+
+
+ )}
+
+ )
+}
diff --git a/src/components/BarChart/index.tsx b/src/components/BarChart/index.tsx
new file mode 100644
index 00000000000..983b63f8fae
--- /dev/null
+++ b/src/components/BarChart/index.tsx
@@ -0,0 +1,120 @@
+"use client"
+
+import { FaArrowTrendUp } from "react-icons/fa6"
+import {
+ Bar,
+ BarChart as RechartsBarChart,
+ CartesianGrid,
+ XAxis,
+} from "recharts"
+
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card"
+import {
+ ChartConfig,
+ ChartContainer,
+ ChartTooltip,
+ ChartTooltipContent,
+} from "@/components/ui/chart"
+
+type BarChartDataPoint = { category: string; value: number }
+
+/**
+ * BarChartProps defines the properties for the BarChart component.
+ *
+ * @property {BarChartItem[]} data - The data to be displayed in the chart. Each object should have a `category` and `value` property.
+ * @property {string} [title] - The title of the chart.
+ * @property {string} [description] - The description of the chart.
+ * @property {string} [footerText] - The footer text of the chart.
+ * @property {string} [footerSubText] - The footer subtext of the chart.
+ */
+type BarChartProps = {
+ data: BarChartDataPoint[]
+ title?: string
+ description?: string
+ footerText?: string
+ footerSubText?: string
+}
+
+const defaultChartConfig = {
+ value: {
+ label: "Value",
+ color: "hsl(var(--accent-a))",
+ },
+} satisfies ChartConfig
+
+/**
+ * BarChart component renders a bar chart with the provided data and optional title, description, footer text, and footer subtext.
+ *
+ * @param {BarChartProps} props - The properties for the BarChart component.
+ * @returns {JSX.Element} The rendered BarChart component.
+ */
+export function BarChart({
+ data,
+ title,
+ description,
+ footerText,
+ footerSubText,
+}: BarChartProps) {
+ return (
+
+
+ {title && {title}}
+ {description && {description}}
+
+
+
+
+
+
+ } />
+
+
+
+
+ {(footerText || footerSubText) && (
+
+
+
+ {footerText && (
+
+ {footerText}
+
+ )}
+ {footerSubText && (
+
+ {footerSubText}
+
+ )}
+
+
+
+ )}
+
+ )
+}
diff --git a/src/components/RadialChart/index.tsx b/src/components/RadialChart/index.tsx
new file mode 100644
index 00000000000..3732e54f4a7
--- /dev/null
+++ b/src/components/RadialChart/index.tsx
@@ -0,0 +1,134 @@
+"use client"
+
+import { type ReactNode, useEffect, useState } from "react"
+import { useRouter } from "next/router"
+import { MdInfoOutline } from "react-icons/md"
+import { PolarAngleAxis, RadialBar, RadialBarChart } from "recharts"
+
+import { cn } from "@/lib/utils/cn"
+import { isValidDate } from "@/lib/utils/date"
+
+import Tooltip from "../Tooltip"
+import Link from "../ui/Link"
+
+import { useTranslation } from "@/hooks/useTranslation"
+
+/**
+ * RadialChartProps defines the properties for the RadialChart component.
+ *
+ * @property {number} value - The value to be displayed in the chart.
+ * @property {number} [totalValue] - The total value for the chart. If not provided, the chart will display the value as a percentage.
+ * @property {ReactNode} label - The label for the chart.
+ * @property {string} [sourceName] - The name of the data source.
+ * @property {string} [sourceUrl] - The URL of the data source.
+ * @property {number | string} [lastUpdated] - The last updated timestamp for the data.
+ * @property {string} [className] - Additional class names for the chart container.
+ * @property {string} [displayValue] - The custom display value to be shown.
+ */
+type RadialChartProps = {
+ value: number
+ totalValue?: number
+ label: ReactNode
+ sourceName?: string
+ sourceUrl?: string
+ lastUpdated?: number | string
+ className?: string
+ displayValue?: string
+}
+
+/**
+ * RadialChart component renders a radial chart with the provided value and optional total value, label, source name, source URL, last updated timestamp, additional class names, and custom display value.
+ *
+ * @param {RadialChartProps} props - The properties for the RadialChart component.
+ * @returns {JSX.Element} The rendered RadialChart component.
+ */
+const RadialChart = ({
+ value,
+ totalValue,
+ label,
+ sourceName,
+ sourceUrl,
+ lastUpdated,
+ className,
+ displayValue,
+}: RadialChartProps) => {
+ const { t } = useTranslation("common")
+ const { locale } = useRouter()
+ const [isMounted, setIsMounted] = useState(false)
+
+ useEffect(() => {
+ setIsMounted(true)
+ }, [])
+
+ const lastUpdatedDisplay =
+ lastUpdated && isValidDate(lastUpdated)
+ ? new Intl.DateTimeFormat(locale, {
+ dateStyle: "medium",
+ }).format(new Date(lastUpdated))
+ : ""
+
+ const data = [{ value }]
+
+ if (!isMounted) return null
+
+ return (
+