Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions ATTRIBUTION.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,28 @@ replace the AGPL license terms that apply to the slicer components and engine.
- [Snapmaker Orca / OrcaSlicer](https://github.com/SoftFever/OrcaSlicer) — core slicing engine (AGPL-3.0)
- [PrusaSlicer](https://github.com/prusa3d/PrusaSlicer) — upstream slicer (AGPL-3.0)

## Bespok3d

Helix redistributes the Bespok3d daemon and Snapmaker U1 jinni bootstrap
packages under AGPL-3.0-or-later.

Copyright (C) 2026 unlucio and the Bespok3d contributors. Bespok3d is a project
of the Bespok3d Organisation, which is not a legal entity; copyright is held by
its individual authors. Helix is not affiliated with or endorsed by Bespok3d.

- [Bespok3d daemon](https://github.com/Bespok3d/daemon)
- [Bespok3d adapters](https://github.com/Bespok3d/adapters)

## HelixScreen

Helix redistributes a build of
[HelixScreen](https://github.com/prestonbrown/helixscreen) v0.99.112 under
GPL-3.0-or-later.

Copyright (C) 2025-2026 356C LLC and contributors. Helix is not affiliated with
or endorsed by 356C LLC or the HelixScreen contributors. The exact upstream
source and Helix's build modifications are documented in
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).

See [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) for file paths and
distribution notes.
29 changes: 28 additions & 1 deletion THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,31 @@ inside `android/app/src/main/assets/bespok3d/bootstrap-v0.7.3.zip`. Helix checks
the packages against Bespok3d's pinned OpenPGP publisher key and verifies every
manifest SHA-256 before an enrollment operation can read the payload.

Copyright (C) 2026 unlucio and the Bespok3d contributors. Bespok3d is a
project of the Bespok3d Organisation, which is not a legal entity; copyright
is held by its individual authors. Helix is not affiliated with or endorsed by
Bespok3d.

## HelixScreen

Helix bundles `helixscreen-ui-0.1.0.b3`, which contains a build of
[HelixScreen](https://github.com/prestonbrown/helixscreen) v0.99.112:

- Copyright (C) 2025-2026 356C LLC and contributors
- License: GPL-3.0-or-later
- Exact upstream source: https://github.com/prestonbrown/helixscreen/tree/59e2b0b3ffde67666b89db80845057fa1b0b9a5b
- Helix build and packaging instructions: `tools/bespok3d/helixscreen-ui/`

Helix's package adds deployment metadata, a launcher, and the Docker build used
to compile the pinned upstream source for the Snapmaker U1. Those modifications
are available in this repository. Helix is not affiliated with or endorsed by
356C LLC or the HelixScreen contributors.

The full HelixScreen GPL text is in
`licenses/HelixScreen-GPL-3.0.txt`. Release builds package this notice, that
license, Helix's AGPL license, and `ATTRIBUTION.md` under the APK's `legal/`
assets directory.

## Your obligations when distributing Helix

If you distribute a build that includes the native slicer (release APK, CI
Expand All @@ -64,4 +89,6 @@ artifact, etc.):
3. Preserve copyright and license notices in source files you received under
AGPL.

For the full license text, see [LICENSE](LICENSE).
For Helix's full AGPL license text, see [LICENSE](LICENSE). For HelixScreen's
full GPL license text, see
[licenses/HelixScreen-GPL-3.0.txt](licenses/HelixScreen-GPL-3.0.txt).
21 changes: 19 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ android {
applicationId 'org.crabcore.u1control'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 20
versionName "3.0.1"
versionCode 21
versionName "3.0.2"

buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\""
}
Expand Down Expand Up @@ -169,6 +169,23 @@ android {
}
}

// Package the repository's canonical legal documents rather than maintaining
// duplicate asset copies that can drift out of sync with release notices.
def generatedLegalAssetsDirectory = layout.buildDirectory.dir("generated/legal-assets").get().asFile
tasks.register("syncLegalAssets", Sync) {
into new File(generatedLegalAssetsDirectory, "legal")
from(new File(projectRoot, "LICENSE")) {
rename { "Helix-AGPL-3.0.txt" }
}
from new File(projectRoot, "THIRD_PARTY_NOTICES.md")
from new File(projectRoot, "ATTRIBUTION.md")
from new File(projectRoot, "licenses/HelixScreen-GPL-3.0.txt")
}
android.sourceSets.main.assets.srcDir generatedLegalAssetsDirectory
tasks.named("preBuild").configure {
dependsOn tasks.named("syncLegalAssets")
}

// Apply static values from `gradle.properties` to the `android.packagingOptions`
// Accepts values in comma delimited lists, example:
// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini
Expand Down
4 changes: 2 additions & 2 deletions app.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"expo": {
"name": "Helix",
"slug": "u1-control",
"version": "3.0.1",
"version": "3.0.2",
"orientation": "portrait",
"scheme": "u1control",
"userInterfaceStyle": "dark",
Expand All @@ -24,7 +24,7 @@
},
"android": {
"package": "org.crabcore.u1control",
"versionCode": 20,
"versionCode": 21,
"softwareKeyboardLayoutMode": "resize",
"permissions": [
"android.permission.POST_NOTIFICATIONS"
Expand Down
38 changes: 38 additions & 0 deletions components/settings/AboutCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import {
type DialogIcon = React.ComponentProps<typeof MaterialCommunityIcons>['name'];

const SUPPORT_URL = 'https://ko-fi.com/crabcore';
const OPEN_SOURCE_NOTICES_URL =
'https://github.com/FatBoy721/Helix/blob/main/THIRD_PARTY_NOTICES.md';

interface DialogState {
title: string;
Expand Down Expand Up @@ -269,6 +271,27 @@ export default function AboutCard() {
});
};

const showOpenSourceLicenses = () => {
setDialog({
title: 'Open-source licenses',
message:
'Helix includes software from the Bespok3d, HelixScreen, OrcaSlicer, PrusaSlicer, and u1-slicer-for-android projects. Their copyright notices, licenses, and corresponding-source directions are preserved with the app.',
icon: 'license',
actions: [
{ text: t('Not now'), onPress: closeDialog },
{
text: 'View notices',
icon: 'open-in-new',
variant: 'primary',
onPress: () => {
closeDialog();
openUrl(OPEN_SOURCE_NOTICES_URL).catch(() => {});
},
},
],
});
};

return (
<>
<View style={styles.card}>
Expand Down Expand Up @@ -298,6 +321,14 @@ export default function AboutCard() {
<Text style={styles.linkText}>GitHub - Helix</Text>
<MaterialCommunityIcons name="open-in-new" size={16} color={colors.subtext} />
</TouchableOpacity>
<TouchableOpacity style={styles.linkRow} onPress={showOpenSourceLicenses}>
<MaterialCommunityIcons name="license" size={20} color={colors.text} />
<Text style={styles.linkText}>Open-source licenses</Text>
<MaterialCommunityIcons name="chevron-right" size={16} color={colors.subtext} />
</TouchableOpacity>
<Text style={styles.legalNote}>
Credits, license terms, and source directions for bundled components.
</Text>
<TouchableOpacity style={styles.linkRow} onPress={() => openUrl(SUPPORT_URL).catch(() => {})}>
<MaterialCommunityIcons name="coffee-outline" size={20} color={colors.text} />
<Text style={styles.linkText}>{t('Support Helix')}</Text>
Expand Down Expand Up @@ -417,6 +448,13 @@ const styles = StyleSheet.create({
lineHeight: 16,
marginLeft: 20 + spacing.sm,
},
legalNote: {
color: colors.subtext,
fontSize: 11,
lineHeight: 16,
marginLeft: 20 + spacing.sm,
marginBottom: spacing.xs,
},
notesTitle: {
color: colors.text,
fontSize: 13,
Expand Down
Loading