marketing-changelog-1

Professional changelog interface with version history, feature highlights, and release notes. Features chronological organization, categorized updates, and interactive filtering for transparent product evolution tracking and user communication.

Files
app/page.tsx
"use client"

import { useEffect, useRef, useState } from "react"

export default function Home() {
  const [activeSection, setActiveSection] = useState("")
  const [selectedCategory, setSelectedCategory] = useState("all")
  const [expandedChanges, setExpandedChanges] = useState<Set<string>>(new Set())
  const sectionsRef = useRef<(HTMLElement | null)[]>([])

  useEffect(() => {
    const observer = new IntersectionObserver(
      (entries) => {
        entries.forEach((entry) => {
          if (entry.isIntersecting) {
            entry.target.classList.add(
              "animate-in",
              "fade-in-0",
              "slide-in-from-top-2"
            )
            setActiveSection(entry.target.id)
          }
        })
      },
      { threshold: 0.3, rootMargin: "0px 0px -20% 0px" }
    )

    // Add initial animation classes to sections that are already visible
    sectionsRef.current.forEach((section) => {
      if (section) {
        const rect = section.getBoundingClientRect()
        const isVisible = rect.top < window.innerHeight && rect.bottom > 0
        if (isVisible) {
          section.classList.add(
            "animate-in",
            "fade-in-0",
            "slide-in-from-top-2"
          )
        }
        observer.observe(section)
      }
    })

    return () => observer.disconnect()
  }, [])

  const toggleChange = (changeId: string) => {
    setExpandedChanges((prev) => {
      const newSet = new Set(prev)
      if (newSet.has(changeId)) {
        newSet.delete(changeId)
      } else {
        newSet.add(changeId)
      }
      return newSet
    })
  }

  const changelogEntries = [
    {
      version: "2.1.0",
      date: "January 15, 2025",
      summary:
        "Multi-agent orchestration, custom tool integration, and 40% faster response times.",
      changes: [
        {
          category: "feature",
          title: "Multi-Agent Orchestration",
          description:
            "Agents can now coordinate with each other to solve complex tasks. Define workflows where multiple specialized agents collaborate seamlessly.",
        },
        {
          category: "feature",
          title: "Custom Tool Integration",
          description:
            "Build and integrate your own tools with our new SDK. Extend agent capabilities with domain-specific functions and APIs.",
        },
        {
          category: "improvement",
          title: "40% Faster Response Times",
          description:
            "Optimized inference pipeline reduces latency across all agent interactions. Average response time now under 800ms.",
        },
      ],
    },
    {
      version: "2.0.0",
      date: "December 20, 2024",
      summary:
        "Memory system 2.0, visual understanding, enhanced reasoning, and rate limiting fixes.",
      changes: [
        {
          category: "feature",
          title: "Memory System 2.0",
          description:
            "Agents now maintain long-term context across conversations. Persistent memory enables more coherent multi-session interactions.",
        },
        {
          category: "feature",
          title: "Visual Understanding",
          description:
            "New vision capabilities allow agents to analyze images, screenshots, and diagrams. Multimodal reasoning unlocks new use cases.",
        },
        {
          category: "improvement",
          title: "Enhanced Reasoning Engine",
          description:
            "Upgraded to GPT-4.5 with improved chain-of-thought processing. Better handling of complex logical tasks and edge cases.",
        },
        {
          category: "fix",
          title: "Fixed Rate Limiting Issues",
          description:
            "Resolved intermittent 429 errors during high-traffic periods. Implemented adaptive request throttling.",
        },
      ],
    },
    {
      version: "1.8.0",
      date: "November 28, 2024",
      summary:
        "Real-time streaming, dashboard redesign, and WebSocket stability improvements.",
      changes: [
        {
          category: "feature",
          title: "Real-Time Streaming",
          description:
            "Agent responses now stream in real-time for improved user experience. See thinking process as it happens.",
        },
        {
          category: "improvement",
          title: "Dashboard Redesign",
          description:
            "Completely rebuilt analytics dashboard with better insights into agent performance and usage patterns.",
        },
        {
          category: "fix",
          title: "WebSocket Stability",
          description:
            "Fixed connection drops during long-running agent tasks. Improved reconnection logic and error handling.",
        },
      ],
    },
    {
      version: "1.7.0",
      date: "October 10, 2024",
      summary:
        "Agent templates, improved API documentation, and token counting fixes.",
      changes: [
        {
          category: "feature",
          title: "Agent Templates",
          description:
            "Pre-built agent templates for common use cases. Get started faster with customer support, research, and coding assistants.",
        },
        {
          category: "improvement",
          title: "API Documentation",
          description:
            "Comprehensive API docs with interactive examples. New SDK guides for Python, TypeScript, and Go.",
        },
        {
          category: "fix",
          title: "Token Counting Accuracy",
          description:
            "Fixed discrepancies in token usage reporting. Billing now reflects actual consumption more accurately.",
        },
      ],
    },
  ]

  const categories = [
    { id: "all", label: "All Updates" },
    { id: "feature", label: "Features" },
    { id: "improvement", label: "Improvements" },
    { id: "fix", label: "Bug Fixes" },
  ]

  const getCategoryColor = (category: string) => {
    switch (category) {
      case "feature":
        return "text-chart-1"
      case "improvement":
        return "text-chart-2"
      case "fix":
        return "text-chart-5"
      default:
        return "text-muted-foreground"
    }
  }

  const getCategoryLabel = (category: string) => {
    switch (category) {
      case "feature":
        return "New"
      case "improvement":
        return "Improved"
      case "fix":
        return "Fixed"
      default:
        return ""
    }
  }

  const filteredEntries = changelogEntries
    .map((entry) => ({
      ...entry,
      changes:
        selectedCategory === "all"
          ? entry.changes
          : entry.changes.filter(
              (change) => change.category === selectedCategory
            ),
    }))
    .filter((entry) => entry.changes.length > 0)

  return (
    <div className="bg-background text-foreground relative min-h-screen">
      <nav className="fixed top-1/2 left-6 z-10 hidden -translate-y-1/2 lg:block">
        <div className="flex flex-col gap-2">
          {filteredEntries.map((entry, index) => (
            <button
              key={entry.version}
              onClick={() =>
                document
                  .getElementById(`v${entry.version}`)
                  ?.scrollIntoView({ behavior: "smooth" })
              }
              className={`h-6 w-1.5 rounded-full transition-all duration-500 ${
                activeSection === `v${entry.version}`
                  ? "bg-foreground"
                  : "bg-muted-foreground/30 hover:bg-muted-foreground/60"
              }`}
              aria-label={`Navigate to version ${entry.version}`}
            />
          ))}
        </div>
      </nav>

      <main className="mx-auto max-w-3xl px-6 sm:px-8">
        <header
          id="intro"
          ref={(el) => {
            sectionsRef.current[0] = el
          }}
          className="flex min-h-[70vh] items-center"
        >
          <div className="w-full space-y-8">
            <div className="space-y-4">
              <div className="space-y-2">
                <div className="text-muted-foreground font-mono text-xs tracking-wider">
                  CHANGELOG / 2025
                </div>
                <h1 className="text-4xl font-light tracking-tight sm:text-5xl lg:text-6xl">
                  Agentic
                  <br />
                  <span className="text-muted-foreground">AI</span>
                </h1>
              </div>

              <div className="max-w-xl space-y-4">
                <p className="text-muted-foreground text-base leading-relaxed sm:text-lg">
                  Building the future of
                  <span className="text-foreground"> autonomous agents</span>.
                  Track our latest
                  <span className="text-foreground"> features</span>,
                  <span className="text-foreground"> improvements</span>, and
                  <span className="text-foreground"> fixes</span>.
                </p>

                <div className="text-muted-foreground flex flex-col gap-2 text-xs sm:flex-row sm:items-center">
                  <div className="flex items-center gap-2">
                    <div className="bg-chart-2 h-1.5 w-1.5 animate-pulse rounded-full"></div>
                    All systems operational
                  </div>
                  <div>Last updated: Jan 15, 2025</div>
                </div>
              </div>
            </div>

            <div className="space-y-3">
              <div className="text-muted-foreground font-mono text-xs">
                FILTER BY
              </div>
              <div className="flex flex-wrap gap-2">
                {categories.map((cat) => (
                  <button
                    key={cat.id}
                    onClick={() => setSelectedCategory(cat.id)}
                    className={`rounded-lg px-3 py-1.5 text-xs shadow-[0px_1px_1px_0px_rgba(0,_0,_0,_0.05),_0px_1px_1px_0px_rgba(255,_252,_240,_0.5)_inset,_0px_0px_0px_1px_hsla(0,_0%,_100%,_0.1)_inset,_0px_0px_1px_0px_rgba(28,_27,_26,_0.5)] transition-all duration-300 ${
                      selectedCategory === cat.id
                        ? "bg-foreground text-background"
                        : "bg-background text-foreground hover:bg-muted"
                    }`}
                  >
                    {cat.label}
                  </button>
                ))}
              </div>
            </div>
          </div>
        </header>

        {filteredEntries.map((entry, entryIndex) => {
          return (
            <section
              key={entry.version}
              id={`v${entry.version}`}
              ref={(el) => {
                sectionsRef.current[entryIndex + 1] = el
              }}
              className="py-12 sm:py-16"
            >
              <div className="space-y-6">
                <div className="border-border flex flex-col gap-3 border-b pb-4 sm:flex-row sm:items-end sm:justify-between">
                  <div className="space-y-1">
                    <h2 className="text-2xl font-light sm:text-3xl">
                      Version {entry.version}
                    </h2>
                    <div className="text-muted-foreground font-mono text-xs">
                      {entry.date}
                    </div>
                  </div>
                  <div className="text-muted-foreground flex items-center gap-2 text-xs">
                    <span>{entry.changes.length} updates</span>
                  </div>
                </div>

                <div className="space-y-3">
                  {entry.changes.map((change, changeIndex) => {
                    const changeId = `${entry.version}-${changeIndex}`
                    const isExpanded = expandedChanges.has(changeId)

                    return (
                      <article
                        key={changeIndex}
                        className="group border-border hover:border-muted-foreground/50 rounded-lg border shadow-[0px_1px_1px_0px_hsla(0,_0%,_0%,_0.02)_inset,_0px_1px_1px_0px_rgba(255,_252,_240,_0.5)_inset,_0px_0px_0px_1px_hsla(0,_0%,_100%,_0.1)_inset,_0px_0px_1px_0px_rgba(28,_27,_26,_0.5)] transition-all duration-300 hover:shadow-md"
                      >
                        <button
                          onClick={() => toggleChange(changeId)}
                          className="w-full p-4 text-left sm:p-5"
                        >
                          <div className="flex items-start justify-between gap-4">
                            <div className="flex-1 space-y-1.5">
                              <div className="flex items-center gap-2">
                                <span
                                  className={`rounded px-1.5 py-0.5 font-mono text-[10px] ${getCategoryColor(change.category)} bg-muted`}
                                >
                                  {getCategoryLabel(change.category)}
                                </span>
                              </div>
                              <h3 className="group-hover:text-muted-foreground text-base font-medium transition-colors duration-300 sm:text-lg">
                                {change.title}
                              </h3>
                            </div>
                            <svg
                              className={`text-muted-foreground h-5 w-5 flex-shrink-0 transition-transform duration-300 ${
                                isExpanded ? "rotate-180" : ""
                              }`}
                              fill="none"
                              stroke="currentColor"
                              viewBox="0 0 24 24"
                            >
                              <path
                                strokeLinecap="round"
                                strokeLinejoin="round"
                                strokeWidth={2}
                                d="M19 9l-7 7-7-7"
                              />
                            </svg>
                          </div>
                        </button>

                        <div
                          className={`overflow-hidden transition-all duration-500 ${
                            isExpanded
                              ? "max-h-96 opacity-100"
                              : "max-h-0 opacity-0"
                          }`}
                        >
                          <div className="px-4 pt-0 pb-4 sm:px-5 sm:pb-5">
                            <p className="text-muted-foreground text-sm leading-relaxed">
                              {change.description}
                            </p>
                          </div>
                        </div>
                      </article>
                    )
                  })}
                </div>
              </div>
            </section>
          )
        })}

        <footer className="border-border border-t py-12 sm:py-16">
          <div className="space-y-8">
            <div className="grid gap-8 lg:grid-cols-2">
              <div className="space-y-4">
                <h2 className="text-xl font-light sm:text-2xl">Stay Updated</h2>

                <div className="space-y-4">
                  <p className="text-muted-foreground text-sm leading-relaxed">
                    Subscribe to get notified about new features, improvements,
                    and important updates.
                  </p>

                  <div className="flex gap-2">
                    <input
                      type="email"
                      placeholder="your@email.com"
                      className="bg-background border-border focus:ring-ring text-foreground placeholder:text-muted-foreground flex-1 rounded-lg border px-3 py-2 text-sm shadow-[0px_1px_1px_0px_rgba(0,_0,_0,_0.05),_0px_1px_1px_0px_rgba(255,_252,_240,_0.5)_inset,_0px_0px_0px_1px_hsla(0,_0%,_100%,_0.1)_inset,_0px_0px_1px_0px_rgba(28,_27,_26,_0.5)] focus:ring-2 focus:outline-none"
                    />
                    <button className="bg-foreground text-background rounded-lg px-4 py-2 text-sm shadow-[0px_1px_1px_0px_rgba(0,_0,_0,_0.05),_0px_1px_1px_0px_rgba(255,_252,_240,_0.5)_inset,_0px_0px_0px_1px_hsla(0,_0%,_100%,_0.1)_inset,_0px_0px_1px_0px_rgba(28,_27,_26,_0.5)] transition-opacity duration-300 hover:opacity-90">
                      Subscribe
                    </button>
                  </div>
                </div>
              </div>

              <div className="space-y-4">
                <div className="text-muted-foreground font-mono text-xs">
                  RESOURCES
                </div>

                <div className="grid grid-cols-1 gap-2 sm:grid-cols-2">
                  {[
                    { name: "Documentation", url: "#" },
                    { name: "API Reference", url: "#" },
                    { name: "Status Page", url: "#" },
                    { name: "GitHub", url: "#" },
                  ].map((link) => (
                    <a
                      key={link.name}
                      href={link.url}
                      className="group border-border hover:border-muted-foreground/50 rounded-lg border p-3 shadow-[0px_1px_1px_0px_hsla(0,_0%,_0%,_0.02)_inset,_0px_0px_0px_1px_hsla(0,_0%,_0%,_0.02)_inset,_0px_0px_0px_1px_rgba(255,_255,_255,_0.25)] transition-all duration-300 hover:shadow-sm"
                    >
                      <div className="flex items-center justify-between">
                        <div className="text-foreground group-hover:text-muted-foreground text-sm transition-colors duration-300">
                          {link.name}
                        </div>
                        <svg
                          className="text-muted-foreground h-3.5 w-3.5 transform transition-transform duration-300 group-hover:translate-x-1"
                          fill="none"
                          stroke="currentColor"
                          viewBox="0 0 24 24"
                        >
                          <path
                            strokeLinecap="round"
                            strokeLinejoin="round"
                            strokeWidth={2}
                            d="M17 8l4 4m0 0l-4 4m4-4H3"
                          />
                        </svg>
                      </div>
                    </a>
                  ))}
                </div>
              </div>
            </div>

            <div className="border-border flex flex-col items-start justify-between gap-4 border-t pt-6 lg:flex-row lg:items-center">
              <div className="space-y-1">
                <div className="text-muted-foreground text-xs">
                  © 2025 Agentic AI. All rights reserved.
                </div>
                <div className="text-muted-foreground text-[10px]">
                  Built by aisdktools.com
                </div>
              </div>
            </div>
          </div>
        </footer>
      </main>

      <div className="from-background via-background/80 pointer-events-none fixed right-0 bottom-0 left-0 h-16 bg-gradient-to-t to-transparent"></div>
    </div>
  )
}
Professional changelog interface with version history, feature highlights, and release notes. Features chronological organization, categorized updates, and interactive filtering for transparent product evolution tracking and user communication.
marketing-changelog-1
marketing-changelog-1