feat(trust): SEO, legal docs, open source, federation polish

SEO & structured data:
- layout: metadataBase, template titles, OG image, canonical URL, robots config
- JSON-LD WebApplication/Site structured data on all pages
- Removed twitter:card (no Twitter/X integration)
- robots.ts: allow all, disallow /api/ /auth/ /profile/ /health/
- sitemap.ts: 14 routes with priority levels
- opengraph-image.tsx: generated neon DegenFeed social card (1200x630)

New pages:
- /about: mission, Rug Munch Media LLC, open source, infrastructure
- /faq: 15 questions
- /legal: LLC notice, DMCA agent, DPO, governing law
- /acceptable-use: 8 rules linked from Terms
- /community-guidelines: 12 instance rules

Legal improvements:
- Privacy: added COPPA, GDPR rights, CCPA rights, Data Protection Officer
- Terms: DMCA notice, age 16 (EU-friendly), Wyoming law, LLC attribution

Open source:
- LICENSE (MIT), CONTRIBUTING.md, SECURITY.md, CODEOWNERS, CODE_OF_CONDUCT.md
- Footer: git.rugmunch.io + codeberg.org links
This commit is contained in:
Crypto Rug Munch 2026-07-08 17:42:58 +07:00
parent 68783f3e6e
commit 2cb7336ccd
16 changed files with 848 additions and 43 deletions

1
CODEOWNERS Normal file
View file

@ -0,0 +1 @@
* @cryptorugmunch

70
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,70 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes
- Focusing on what is best for the overall community
Examples of unacceptable behavior:
- The use of sexualized language or imagery, and sexual attention or advances
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information without explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
**admin@rugmunch.io**.
All complaints will be reviewed and investigated promptly and fairly. All
community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
[homepage]: https://www.contributor-covenant.org
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
[Mozilla CoC]: https://github.com/mozilla/diversity

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Rug Munch Media LLC
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

66
SECURITY.md Normal file
View file

@ -0,0 +1,66 @@
# Security Policy
## Reporting a Vulnerability
**Do NOT open a public issue for security bugs.**
Instead, send a detailed report to **security@degenfeed.xyz**.
We take all security reports seriously. Good-faith security researchers are protected under our safe harbor policy.
### What to include
- Description of the vulnerability
- Steps to reproduce
- Affected components and versions
- Any proof-of-concept code (if available)
- Your PGP public key for encrypted follow-up (optional)
### Response SLA
| Severity | Acknowledgment | Patch |
|----------|---------------|-------|
| Critical | 24 hours | 7 days |
| High | 48 hours | 14 days |
| Medium | 5 days | 30 days |
| Low | Next release | Next release |
### Public key
A PGP key for `security@degenfeed.xyz` will be published at `/.well-known/security.txt`.
Currently, report via email without encryption. We will acknowledge within 48 hours.
## Supported Versions
| Version | Supported |
|---------|-----------|
| Latest release | YES |
| All prior versions | NO |
Only the latest deployed version receives security patches.
## Scope
- `degenfeed-web` monorepo (all packages and apps)
- Cloudflare Worker (`degenfeed-api`)
- `social.degenfeed.xyz` (GotoSocial instance)
- `degenfeed.xyz` (Cloudflare Pages)
Out of scope: third-party protocol APIs (Nostr relays, Farcaster hubs, Bluesky PDS, etc.).
## Safe Harbor
We will not pursue legal action against security researchers who:
- Make a good-faith effort to avoid privacy violations and data destruction
- Give us reasonable time to fix the issue before disclosing
- Do not exploit the vulnerability beyond what is necessary to demonstrate it
## Disclosure Policy
We follow coordinated disclosure. After a fix is deployed, we will:
1. Publish an advisory with CVE (if applicable)
2. Credit the researcher (unless they prefer anonymity)
3. Update this document with any new guidance

View file

@ -0,0 +1,86 @@
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'About — DegenFeed',
};
export default function AboutPage() {
return (
<div className="mx-auto max-w-2xl px-4 py-8 text-sm leading-relaxed text-gray-300">
<h1 className="mb-6 text-2xl font-bold text-white">About DegenFeed</h1>
<h2 className="mb-2 text-lg font-semibold text-white">1. What is DegenFeed?</h2>
<p className="mb-4">
DegenFeed is a multi-protocol social aggregator for web3. See posts from Nostr, Farcaster,
Lens, Bluesky, Mastodon, Threads, Reddit, and RSS all in one unified feed. Browse the
pulse of crypto social without jumping between platforms. No account needed.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">2. Mission</h2>
<p className="mb-4">
Make web3 social accessible to everyone. Aggregation without lock-in read from any
protocol, post to any protocol, own your identity. We believe in open protocols, not walled
gardens. The future of social media is decentralized, and DegenFeed is your window into it.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">3. Who Built This</h2>
<p className="mb-4">
DegenFeed is a product of{' '}
<strong className="text-white">Rug Munch Media LLC</strong>, a Wyoming limited liability
company. Built by crypto native engineers who live and breathe on-chain. This is not a VC-
backed startup it is an independent, self-funded project by people who actually use the
protocols they build for.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">4. Open Source</h2>
<p className="mb-4">
DegenFeed is licensed under the{' '}
<strong className="text-white">GNU Affero General Public License v3.0 (AGPL-3.0)</strong>.
Source code is available at{' '}
<a
href="https://git.rugmunch.io/RugMunchMedia/degenfeed-web"
className="text-degen-400 underline"
>
git.rugmunch.io/RugMunchMedia/degenfeed-web
</a>{' '}
and mirrored at{' '}
<a
href="https://codeberg.org/degenfeed/degenfeed-web"
className="text-degen-400 underline"
>
codeberg.org/degenfeed/degenfeed-web
</a>
. Contributions are welcome submit pull requests, report bugs, or suggest features.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">5. Infrastructure</h2>
<p className="mb-4">
DegenFeed is hosted on Cloudflare (Pages + Workers) for global edge performance. The social
instance (social.degenfeed.xyz) runs GotoSocial on dedicated hardware. We support 8 protocol
providers with zero tracking and no ads. Fast, clean, and private by design.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">6. Contact</h2>
<ul className="mb-4 list-inside list-disc space-y-1">
<li>
General:{' '}
<a href="mailto:admin@rugmunch.io" className="text-degen-400 underline">
admin@rugmunch.io
</a>
</li>
<li>
Legal:{' '}
<a href="mailto:legal@rugmunch.io" className="text-degen-400 underline">
legal@rugmunch.io
</a>
</li>
<li>
DMCA:{' '}
<a href="mailto:dmca@degenfeed.xyz" className="text-degen-400 underline">
dmca@degenfeed.xyz
</a>
</li>
</ul>
</div>
);
}

View file

@ -0,0 +1,81 @@
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Acceptable Use Policy — DegenFeed',
};
export default function AcceptableUsePage() {
return (
<div className="mx-auto max-w-2xl px-4 py-8 text-sm leading-relaxed text-gray-300">
<h1 className="mb-6 text-2xl font-bold text-white">Acceptable Use Policy</h1>
<p className="mb-4 text-gray-500">Last updated: July 2026</p>
<h2 className="mb-2 text-lg font-semibold text-white">1. No Illegal Activities</h2>
<p className="mb-4">
You may not use DegenFeed to engage in, promote, or facilitate any activity that violates
local, state, federal, or international law. This includes but is not limited to money
laundering, sanctions evasion, unlicensed money transmission, and the sale of controlled
substances.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">2. No Financial Scams</h2>
<p className="mb-4">
The following are strictly prohibited: pump-and-dump coordination, Ponzi or pyramid schemes,
rug pull planning or promotion, fake token launches, phishing links, wallet drainers, fake
airdrops, impersonation of projects or founders for financial gain, and any other
activity designed to defraud or deceive users for monetary benefit.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">3. No Hate Speech</h2>
<p className="mb-4">
Harassment, hate speech, threats of violence, targeted abuse, doxxing, and impersonation are
not tolerated. This includes attacks based on race, ethnicity, religion, gender, sexual
orientation, disability, or any other protected characteristic. Impersonating other users,
public figures, or projects is prohibited.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">4. No Spam</h2>
<p className="mb-4">
Mass posting, excessive self-promotion, link flooding, repetitive content, unsolicited
commercial messages, and bot-driven activity are not allowed. DegenFeed is for genuine human
interaction.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">5. No CSAM / Exploitation</h2>
<p className="mb-4">
Child sexual abuse material (CSAM) and any content that exploits minors is absolutely
prohibited. We maintain a zero-tolerance policy. Any such content will be immediately
removed, the account will be permanently banned, and the incident will be reported to the
National Center for Missing &amp; Exploited Children (NCMEC) and relevant law enforcement
authorities.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">6. AI Disclosure</h2>
<p className="mb-4">
Content generated or substantially assisted by artificial intelligence must be clearly
marked as such. Deepfakes, voice clones, or other synthetic media used for impersonation or
deception are strictly prohibited. Transparency about AI use helps maintain trust in our
community.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">7. Copyright</h2>
<p className="mb-4">
Respect intellectual property rights. Do not post content you do not own or have permission
to share. If you believe your copyright has been infringed, follow our DMCA process by
emailing{' '}
<a href="mailto:dmca@degenfeed.xyz" className="text-degen-400 underline">
dmca@degenfeed.xyz
</a>{' '}
with a complete takedown notice. We respond to valid DMCA notices within 48 hours.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">8. Enforcement</h2>
<p>
We reserve the right to suspend or ban accounts, remove content, limit access to features,
and report violations to law enforcement or relevant authorities. We may also defederate
from instances that violate this policy. Enforcement decisions are made at our sole
discretion but are always applied in good faith to protect the community.
</p>
</div>
);
}

View file

@ -0,0 +1,117 @@
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Community Guidelines — DegenFeed',
};
export default function CommunityGuidelinesPage() {
return (
<div className="mx-auto max-w-2xl px-4 py-8 text-sm leading-relaxed text-gray-300">
<h1 className="mb-2 text-2xl font-bold text-white">Community Guidelines</h1>
<p className="mb-6 text-gray-500">Federated instance rules for social.degenfeed.xyz</p>
<ol className="mb-4 list-inside space-y-4">
<li>
<h2 className="inline text-lg font-semibold text-white">Be Respectful</h2>
<p className="mt-1 ml-5">
No harassment, hate speech, or personal attacks. Treat others with basic human decency.
Disagreement is fine being a jerk is not.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">No Spam or Bots</h2>
<p className="mt-1 ml-5">
Genuine human interaction only. No automated accounts, crypto spam, link flooding, or
repetitive self-promotion. Bots are not permitted without explicit admin approval.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">No CSAM</h2>
<p className="mt-1 ml-5">
Zero tolerance for child sexual abuse material or any content exploiting minors.
Immediate ban and report to NCMEC and law enforcement. No exceptions, no warnings.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">No Financial Scams</h2>
<p className="mt-1 ml-5">
No pump-and-dump coordination, rug pulls, fake ICOs, phishing links, wallet drainers, or
any scheme designed to steal money or tokens. Share alpha, not scams.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">No Doxxing</h2>
<p className="mt-1 ml-5">
Do not share private personal information about others without their explicit consent.
This includes real names, addresses, phone numbers, private photos, and financial
information.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">No Impersonation</h2>
<p className="mt-1 ml-5">
Do not pretend to be someone else. This includes impersonating other users, public
figures, projects, companies, or officials. Parody accounts must be clearly labeled as
such.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">Disclose AI Content</h2>
<p className="mt-1 ml-5">
Mark AI-generated or AI-assisted posts clearly. Be honest about what you created versus
what a model generated. No deepfakes used for impersonation or deception.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">Respect Copyright</h2>
<p className="mt-1 ml-5">
Do not post content you do not own or have permission to share. Follow DMCA procedures
for takedown requests at{' '}
<a href="mailto:dmca@degenfeed.xyz" className="text-degen-400 underline">
dmca@degenfeed.xyz
</a>
.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">English Primary</h2>
<p className="mt-1 ml-5">
English is the main language of this instance, but all languages are welcome in their
respective communities. Use content warnings and hashtags to help others filter.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">No Illegal Activities</h2>
<p className="mt-1 ml-5">
Comply with all applicable laws. This includes laws in your jurisdiction, the United
States (where our servers are located), and the jurisdictions of federated instances you
interact with.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">Mark Adult Content</h2>
<p className="mt-1 ml-5">
Use content warnings for NSFW material. Unmarked adult content will be removed. Illegal
content will be reported. Keep the instance safe for all users.
</p>
</li>
<li>
<h2 className="inline text-lg font-semibold text-white">Be a Good Fediverse Citizen</h2>
<p className="mt-1 ml-5">
Do not harass users on other instances, do not exploit federation to bypass blocks or
bans, and do not use the instance as a launchpad for cross-instance spam campaigns.
Respect the rules of federated instances you interact with.
</p>
</li>
</ol>
<p className="mt-6 text-gray-500">
Violations may result in content removal, account suspension, or instance defederation.
Reports:{' '}
<a href="mailto:admin@rugmunch.io" className="text-degen-400 underline">
admin@rugmunch.io
</a>
</p>
</div>
);
}

View file

@ -0,0 +1,95 @@
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'FAQ — DegenFeed',
description:
'Frequently asked questions about DegenFeed, the open-source web3 social aggregator.',
};
const faqs = [
{
q: 'What is DegenFeed?',
a: 'DegenFeed is an open-source multi-protocol social aggregator for web3. It displays posts from Nostr, Farcaster, Lens, Bluesky, Mastodon, Threads, Reddit, and RSS feeds in a single unified timeline. No account is needed to browse.',
},
{
q: 'How does aggregation work?',
a: 'We pull public posts from each protocol via their open APIs, normalize them to a common format, rank them by engagement and recency, and display them in your feed. Nothing is stored or archived beyond what is needed to serve feeds.',
},
{
q: 'Do I need an account?',
a: 'No. Browsing DegenFeed is completely free and requires no sign-up. Creating an account unlocks posting, tipping, cross-posting across protocols, and a free @degenfeed.xyz handle on the Fediverse.',
},
{
q: 'Is DegenFeed open source?',
a: 'Yes. DegenFeed is licensed under AGPL-3.0. The full source code is available on git.rugmunch.io and codeberg.org. Contributions are welcome — see CONTRIBUTING.md for guidelines.',
},
{
q: 'What is the premium tier?',
a: 'Premium ($5/mo) adds advanced filtering, custom feeds, noise reduction, and priority support. Creator tier ($15/mo) unlocks analytics, cross-posting, and post scheduling.',
},
{
q: 'How do I get a @degenfeed.xyz handle?',
a: 'Visit social.degenfeed.xyz, connect your wallet, and request an account with a brief reason for joining. Approvals are usually processed within 24 hours. Your handle works across the entire Fediverse via ActivityPub.',
},
{
q: 'How does federation work?',
a: 'DegenFeed runs a GotoSocial instance at social.degenfeed.xyz that federates via ActivityPub. This means your @degenfeed.xyz account can follow and be followed by users on Mastodon, Lemmy, Pixelfed, and other Fediverse platforms.',
},
{
q: "What is ActivityPub?",
a: 'ActivityPub is a W3C standard for decentralized social networking. It powers Mastodon, Lemmy, Pixelfed, PeerTube, GotoSocial, and millions of federated accounts. It is the protocol that makes the Fediverse work without a central server.',
},
{
q: 'Can I post from DegenFeed?',
a: 'Yes. Connect your accounts (Nostr, Bluesky, Mastodon, Farcaster, Lens) and use the DegenFeed composer. Posts are sent directly to your chosen protocol. You can cross-post to multiple protocols simultaneously with a Creator subscription.',
},
{
q: 'What wallets are supported?',
a: 'Solana wallets (Phantom, Backpack, Solflare) and EVM wallets (MetaMask, Rainbow, WalletConnect). Wallets are used for sign-in and for tipping creators.',
},
{
q: 'How do tips work?',
a: 'Tip ETH, SOL, or USDC directly to any post. Tips go directly to the creator\'s wallet with no intermediary. Lightning Network support is in development.',
},
{
q: 'Is my data sold?',
a: 'No. DegenFeed does not sell data, does not run ads, and does not track users beyond what is needed to serve feeds. Premium subscriptions fund development.',
},
{
q: 'How do I delete my account?',
a: 'Data deletion is available via /api/account/delete. For GotoSocial accounts, manage your account at social.degenfeed.xyz.',
},
{
q: 'Is there an RSS feed?',
a: 'Yes. Subscribe to /api/feed/rss.xml in your RSS reader to get DegenFeed\'s top posts. Atom format is also available at /api/feed/atom.xml.',
},
{
q: 'How do I report content?',
a: 'Use the report button on any post, or email admin@rugmunch.io. For copyright concerns, contact dmca@degenfeed.xyz.',
},
];
export default function FAQPage() {
return (
<div className="mx-auto max-w-2xl px-4 py-8 text-sm leading-relaxed text-gray-300">
<h1 className="mb-6 text-2xl font-bold text-white">Frequently Asked Questions</h1>
<div className="space-y-6">
{faqs.map((faq, i) => (
<div key={i}>
<h2 className="mb-1 text-base font-semibold text-white">{faq.q}</h2>
<p>{faq.a}</p>
</div>
))}
</div>
<p className="mt-8 border-t border-gray-800 pt-6 text-gray-500">
Don&apos;t see your question? Reach out to{' '}
<a href="mailto:admin@rugmunch.io" className="text-degen-400 underline">
admin@rugmunch.io
</a>
.
</p>
</div>
);
}

View file

@ -10,22 +10,38 @@ import { Web3Provider } from '../components/Web3Provider';
export const metadata: Metadata = {
manifest: '/manifest.json',
title: 'DegenFeed — The social feed of web3',
metadataBase: new URL('https://degenfeed.xyz'),
title: {
default: 'DegenFeed — The social feed of web3',
template: '%s — DegenFeed',
},
description:
'See every network. Zero sign-ups. DegenFeed aggregates Nostr, Farcaster, Lens, Bluesky, Threads, Reddit, and RSS into one window.',
'See every network. Zero sign-ups. DegenFeed aggregates Nostr, Farcaster, Lens, Bluesky, Mastodon, Threads, Reddit, and RSS into one window.',
openGraph: {
title: 'DegenFeed — The social feed of web3',
description:
'See every network. Zero sign-ups. Nostr, Farcaster, Lens, Bluesky, Threads, Reddit, RSS in one window.',
'See every network. Zero sign-ups. Nostr, Farcaster, Lens, Bluesky, Mastodon, Threads, Reddit, RSS in one window.',
url: 'https://degenfeed.xyz',
siteName: 'DegenFeed',
type: 'website',
images: [
{
url: '/og-image.png',
width: 1200,
height: 630,
alt: 'DegenFeed — The social feed of web3',
},
],
},
twitter: {
card: 'summary_large_image',
title: 'DegenFeed — The social feed of web3',
description:
'See every network. Zero sign-ups. Nostr, Farcaster, Lens, Bluesky, Threads, Reddit, RSS in one window.',
robots: {
index: true,
follow: true,
'max-image-preview': 'large',
'max-snippet': -1,
'max-video-preview': -1,
},
alternates: {
canonical: 'https://degenfeed.xyz',
},
};
@ -49,6 +65,31 @@ export default function RootLayout({ children }: { children: React.ReactNode })
id="sw-register"
strategy="afterInteractive"
>{`if('serviceWorker' in navigator){navigator.serviceWorker.register('/sw.js').catch(()=>{})}`}</Script>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'WebApplication',
name: 'DegenFeed',
url: 'https://degenfeed.xyz',
description:
'Open-source multi-protocol social aggregator for web3. Nostr, Farcaster, Lens, Bluesky, Mastodon, Threads, Reddit, RSS in one feed.',
applicationCategory: 'SocialNetworkingApplication',
operatingSystem: 'Web',
offers: {
'@type': 'Offer',
price: '0',
priceCurrency: 'USD',
},
author: {
'@type': 'Organization',
name: 'Rug Munch Media LLC',
url: 'https://degenfeed.xyz',
},
}),
}}
/>
<SolanaProvider>
<Web3Provider>
<ToastProvider>

View file

@ -0,0 +1,68 @@
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Legal Notice — DegenFeed',
description: 'Legal notice and company information for DegenFeed, operated by Rug Munch Media LLC.',
};
export default function LegalPage() {
return (
<div className="mx-auto max-w-2xl px-4 py-8 text-sm leading-relaxed text-gray-300">
<h1 className="mb-2 text-2xl font-bold text-white">Legal Notice</h1>
<p className="mb-8 text-lg text-degen-400">Rug Munch Media LLC</p>
<h2 className="mb-2 text-lg font-semibold text-white">Company</h2>
<p className="mb-4">
DegenFeed is a product of Rug Munch Media LLC, a Wyoming limited liability company.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">Registered Office</h2>
<p className="mb-4">Registered in the State of Wyoming, United States of America.</p>
<h2 className="mb-2 text-lg font-semibold text-white">Contact</h2>
<ul className="mb-4 space-y-1">
<li>
General inquiries:{' '}
<a href="mailto:admin@rugmunch.io" className="text-degen-400 underline">
admin@rugmunch.io
</a>
</li>
<li>
Legal / law enforcement:{' '}
<a href="mailto:legal@rugmunch.io" className="text-degen-400 underline">
legal@rugmunch.io
</a>
</li>
</ul>
<h2 className="mb-2 text-lg font-semibold text-white">DMCA Agent</h2>
<p className="mb-4">
For copyright-related takedown requests:{' '}
<a href="mailto:dmca@degenfeed.xyz" className="text-degen-400 underline">
dmca@degenfeed.xyz
</a>
</p>
<h2 className="mb-2 text-lg font-semibold text-white">Data Protection Officer</h2>
<p className="mb-4">
For GDPR and data privacy inquiries:{' '}
<a href="mailto:legal@rugmunch.io" className="text-degen-400 underline">
legal@rugmunch.io
</a>
</p>
<h2 className="mb-2 text-lg font-semibold text-white">Disclaimer</h2>
<p className="mb-4">
DegenFeed is provided &ldquo;as is&rdquo; without warranty of any kind. DegenFeed is not a
financial services platform. Nothing on DegenFeed constitutes financial advice. All
trademarks and registered trademarks are the property of their respective owners.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">Governing Law</h2>
<p className="mb-4">
These terms and your use of DegenFeed are governed by the laws of the State of Wyoming,
United States, without regard to conflict of law principles.
</p>
</div>
);
}

View file

@ -0,0 +1,81 @@
import { ImageResponse } from 'next/og';
export const runtime = 'edge';
export const alt = 'DegenFeed — The social feed of web3';
export const size = { width: 1200, height: 630 };
export const contentType = 'image/png';
export default function Image() {
return new ImageResponse(
(
<div
style={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
width: '100%',
height: '100%',
background: 'linear-gradient(135deg, #000000 0%, #0a0f0a 50%, #000000 100%)',
fontFamily: 'Inter',
}}
>
<div
style={{
display: 'flex',
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
opacity: 0.03,
backgroundImage:
'radial-gradient(circle at 30% 50%, #00ff41 0%, transparent 60%), radial-gradient(circle at 70% 50%, #00ff41 0%, transparent 60%)',
}}
/>
<div
style={{
display: 'flex',
fontSize: 96,
fontWeight: 900,
color: '#00ff41',
letterSpacing: '-0.03em',
textShadow: '0 0 80px rgba(0, 255, 65, 0.3), 0 0 160px rgba(0, 255, 65, 0.15)',
marginBottom: 24,
}}
>
DegenFeed
</div>
<div
style={{
display: 'flex',
fontSize: 32,
fontWeight: 500,
color: '#9ca3af',
marginBottom: 80,
}}
>
The social feed of web3
</div>
<div
style={{
display: 'flex',
position: 'absolute',
bottom: 60,
left: 0,
right: 0,
justifyContent: 'center',
fontSize: 24,
fontWeight: 400,
color: '#4b5563',
}}
>
degenfeed.xyz &middot; Open source, zero sign-ups
</div>
</div>
),
{ ...size },
);
}

View file

@ -1,7 +1,8 @@
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Privacy Policy — DegenFeed',
title: 'Privacy Policy',
description: 'Privacy policy for DegenFeed, operated by Rug Munch Media LLC. No tracking, no ads, no data sales.',
};
export default function PrivacyPage() {
@ -56,15 +57,51 @@ export default function PrivacyPage() {
<li>All data is stored in Cloudflare KV. Deletion is immediate and permanent.</li>
</ul>
<h2 className="mb-2 text-lg font-semibold text-white">5. Third Parties</h2>
<h2 className="mb-2 text-lg font-semibold text-white">5. GDPR Rights (EU/EEA Users)</h2>
<p className="mb-4">
If you are in the EU or EEA, you have the right to access, rectify, delete, and port your
data. To exercise these rights, contact{' '}
<a href="mailto:admin@rugmunch.io" className="text-degen-400 underline">
admin@rugmunch.io
</a>
. Our Data Protection Officer can be reached at{' '}
<a href="mailto:legal@rugmunch.io" className="text-degen-400 underline">
legal@rugmunch.io
</a>
.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">6. CCPA Rights (California Users)</h2>
<p className="mb-4">
California residents have the right to know what personal data we collect, request deletion,
and opt out of data sales. DegenFeed does not sell personal data. To exercise CCPA rights,
email{' '}
<a href="mailto:admin@rugmunch.io" className="text-degen-400 underline">
admin@rugmunch.io
</a>
.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">7. COPPA Compliance</h2>
<p className="mb-4">
DegenFeed does not knowingly collect personal information from children under 13. If you
believe a child has provided us with personal data, contact{' '}
<a href="mailto:admin@rugmunch.io" className="text-degen-400 underline">
admin@rugmunch.io
</a>{' '}
and we will delete it promptly.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">8. Third Parties</h2>
<p className="mb-4">
We use Cloudflare (infrastructure) and Plausible (anonymous analytics). No ad networks, no
trackers, no data brokers.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">6. Contact</h2>
<h2 className="mb-2 text-lg font-semibold text-white">9. Contact</h2>
<p>
Questions? Email{' '}
DegenFeed is operated by Rug Munch Media LLC, a Wyoming limited liability company. For
privacy questions, contact{' '}
<a href="mailto:admin@rugmunch.io" className="text-degen-400 underline">
admin@rugmunch.io
</a>

View file

@ -2,11 +2,13 @@ import type { MetadataRoute } from 'next';
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: '*',
allow: '/',
disallow: ['/api/', '/auth/'],
},
sitemap: 'https://app.degenfeed.xyz/sitemap.xml',
rules: [
{
userAgent: '*',
allow: '/',
disallow: ['/api/', '/auth/', '/profile/', '/health'],
},
],
sitemap: 'https://degenfeed.xyz/sitemap.xml',
};
}

View file

@ -1,26 +1,24 @@
import type { MetadataRoute } from 'next';
export const runtime = 'edge';
export default function sitemap(): MetadataRoute.Sitemap {
const base = 'https://app.degenfeed.xyz';
const baseUrl = 'https://degenfeed.xyz';
const staticPaths = [
{ url: `${base}/feed`, priority: 1.0, changeFrequency: 'always' as const },
{ url: `${base}/home`, priority: 0.9, changeFrequency: 'daily' as const },
{ url: `${base}/news`, priority: 0.8, changeFrequency: 'hourly' as const },
{ url: `${base}/newsletter`, priority: 0.7, changeFrequency: 'daily' as const },
{ url: `${base}/status`, priority: 0.5, changeFrequency: 'hourly' as const },
{ url: `${base}/premium`, priority: 0.4, changeFrequency: 'weekly' as const },
{ url: `${base}/profile`, priority: 0.4, changeFrequency: 'weekly' as const },
{ url: `${base}/privacy`, priority: 0.2, changeFrequency: 'monthly' as const },
{ url: `${base}/terms`, priority: 0.2, changeFrequency: 'monthly' as const },
const staticRoutes = [
{ url: baseUrl, lastModified: new Date(), changeFrequency: 'hourly' as const, priority: 1 },
{ url: `${baseUrl}/feed`, lastModified: new Date(), changeFrequency: 'hourly' as const, priority: 0.9 },
{ url: `${baseUrl}/news`, lastModified: new Date(), changeFrequency: 'hourly' as const, priority: 0.9 },
{ url: `${baseUrl}/home`, lastModified: new Date(), changeFrequency: 'daily' as const, priority: 0.8 },
{ url: `${baseUrl}/discover`, lastModified: new Date(), changeFrequency: 'daily' as const, priority: 0.7 },
{ url: `${baseUrl}/newsletter`, lastModified: new Date(), changeFrequency: 'weekly' as const, priority: 0.7 },
{ url: `${baseUrl}/premium`, lastModified: new Date(), changeFrequency: 'weekly' as const, priority: 0.6 },
{ url: `${baseUrl}/about`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.5 },
{ url: `${baseUrl}/faq`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.5 },
{ url: `${baseUrl}/privacy`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.3 },
{ url: `${baseUrl}/terms`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.3 },
{ url: `${baseUrl}/community-guidelines`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.3 },
{ url: `${baseUrl}/acceptable-use`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.3 },
{ url: `${baseUrl}/status`, lastModified: new Date(), changeFrequency: 'daily' as const, priority: 0.4 },
];
return staticPaths.map((p) => ({
url: p.url,
lastModified: new Date(),
changeFrequency: p.changeFrequency,
priority: p.priority,
}));
return staticRoutes;
}

View file

@ -1,6 +1,9 @@
import type { Metadata } from 'next';
export const metadata: Metadata = { title: 'Terms of Service — DegenFeed' };
export const metadata: Metadata = {
title: 'Terms of Service',
description: 'Terms of Service for DegenFeed, operated by Rug Munch Media LLC, a Wyoming limited liability company.',
};
export default function TermsPage() {
return (
@ -15,7 +18,7 @@ export default function TermsPage() {
<h2 className="mb-2 text-lg font-semibold text-white">2. Eligibility</h2>
<p className="mb-4">
You must be at least 13 years old. If you are under 18, you need parental consent.
You must be at least 16 years old. If you are under 18, you need parental consent.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">3. Your Content</h2>
@ -36,7 +39,18 @@ export default function TermsPage() {
.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">5. Disclaimer</h2>
<h2 className="mb-2 text-lg font-semibold text-white">5. DMCA Notice</h2>
<p className="mb-4">
If you believe content on DegenFeed infringes your copyright, send a DMCA notice to{' '}
<a href="mailto:dmca@degenfeed.xyz" className="text-degen-400 underline">
dmca@degenfeed.xyz
</a>{' '}
with: identification of the copyrighted work, the infringing URL, a statement of good faith
belief, your contact information, and a physical or electronic signature. We respond to
valid DMCA notices within 48 hours.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">6. Disclaimer</h2>
<p className="mb-4">
DegenFeed is provided &ldquo;as is&rdquo; without warranty. We are not responsible for
content posted by third parties on connected networks. Content may include financial
@ -49,8 +63,17 @@ export default function TermsPage() {
any indirect, incidental, or consequential damages arising from your use of the service.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">7. Changes</h2>
<p>We may update these terms. Continued use after changes constitutes acceptance.</p>
<h2 className="mb-2 text-lg font-semibold text-white">7. Governing Law</h2>
<p className="mb-4">
These terms are governed by the laws of the State of Wyoming, United States, without regard
to conflict of law principles.
</p>
<h2 className="mb-2 text-lg font-semibold text-white">8. Changes</h2>
<p>
We may update these terms. Continued use after changes constitutes acceptance. DegenFeed is
operated by Rug Munch Media LLC, a Wyoming limited liability company.
</p>
</div>
);
}

View file

@ -238,7 +238,25 @@ export function Shell({ children }: { children: React.ReactNode }) {
</a>
</div>
<p className="text-xs text-gray-600">
© {new Date().getFullYear()} DegenFeed. No account required.
© {new Date().getFullYear()} DegenFeed a Rug Munch Media LLC product. No account required. Open source on{' '}
<a
href="https://git.rugmunch.io/RugMunchMedia/degenfeed-web"
target="_blank"
rel="noopener noreferrer"
className="text-gray-500 underline transition-colors hover:text-gray-400"
>
git.rugmunch.io
</a>{' '}
and{' '}
<a
href="https://codeberg.org/degenfeed/degenfeed-web"
target="_blank"
rel="noopener noreferrer"
className="text-gray-500 underline transition-colors hover:text-gray-400"
>
codeberg.org
</a>
.
</p>
</div>
</footer>