+ );
+});
diff --git a/web/core/components/home/index.ts b/web/core/components/home/index.ts
new file mode 100644
index 0000000000..d783e089a0
--- /dev/null
+++ b/web/core/components/home/index.ts
@@ -0,0 +1,4 @@
+export * from "./widgets";
+export * from "./home-dashboard-widgets";
+export * from "./project-empty-state";
+export * from "./root";
diff --git a/web/core/components/home/project-empty-state.tsx b/web/core/components/home/project-empty-state.tsx
new file mode 100644
index 0000000000..c8cba817a3
--- /dev/null
+++ b/web/core/components/home/project-empty-state.tsx
@@ -0,0 +1,46 @@
+"use client";
+
+import { observer } from "mobx-react";
+import Image from "next/image";
+// ui
+import { Button } from "@plane/ui";
+// hooks
+import { useCommandPalette, useEventTracker, useUserPermissions } from "@/hooks/store";
+import { EUserPermissions, EUserPermissionsLevel } from "@/plane-web/constants/user-permissions";
+// assets
+import ProjectEmptyStateImage from "@/public/empty-state/onboarding/dashboard-light.webp";
+
+export const DashboardProjectEmptyState = observer(() => {
+ // store hooks
+ const { toggleCreateProjectModal } = useCommandPalette();
+ const { setTrackElement } = useEventTracker();
+ const { allowPermissions } = useUserPermissions();
+
+ // derived values
+ const canCreateProject = allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.WORKSPACE);
+
+ return (
+
+
Overview of your projects, activity, and metrics
+
+ Welcome to Plane, we are excited to have you here. Create your first project and track your issues, and this
+ page will transform into a space that helps you progress. Admins will also see items which help their team
+ progress.
+
+ );
+};
diff --git a/web/core/components/home/widgets/manage/widget.helpers.ts b/web/core/components/home/widgets/manage/widget.helpers.ts
new file mode 100644
index 0000000000..c629f1fbcc
--- /dev/null
+++ b/web/core/components/home/widgets/manage/widget.helpers.ts
@@ -0,0 +1,62 @@
+import { extractInstruction } from "@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item";
+import { IFavorite, InstructionType, IPragmaticPayloadLocation, TDropTarget } from "@plane/types";
+
+export type TargetData = {
+ id: string;
+ parentId: string | null;
+ isGroup: boolean;
+ isChild: boolean;
+};
+
+/**
+ * extracts the Payload and translates the instruction for the current dropTarget based on drag and drop payload
+ * @param dropTarget dropTarget for which the instruction is required
+ * @param source the dragging favorite data that is being dragged on the dropTarget
+ * @param location location includes the data of all the dropTargets the source is being dragged on
+ * @returns Instruction for dropTarget
+ */
+export const getInstructionFromPayload = (
+ dropTarget: TDropTarget,
+ source: TDropTarget,
+ location: IPragmaticPayloadLocation
+): InstructionType | undefined => {
+ const dropTargetData = dropTarget?.data as TargetData;
+ const sourceData = source?.data as TargetData;
+ const allDropTargets = location?.current?.dropTargets;
+
+ // if all the dropTargets are greater than 1 meaning the source is being dragged on a group and its child at the same time
+ // and also if the dropTarget in question is also a group then, it should be a child of the current Droptarget
+ if (allDropTargets?.length > 1 && dropTargetData?.isGroup) return "make-child";
+
+ if (!dropTargetData || !sourceData) return undefined;
+
+ let instruction = extractInstruction(dropTargetData)?.type;
+
+ // If the instruction is blocked then set an instruction based on if dropTarget it is a child or not
+ if (instruction === "instruction-blocked") {
+ instruction = dropTargetData.isChild ? "reorder-above" : "make-child";
+ }
+
+ // if source that is being dragged is a group. A group cannon be a child of any other favorite,
+ // hence if current instruction is to be a child of dropTarget then reorder-above instead
+ if (instruction === "make-child" && sourceData.isGroup) instruction = "reorder-above";
+
+ return instruction;
+};
+
+/**
+ * This provides a boolean to indicate if the favorite can be dropped onto the droptarget
+ * @param source
+ * @param favorite
+ * @returns
+ */
+export const getCanDrop = (source: TDropTarget, favorite: IFavorite | undefined) => {
+ const sourceData = source?.data;
+
+ if (!sourceData) return false;
+
+ // a favorite cannot be dropped on to itself
+ if (sourceData.id === favorite?.id) return false;
+
+ return true;
+};
diff --git a/web/core/components/home/widgets/recents/filters.tsx b/web/core/components/home/widgets/recents/filters.tsx
new file mode 100644
index 0000000000..84391775b1
--- /dev/null
+++ b/web/core/components/home/widgets/recents/filters.tsx
@@ -0,0 +1,51 @@
+"use client";
+
+import { FC } from "react";
+import { observer } from "mobx-react";
+import { ChevronDown } from "lucide-react";
+import { CustomMenu } from "@plane/ui";
+import { cn } from "@plane/utils";
+import { TRecentActivityFilterKeys } from "@plane/types";
+
+export type TFiltersDropdown = {
+ className?: string;
+ activeFilter: TRecentActivityFilterKeys;
+ setActiveFilter: (filter: TRecentActivityFilterKeys) => void;
+ filters: { name: TRecentActivityFilterKeys; icon?: React.ReactNode }[];
+};
+
+export const FiltersDropdown: FC = observer((props) => {
+ const { className, activeFilter, setActiveFilter, filters } = props;
+
+ const DropdownOptions = () =>
+ filters?.map((filter) => (
+ {
+ setActiveFilter(filter.name);
+ }}
+ >
+ {filter.icon &&