> ## Documentation Index
> Fetch the complete documentation index at: https://docs.octav.fi/llms.txt
> Use this file to discover all available pages before exploring further.

# Submit a Feature

> Request new features and vote on existing suggestions

export const Button = ({href, children, variant = "primary"}) => {
  const styles = {
    primary: {
      backgroundColor: "#3F58C7",
      color: "white",
      textDecoration: "none",
      fontWeight: "600",
      fontSize: "15px",
      lineHeight: "20px",
      borderRadius: "4px"
    },
    secondary: {
      backgroundColor: "#3F58C7",
      color: "white",
      textDecoration: "none",
      fontWeight: "600",
      fontSize: "15px",
      lineHeight: "20px",
      borderRadius: "4px"
    },
    outline: {
      border: "2px solid #3F58C7",
      color: "#3F58C7",
      backgroundColor: "transparent",
      textDecoration: "none",
      fontWeight: "600",
      fontSize: "15px",
      lineHeight: "20px",
      borderRadius: "4px"
    }
  };
  return <a href={href} style={styles[variant]} className="inline-block px-4 py-2 transition-all duration-200" onMouseEnter={e => {
    if (variant === "primary" || variant === "secondary") {
      e.target.style.backgroundColor = "#5366d4";
      e.target.style.transform = "translateY(-1px)";
      e.target.style.boxShadow = "0 4px 12px rgba(63, 88, 199, 0.3)";
    }
    if (variant === "outline") {
      e.target.style.backgroundColor = "#3F58C7";
      e.target.style.color = "white";
      e.target.style.transform = "translateY(-1px)";
      e.target.style.boxShadow = "0 4px 12px rgba(63, 88, 199, 0.3)";
    }
  }} onMouseLeave={e => {
    if (variant === "primary" || variant === "secondary") {
      e.target.style.backgroundColor = "#3F58C7";
      e.target.style.transform = "translateY(0)";
      e.target.style.boxShadow = "none";
    }
    if (variant === "outline") {
      e.target.style.backgroundColor = "transparent";
      e.target.style.color = "#3F58C7";
      e.target.style.transform = "translateY(0)";
      e.target.style.boxShadow = "none";
    }
  }}>
      {children}
    </a>;
};

export const Alert = ({type = "info", title, children}) => {
  const types = {
    info: {
      bg: "bg-[#3F58C7]/10",
      border: "border-[#3F58C7]",
      icon: "ℹ️",
      titleColor: "text-[#3F58C7]"
    },
    success: {
      bg: "bg-[#59CE7E]/10",
      border: "border-[#59CE7E]",
      icon: "✓",
      titleColor: "text-[#59CE7E]"
    },
    warning: {
      bg: "bg-[#F4BD4D]/10",
      border: "border-[#F4BD4D]",
      icon: "⚠️",
      titleColor: "text-[#F4BD4D]"
    },
    error: {
      bg: "bg-[#FF1A45]/10",
      border: "border-[#FF1A45]",
      icon: "✕",
      titleColor: "text-[#FF1A45]"
    },
    tip: {
      bg: "bg-[#6BCCD1]/10",
      border: "border-[#6BCCD1]",
      icon: "💡",
      titleColor: "text-[#6BCCD1]"
    }
  };
  const config = types[type] || types.info;
  return <div className={`${config.bg} ${config.border} border-l-4 rounded-r-lg p-4 my-4`}>
      <div className="flex items-start gap-3">
        <span className="text-xl">{config.icon}</span>
        <div className="flex-1">
          {title && <h4 className={`${config.titleColor} font-semibold mb-1`}>
              {title}
            </h4>}
          <div className="text-sm">{children}</div>
        </div>
      </div>
    </div>;
};

Help shape the future of Octav by submitting feature requests and voting on ideas from the community.

***

## Submit a Feature Request

We use **Canny** to collect and track feature requests from our community.

<Button href="https://octav.canny.io/feature-requests" variant="primary">Submit on Canny</Button>

### What You Can Do on Canny

* **Submit new feature ideas** - Share your suggestions for improvements
* **Vote on existing requests** - Upvote features you want to see
* **Comment and discuss** - Add details or use cases to feature requests
* **Track progress** - See which features are planned, in progress, or completed

<Alert type="tip" title="Check for Duplicates">
  Before submitting, search existing requests to see if your idea has already been suggested. Upvote existing requests instead of creating duplicates!
</Alert>

***

## Submit via Discord

You can also submit feature requests directly in our Discord community.

<Button href="https://discord.com/invite/qvcknAa73A" variant="secondary">Join Discord</Button>

### Discord Submission

1. Join our Discord server using the link above
2. Navigate to the **#feature-requests** channel
3. Post your feature request with details
4. Community members can react to upvote
5. Team members will review and respond

<Alert type="info" title="Fastest Response">
  Discord is the easiest way to get quick feedback from both the team and community on your feature ideas.
</Alert>
