mirror of
https://github.com/MeshEnvy/mesh-forge.git
synced 2026-03-28 17:42:55 +01:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f1e5390afc | ||
|
|
b1ac3abf2f | ||
|
|
305ccc64a9 | ||
|
|
ef6196ab7e | ||
|
|
665989a41a | ||
|
|
daee517764 | ||
|
|
9b7661562f | ||
|
|
154bee2e8c | ||
|
|
e931c217cd | ||
|
|
431d91f511 | ||
|
|
b80b42f1c0 | ||
|
|
10ba16a9a4 |
@@ -1,8 +0,0 @@
|
||||
# Changesets
|
||||
|
||||
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
|
||||
with multi-package repos, or single-package repos to help you version and publish your code. You can
|
||||
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
|
||||
|
||||
We have a quick list of common questions to get you started engaging with this project in
|
||||
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
|
||||
"changelog": "@changesets/cli/changelog",
|
||||
"commit": false,
|
||||
"fixed": [],
|
||||
"linked": [],
|
||||
"access": "public",
|
||||
"baseBranch": "main",
|
||||
"updateInternalDependencies": "patch",
|
||||
"ignore": []
|
||||
}
|
||||
@@ -2,6 +2,10 @@
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
when making changes to a module that has a changelog, add the appropriate unreleased change log entry
|
||||
when making changes to a project that has a changelog, add the appropriate unreleased change log entry
|
||||
|
||||
when preparing an MPM plugin release, don't forget to update @public/registry.json
|
||||
|
||||
changelog uses: major/minor/patch and does NOT use added/changed/removed
|
||||
|
||||
when preparing a release, do not touch git. no tagging, no commits
|
||||
|
||||
9
.gitmodules
vendored
9
.gitmodules
vendored
@@ -23,3 +23,12 @@
|
||||
[submodule "vendor/meshscript"]
|
||||
path = vendor/meshscript
|
||||
url = git@github.com:MeshEnvy/meshscript.git
|
||||
[submodule "vendor/meshcore-flasher"]
|
||||
path = vendor/meshcore-flasher
|
||||
url = git@github.com:meshcore-dev/flasher.meshcore.dev.git
|
||||
[submodule "vendor/lofs"]
|
||||
path = vendor/lofs
|
||||
url = git@github.com:MeshEnvy/lofs.git
|
||||
[submodule "vendor/lofs-test"]
|
||||
path = vendor/lofs-test
|
||||
url = git@github.com:MeshEnvy/lofs-test.git
|
||||
|
||||
28
CHANGELOG.md
28
CHANGELOG.md
@@ -7,9 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.3.0] - 2025-12-10
|
||||
|
||||
### Minor
|
||||
|
||||
- Added footer with links to legal pages (License, Privacy Policy, Terms of Service)
|
||||
- Added licensing notice page explaining GPLv3 licensing for generated projects
|
||||
- Added privacy policy page detailing data collection and usage
|
||||
- Added terms of service page with usage terms and disclaimers
|
||||
|
||||
### Patch
|
||||
|
||||
- Fix prerendering on dynamic routes
|
||||
|
||||
## [0.2.0] - 2025-12-10
|
||||
|
||||
### Minor
|
||||
|
||||
- Switched OAuth authentication provider from Google to GitHub
|
||||
- Integrated Giscus comments into build pages for discussion threads per build configuration
|
||||
|
||||
### Patch
|
||||
|
||||
- Made build hash label clickable in BuildProgress component to navigate to build detail page
|
||||
|
||||
## [0.1.0] - 2025-12-10
|
||||
|
||||
Initial release
|
||||
|
||||
[Unreleased]: https://github.com/MeshEnvy/mesh-forge/compare/v0.1.0...HEAD
|
||||
[Unreleased]: https://github.com/MeshEnvy/mesh-forge/compare/v0.3.0...HEAD
|
||||
[0.3.0]: https://github.com/MeshEnvy/mesh-forge/releases/tag/v0.3.0
|
||||
[0.2.0]: https://github.com/MeshEnvy/mesh-forge/releases/tag/v0.2.0
|
||||
[0.1.0]: https://github.com/MeshEnvy/mesh-forge/releases/tag/v0.1.0
|
||||
|
||||
@@ -7,7 +7,7 @@ import { getArtifactFilenameBase } from "@/convex/lib/filename"
|
||||
import modulesData from "@/convex/modules.json"
|
||||
import { getImplicitDependencies, humanizeStatus } from "@/lib/utils"
|
||||
import registryData from "@/public/registry.json"
|
||||
import { AlertCircle, CheckCircle, Copy, Loader2, Share2, X, XCircle } from "lucide-react"
|
||||
import { CheckCircle, Copy, Loader2, Share2, X, XCircle } from "lucide-react"
|
||||
import { useState } from "react"
|
||||
import { toast } from "sonner"
|
||||
import { navigate } from "vike/client/router"
|
||||
@@ -139,60 +139,6 @@ export function BuildProgress({ build, isAdmin = false, onRetry, showActions = t
|
||||
.join(" ")
|
||||
}
|
||||
|
||||
// Generate GitHub discussion URL with prefilled body
|
||||
const generateDiscussionUrl = (): string => {
|
||||
const flags = computeFlagsFromConfig(build.config)
|
||||
const plugins = build.config.pluginsEnabled?.join(", ") || "(none)"
|
||||
const timestamp = new Date(build.startedAt).toISOString()
|
||||
const githubRunLink = githubActionUrl ? `[View run](${githubActionUrl})` : "(not available)"
|
||||
const buildPageUrl = `${window.location.origin}/builds/${build.buildHash}`
|
||||
|
||||
// Format plugins as +plugin@version
|
||||
const formattedPlugins =
|
||||
build.config.pluginsEnabled
|
||||
?.map(plugin => {
|
||||
// Plugin might be "slug@version" or just "slug"
|
||||
return plugin.includes("@") ? `+${plugin}` : `+${plugin}`
|
||||
})
|
||||
.join(" ") || ""
|
||||
|
||||
const bracketContent = [
|
||||
build.config.target,
|
||||
`v${build.config.version}`,
|
||||
...(formattedPlugins ? [formattedPlugins] : []),
|
||||
].join(" ")
|
||||
|
||||
const discussionTitle = `Build ${build.status === "failure" ? "Failed" : "Issue"}: ${targetLabel} [${bracketContent}]`
|
||||
|
||||
const discussionBody = `## Build ${build.status === "failure" ? "Failed" : "Information"}
|
||||
|
||||
**Build Hash**: \`${build.buildHash}\`
|
||||
**Target Board**: ${build.config.target}
|
||||
**Firmware Version**: ${build.config.version}
|
||||
**Build Flags**: ${flags || "(none)"}
|
||||
**Plugins**: ${plugins}
|
||||
**Build Timestamp**: ${timestamp}
|
||||
|
||||
**Build Page**: [View build page](${buildPageUrl})
|
||||
**GitHub Run**: ${githubRunLink}
|
||||
|
||||
## Additional Information
|
||||
(Please add any additional details about the issue here)`
|
||||
|
||||
const baseUrl = "https://github.com/MeshEnvy/mesh-forge/discussions/new"
|
||||
const params = new URLSearchParams({
|
||||
category: "q-a",
|
||||
title: discussionTitle,
|
||||
body: discussionBody,
|
||||
})
|
||||
|
||||
return `${baseUrl}?${params.toString()}`
|
||||
}
|
||||
|
||||
const handleReportIssue = () => {
|
||||
window.open(generateDiscussionUrl(), "_blank", "noopener,noreferrer")
|
||||
}
|
||||
|
||||
const handleRetry = async () => {
|
||||
if (!build?._id || !onRetry) return
|
||||
try {
|
||||
@@ -270,7 +216,16 @@ export function BuildProgress({ build, isAdmin = false, onRetry, showActions = t
|
||||
<div>
|
||||
<h2 className="text-2xl font-semibold mb-2 flex items-center gap-2">
|
||||
{getStatusIcon()}
|
||||
{targetLabel}
|
||||
<a
|
||||
href={`/builds/${build.buildHash}`}
|
||||
onClick={e => {
|
||||
e.preventDefault()
|
||||
navigate(`/builds/${build.buildHash}`)
|
||||
}}
|
||||
className="hover:text-cyan-400 transition-colors"
|
||||
>
|
||||
{targetLabel}
|
||||
</a>
|
||||
{status !== "success" && status !== "failure" && (
|
||||
<button
|
||||
type="button"
|
||||
@@ -302,10 +257,6 @@ export function BuildProgress({ build, isAdmin = false, onRetry, showActions = t
|
||||
</div>
|
||||
{showActions && (
|
||||
<div className="flex gap-2">
|
||||
<Button onClick={handleReportIssue} variant="outline" className="border-slate-600 hover:bg-slate-800">
|
||||
<AlertCircle className="w-4 h-4 mr-2" />
|
||||
Support
|
||||
</Button>
|
||||
<Button
|
||||
onClick={() => navigate(`/builds/new/${build.buildHash}`)}
|
||||
variant="outline"
|
||||
|
||||
21
components/Footer.tsx
Normal file
21
components/Footer.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
export default function Footer() {
|
||||
return (
|
||||
<footer className="border-t border-slate-800 bg-slate-950 mt-auto">
|
||||
<div className="max-w-7xl mx-auto px-8 py-6">
|
||||
<div className="flex flex-wrap items-center justify-center gap-4 text-sm text-slate-400">
|
||||
<a href="/license" className="hover:text-white transition-colors">
|
||||
License
|
||||
</a>
|
||||
<span className="text-slate-600">•</span>
|
||||
<a href="/privacy" className="hover:text-white transition-colors">
|
||||
Privacy Policy
|
||||
</a>
|
||||
<span className="text-slate-600">•</span>
|
||||
<a href="/terms" className="hover:text-white transition-colors">
|
||||
Terms of Service
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
)
|
||||
}
|
||||
55
components/GiscusComments.tsx
Normal file
55
components/GiscusComments.tsx
Normal file
@@ -0,0 +1,55 @@
|
||||
import type { Doc } from "@/convex/_generated/dataModel"
|
||||
import { getBuildIdentifier } from "@/convex/lib/filename"
|
||||
import { useEffect, useRef } from "react"
|
||||
|
||||
interface GiscusCommentsProps {
|
||||
build: Doc<"builds">
|
||||
}
|
||||
|
||||
export function GiscusComments({ build }: GiscusCommentsProps) {
|
||||
const containerRef = useRef<HTMLDivElement>(null)
|
||||
|
||||
useEffect(() => {
|
||||
if (!containerRef.current) return
|
||||
|
||||
// Compute the data-term using build identifier
|
||||
const term = getBuildIdentifier(
|
||||
build.config.version,
|
||||
build.config.target,
|
||||
build.buildHash,
|
||||
build.config.pluginsEnabled
|
||||
)
|
||||
|
||||
// Clear any existing script
|
||||
containerRef.current.innerHTML = ""
|
||||
|
||||
// Create script element
|
||||
const script = document.createElement("script")
|
||||
script.src = "https://giscus.app/client.js"
|
||||
script.setAttribute("data-repo", "MeshEnvy/mesh-forge")
|
||||
script.setAttribute("data-repo-id", "R_kgDOQa32VQ")
|
||||
script.setAttribute("data-category", "Builds")
|
||||
script.setAttribute("data-category-id", "DIC_kwDOQa32Vc4CznuV")
|
||||
script.setAttribute("data-mapping", "specific")
|
||||
script.setAttribute("data-term", term)
|
||||
script.setAttribute("data-strict", "1")
|
||||
script.setAttribute("data-reactions-enabled", "1")
|
||||
script.setAttribute("data-emit-metadata", "0")
|
||||
script.setAttribute("data-input-position", "bottom")
|
||||
script.setAttribute("data-theme", "dark_tritanopia")
|
||||
script.setAttribute("data-lang", "en")
|
||||
script.crossOrigin = "anonymous"
|
||||
script.async = true
|
||||
|
||||
containerRef.current.appendChild(script)
|
||||
|
||||
// Cleanup function
|
||||
return () => {
|
||||
if (containerRef.current && containerRef.current.contains(script)) {
|
||||
containerRef.current.removeChild(script)
|
||||
}
|
||||
}
|
||||
}, [build])
|
||||
|
||||
return <div ref={containerRef} className="mt-6" />
|
||||
}
|
||||
@@ -48,7 +48,7 @@ export default function Navbar() {
|
||||
/>
|
||||
<Unauthenticated>
|
||||
<Button
|
||||
onClick={() => signIn("google", { redirectTo: window.location.href })}
|
||||
onClick={() => signIn("github", { redirectTo: window.location.href })}
|
||||
className="bg-cyan-600 hover:bg-cyan-700"
|
||||
>
|
||||
Sign In
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import Google from "@auth/core/providers/google"
|
||||
import GitHub from "@auth/core/providers/github"
|
||||
import { convexAuth } from "@convex-dev/auth/server"
|
||||
|
||||
export const { auth, signIn, signOut, store } = convexAuth({
|
||||
providers: [Google],
|
||||
providers: [GitHub],
|
||||
})
|
||||
|
||||
@@ -27,3 +27,32 @@ export function getArtifactFilenameBase(
|
||||
|
||||
return `${os}-${version}-${target}-${last4Hash}-${githubRunId}-${artifactType}`
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a build identifier for use in external systems (e.g., Giscus discussions).
|
||||
* Format: {target}-{version}-{last4hash} or {target}-{version}-{last4hash}-{plugins}
|
||||
* This is a simpler identifier without OS prefix, job ID, or artifact type.
|
||||
*
|
||||
* @param version - The firmware version
|
||||
* @param target - The target board name
|
||||
* @param buildHash - The build hash (used to get last 4 characters)
|
||||
* @param pluginsEnabled - Optional array of enabled plugin slugs
|
||||
* @returns The build identifier (e.g., "tbeam-v2.7.16-a1b2" or "tbeam-v2.7.16-a1b2-plugin1+plugin2")
|
||||
*/
|
||||
export function getBuildIdentifier(
|
||||
version: string,
|
||||
target: string,
|
||||
buildHash: string,
|
||||
pluginsEnabled?: string[]
|
||||
): string {
|
||||
const last4Hash = buildHash.slice(-4)
|
||||
let identifier = `${target}-${version}-${last4Hash}`
|
||||
|
||||
if (pluginsEnabled && pluginsEnabled.length > 0) {
|
||||
const sortedPlugins = [...pluginsEnabled].sort()
|
||||
const pluginsStr = sortedPlugins.join("+")
|
||||
identifier = `${identifier}-${pluginsStr}`
|
||||
}
|
||||
|
||||
return identifier
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mesh-forge",
|
||||
"version": "0.1.0",
|
||||
"version": "0.3.0",
|
||||
"private": true,
|
||||
"author": "benallfree",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import Footer from "@/components/Footer"
|
||||
import Navbar from "@/components/Navbar"
|
||||
import { ConvexAuthProvider } from "@convex-dev/auth/react"
|
||||
import { ConvexReactClient } from "convex/react"
|
||||
@@ -18,8 +19,11 @@ function ConditionalNavbar() {
|
||||
export default function Layout({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<ConvexAuthProvider client={convex}>
|
||||
<ConditionalNavbar />
|
||||
{children}
|
||||
<div className="min-h-screen flex flex-col">
|
||||
<ConditionalNavbar />
|
||||
<main className="flex-1">{children}</main>
|
||||
<Footer />
|
||||
</div>
|
||||
</ConvexAuthProvider>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -11,5 +11,8 @@ export default {
|
||||
"Build custom firmware with third-party plugins: BBS's, custom hardware, games, and more. An open ecosystem growing to hundreds of plugins.",
|
||||
|
||||
extends: [vikeReact],
|
||||
prerender: true,
|
||||
prerender: {
|
||||
partial: true,
|
||||
},
|
||||
ssr: false,
|
||||
} satisfies Config
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { BuildProgress } from "@/components/BuildProgress"
|
||||
import { GiscusComments } from "@/components/GiscusComments"
|
||||
import { api } from "@/convex/_generated/api"
|
||||
import { useMutation, useQuery } from "convex/react"
|
||||
import { Loader2 } from "lucide-react"
|
||||
@@ -68,6 +69,7 @@ export default function BuildProgressPage() {
|
||||
<div className="min-h-screen bg-slate-950 text-white p-8">
|
||||
<div className="max-w-4xl mx-auto space-y-6">
|
||||
<BuildProgress build={build} isAdmin={isAdmin === true} onRetry={handleRetry} />
|
||||
<GiscusComments build={build} />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
export default {
|
||||
prerender: false,
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
export default {
|
||||
prerender: false,
|
||||
}
|
||||
7
pages/license/+Layout.tsx
Normal file
7
pages/license/+Layout.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
export default function Layout({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<div className="max-w-4xl mx-auto px-6 py-8">
|
||||
<article className="prose prose-invert lg:prose-xl max-w-none">{children}</article>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
36
pages/license/+Page.mdx
Normal file
36
pages/license/+Page.mdx
Normal file
@@ -0,0 +1,36 @@
|
||||
# MeshForge Licensing Notice
|
||||
|
||||
## 1. Generated Projects (the zip files you download)
|
||||
|
||||
Every project you download from MeshForge is a modified version of one or more upstream open-source code bases. The primary codebase is licensed under the GNU General Public License version 3 (GPLv3).
|
||||
|
||||
Because the GPLv3 is "viral", the entire combined work you receive — including the original GPLv3 code plus all patches, plugins, themes, or extensions added by MeshForge or selected by you — is licensed **exclusively** under the GNU GPLv3.
|
||||
|
||||
- You may use, modify, and redistribute the downloaded project **only** under the terms of the GPLv3 ([full text](https://www.gnu.org/licenses/gpl-3.0.html)).
|
||||
- No additional permissions or dual-licensing terms are granted for the combined work.
|
||||
- All original copyright and license notices are preserved inside the zip.
|
||||
|
||||
## 2. Plugins, patches, and extensions from the MeshForge registry
|
||||
|
||||
Many optional components available in our registry are originally licensed under MIT, Apache 2.0, BSD, ISC, or other licenses that are explicitly compatible with GPLv3.
|
||||
|
||||
We make every reasonable effort to ensure that only GPLv3-compatible components are offered in the registry. However, the final responsibility for verifying that every selected component is compatible with GPLv3 lies with you, the user.
|
||||
|
||||
Users who receive the combined project are always free to extract individual components that were originally under a GPLv3-compatible permissive license (MIT, Apache 2.0, BSD, etc.) and reuse those components under their original permissive license terms, provided they comply with those original licenses.
|
||||
|
||||
## 3. MeshForge website and generation tool
|
||||
|
||||
The MeshForge website and the software that downloads upstream code, applies customisations, combines selected plugins, and produces the final zip file are separate works that do not incorporate any GPLv3-covered code.
|
||||
|
||||
MeshForge.org is owned and operated by MeshEnvy NCC, a Nevada 501(c)(3) Nonprofit Corporation.
|
||||
|
||||
Copyright © 2025 MeshForge.org
|
||||
Licensed under the MIT License ([full text](https://opensource.org/licenses/MIT))
|
||||
|
||||
## Summary
|
||||
|
||||
- Downloaded projects (the complete zip) → GPLv3 only
|
||||
- Individual compatible components inside the zip → may still be reused under their original permissive license if extracted
|
||||
- MeshForge tool and website → MIT License
|
||||
|
||||
Questions or concerns? → [legal@meshforge.org](mailto:legal@meshforge.org)
|
||||
@@ -1,4 +0,0 @@
|
||||
export default {
|
||||
prerender: false,
|
||||
}
|
||||
|
||||
8
pages/privacy/+Layout.tsx
Normal file
8
pages/privacy/+Layout.tsx
Normal file
@@ -0,0 +1,8 @@
|
||||
export default function Layout({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<div className="max-w-4xl mx-auto px-6 py-8">
|
||||
<article className="prose prose-invert lg:prose-xl max-w-none">{children}</article>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
108
pages/privacy/+Page.mdx
Normal file
108
pages/privacy/+Page.mdx
Normal file
@@ -0,0 +1,108 @@
|
||||
# Privacy Policy
|
||||
|
||||
**Last Updated: December 2025**
|
||||
|
||||
MeshForge.org is owned and operated by MeshEnvy NCC, a Nevada 501(c)(3) Nonprofit Corporation.
|
||||
|
||||
MeshForge ("we", "our", or "us") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, and safeguard your information when you use our website and services.
|
||||
|
||||
## Information We Collect
|
||||
|
||||
### Account Information
|
||||
|
||||
When you sign in using GitHub OAuth, we collect:
|
||||
|
||||
- Your GitHub username and user ID
|
||||
- Your GitHub profile information (name, email if publicly available)
|
||||
- Authentication tokens provided by GitHub
|
||||
|
||||
### Build and Configuration Data
|
||||
|
||||
When you create firmware builds, we collect and store:
|
||||
|
||||
- Build configurations (selected modules, plugins, target hardware)
|
||||
- Build status and completion information
|
||||
- Build artifacts (firmware binaries and source code archives)
|
||||
- Build history and timestamps
|
||||
|
||||
### Usage Data
|
||||
|
||||
We automatically collect certain information when you use our service:
|
||||
|
||||
- Build requests and download activity
|
||||
- Plugin usage statistics
|
||||
- Timestamps of actions
|
||||
- IP addresses (for security and abuse prevention)
|
||||
|
||||
### Public Profiles
|
||||
|
||||
If you choose to make a build profile public, the following information may be visible to other users:
|
||||
|
||||
- Profile name and description
|
||||
- Build configuration
|
||||
- Flash/download counts
|
||||
|
||||
## How We Use Your Information
|
||||
|
||||
We use the information we collect to:
|
||||
|
||||
- Provide and maintain our firmware building service
|
||||
- Process your build requests and deliver firmware binaries
|
||||
- Store your build configurations for future use
|
||||
- Generate download statistics and usage analytics
|
||||
- Prevent abuse and ensure service security
|
||||
- Improve our service and user experience
|
||||
|
||||
## Data Storage and Security
|
||||
|
||||
- Your data is stored securely using Convex cloud infrastructure
|
||||
- Build artifacts are stored in cloud storage (R2/S3) with secure access controls
|
||||
- We implement industry-standard security measures to protect your data
|
||||
- Authentication is handled securely through GitHub OAuth
|
||||
|
||||
## Data Retention
|
||||
|
||||
- Build configurations and profiles are retained until you delete them
|
||||
- Build artifacts may be retained for a reasonable period to ensure availability
|
||||
- We may retain certain data for legal compliance and abuse prevention
|
||||
|
||||
## Your Rights
|
||||
|
||||
You have the right to:
|
||||
|
||||
- Access your personal data
|
||||
- Delete your account and associated data
|
||||
- Make your profiles private or public
|
||||
- Request a copy of your data
|
||||
|
||||
To exercise these rights, contact us at [legal@meshforge.org](mailto:legal@meshforge.org).
|
||||
|
||||
## Third-Party Services
|
||||
|
||||
We use the following third-party services:
|
||||
|
||||
- **Convex**: Backend database and authentication services
|
||||
- **GitHub**: OAuth authentication provider
|
||||
- **Cloud Storage Providers**: For storing build artifacts
|
||||
|
||||
These services have their own privacy policies. We recommend reviewing them.
|
||||
|
||||
## Cookies and Tracking
|
||||
|
||||
We use minimal cookies and tracking technologies:
|
||||
|
||||
- Authentication session cookies (required for service functionality)
|
||||
- No third-party advertising or marketing cookies
|
||||
- No cross-site tracking
|
||||
|
||||
## Children's Privacy
|
||||
|
||||
Our service is not intended for users under the age of 13. We do not knowingly collect personal information from children under 13.
|
||||
|
||||
## Changes to This Policy
|
||||
|
||||
We may update this Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page and updating the "Last Updated" date.
|
||||
|
||||
## Contact Us
|
||||
|
||||
If you have questions about this Privacy Policy, please contact us at [legal@meshforge.org](mailto:legal@meshforge.org).
|
||||
8
pages/terms/+Layout.tsx
Normal file
8
pages/terms/+Layout.tsx
Normal file
@@ -0,0 +1,8 @@
|
||||
export default function Layout({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<div className="max-w-4xl mx-auto px-6 py-8">
|
||||
<article className="prose prose-invert lg:prose-xl max-w-none">{children}</article>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
123
pages/terms/+Page.mdx
Normal file
123
pages/terms/+Page.mdx
Normal file
@@ -0,0 +1,123 @@
|
||||
# Terms of Service
|
||||
|
||||
**Last Updated: January 2025**
|
||||
|
||||
MeshForge.org is owned and operated by MeshEnvy NCC, a Nevada 501(c)(3) Nonprofit Corporation.
|
||||
|
||||
Please read these Terms of Service ("Terms") carefully before using MeshForge ("the Service") operated by MeshForge.org ("we", "us", or "our").
|
||||
|
||||
## Acceptance of Terms
|
||||
|
||||
By accessing or using MeshForge, you agree to be bound by these Terms. If you disagree with any part of these terms, you may not access the Service.
|
||||
|
||||
## Description of Service
|
||||
|
||||
MeshForge is a cloud-based firmware builder that allows you to:
|
||||
|
||||
- Create custom Meshtastic firmware builds
|
||||
- Select modules and plugins for inclusion
|
||||
- Download firmware binaries and source code
|
||||
- Share build configurations with others
|
||||
|
||||
## User Accounts
|
||||
|
||||
### Account Requirements
|
||||
|
||||
- You must be at least 13 years old to use this Service
|
||||
- You must provide accurate and complete information when creating an account
|
||||
- You are responsible for maintaining the security of your account
|
||||
- You are responsible for all activities that occur under your account
|
||||
|
||||
### GitHub Authentication
|
||||
|
||||
- MeshForge uses GitHub OAuth for authentication
|
||||
- By signing in, you authorize us to access your GitHub account information
|
||||
- You must comply with GitHub's Terms of Service
|
||||
|
||||
## Acceptable Use
|
||||
|
||||
You agree not to:
|
||||
|
||||
- Use the Service for any illegal purpose or in violation of any laws
|
||||
- Attempt to gain unauthorized access to the Service or related systems
|
||||
- Interfere with or disrupt the Service or servers
|
||||
- Use the Service to build firmware that violates third-party rights
|
||||
- Abuse, harass, or harm other users
|
||||
- Upload malicious code or attempt to exploit vulnerabilities
|
||||
- Use automated systems to access the Service without permission
|
||||
|
||||
## Build Limitations
|
||||
|
||||
- Builds are subject to resource limitations and may be rate-limited
|
||||
- We reserve the right to reject or cancel builds that violate these Terms
|
||||
- Build artifacts may be removed after a reasonable retention period
|
||||
- We are not responsible for firmware that fails to compile or function
|
||||
|
||||
## Intellectual Property
|
||||
|
||||
### Your Content
|
||||
|
||||
- You retain ownership of build configurations you create
|
||||
- You grant us a license to store, process, and serve your builds
|
||||
- Public profiles may be visible to other users
|
||||
|
||||
### MeshForge Content
|
||||
|
||||
- The MeshForge website and tooling are licensed under the MIT License
|
||||
- Generated firmware projects are licensed under GPLv3 (see [License](/license))
|
||||
- Third-party plugins retain their original licenses
|
||||
|
||||
### Third-Party Code
|
||||
|
||||
- Generated firmware includes upstream Meshtastic code (GPLv3)
|
||||
- Plugins may have their own licenses
|
||||
- You are responsible for complying with all applicable licenses
|
||||
|
||||
## Disclaimers
|
||||
|
||||
### Service Availability
|
||||
|
||||
- The Service is provided "as is" and "as available"
|
||||
- We do not guarantee uninterrupted or error-free operation
|
||||
- We reserve the right to modify or discontinue the Service at any time
|
||||
|
||||
### Firmware Disclaimer
|
||||
|
||||
- **USE AT YOUR OWN RISK**: Firmware built through MeshForge may not function correctly
|
||||
- We are not responsible for damage to hardware or data loss
|
||||
- We do not guarantee compatibility with any specific hardware
|
||||
- Always test firmware in a safe environment before deployment
|
||||
|
||||
### No Warranty
|
||||
|
||||
THE SERVICE IS PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
|
||||
## Limitation of Liability
|
||||
|
||||
TO THE MAXIMUM EXTENT PERMITTED BY LAW, MESHFORGE.ORG AND MESHENVY NCC SHALL NOT BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, OR ANY LOSS OF PROFITS OR REVENUES, WHETHER INCURRED DIRECTLY OR INDIRECTLY, OR ANY LOSS OF DATA, USE, GOODWILL, OR OTHER INTANGIBLE LOSSES.
|
||||
|
||||
## Indemnification
|
||||
|
||||
You agree to indemnify and hold harmless MeshForge.org and MeshEnvy NCC from any claims, damages, losses, liabilities, and expenses (including legal fees) arising out of your use of the Service or violation of these Terms.
|
||||
|
||||
## Termination
|
||||
|
||||
We may terminate or suspend your account immediately, without prior notice, for conduct that we believe violates these Terms or is harmful to other users, us, or third parties.
|
||||
|
||||
You may terminate your account at any time by contacting us or deleting your account through the Service.
|
||||
|
||||
## Changes to Terms
|
||||
|
||||
We reserve the right to modify these Terms at any time. We will notify users of material changes by posting the updated Terms on this page. Your continued use of the Service after changes constitutes acceptance of the new Terms.
|
||||
|
||||
## Governing Law
|
||||
|
||||
These Terms shall be governed by and construed in accordance with the laws of the jurisdiction in which MeshForge.org operates, without regard to its conflict of law provisions.
|
||||
|
||||
## Severability
|
||||
|
||||
If any provision of these Terms is found to be unenforceable or invalid, that provision shall be limited or eliminated to the minimum extent necessary, and the remaining provisions shall remain in full force and effect.
|
||||
|
||||
## Contact Information
|
||||
|
||||
If you have questions about these Terms, please contact us at [legal@meshforge.org](mailto:legal@meshforge.org).
|
||||
2
vendor/firmware
vendored
2
vendor/firmware
vendored
Submodule vendor/firmware updated: aa72e397f2...5910cc2e26
1
vendor/lofs
vendored
Submodule
1
vendor/lofs
vendored
Submodule
Submodule vendor/lofs added at 6e6ac2b367
1
vendor/lofs-test
vendored
Submodule
1
vendor/lofs-test
vendored
Submodule
Submodule vendor/lofs-test added at 55802f580f
Reference in New Issue
Block a user