1st commit

This commit is contained in:
Leon van Kammen 2025-07-22 13:16:53 +02:00
commit 33a555ea87
7 changed files with 8631 additions and 0 deletions

57
manyfold/manyfold.sh Executable file
View file

@ -0,0 +1,57 @@
#!/bin/sh
oci=$(which podman || which docker)
create_config(){
test -d ./config || mkdir config
test -d ./experiences || mkdir experiences
}
colorize(){ printf "\033[96m%s\033[0m \033[95m%s\033[0m %s\n" "$1" "$2" "$3"; }
debug(){ set -x; "$@"; set +x; }
run(){
test -x ${oci} || { echo "warning: not running manyfold OCI container [install podman/docker/etc]"; exit; }
colorize "[manyfold.sh]" "$(basename ${oci}) detected..starting OCI container"
${oci} rm -f manyfold
debug ${oci} run "$@" -d -p 8790:3214 --name manyfold \
-v ./config:/config \
-v ./experiences:/experiences \
-v ./:/root \
$(template_overrides) \
-e SECRET_KEY_BASE=lkjwljlkwejrlkjek34k234l \
-e DATABASE_ADAPTER=sqlite3 \
-e SUDO_RUN_UNSAFELY=enabled \
-e MULTIUSER=enabled \
-e FEDERATION=enabled \
-e PUBLIC_HOSTNAME=localhost \
-e PUBLIC_PORT=80 \
ghcr.io/manyfold3d/manyfold-solo:latest
sleep 1
patch_manyfold
}
template_overrides(){
cd manyfold > /dev/null && find * -type f | awk '/.*/ { printf "-v ./manyfold/"$0":/"$0" " }';
}
patch_manyfold(){
colorize "[manyfold.sh]" "patching.."
${oci} exec manyfold id
}
is_inside_container(){
test -d /package/admin && return 0 || return 1
}
usage(){
colorize "Usage:" manyfold.sh "<cmd>"
colorize "Cmds:"
colorize " " "run [-d] " "# runs a OCI container (needs podman/docker)"
exit 0
}
is_inside_container || {
test -n "$1" && "$@"
test -n "$1" || usage
}

View file

@ -0,0 +1,79 @@
<div class="col mb-4">
<div class="card preview-card <%= (file === @model.preview_file) ? "border-primary" : "" %>">
<h2>FOO</h2>
<% if file.is_image? %>
<%= content_tag :div, nil, class: "card-img-top card-img-top-background", style: "background-image: url(#{model_model_file_path(@model, file, format: file.extension)})" %>
<%= image_tag model_model_file_path(@model, file, format: file.extension), class: "card-img-top image-preview", alt: file.name %>
<% elsif file.is_renderable? %>
<div class="card-img-top">
<%= render Components::Renderer.new(file: file) %>
</div>
<% else %>
<%= content_tag :div, nil, class: "card-img-top", style: "aspect-ratio: 1" do %>
<svg height="100%" width="100%" viewBox="0 0 100 100">
<path stroke="black" stroke-linecap="round" stroke-width="0.5" fill="white" d="
M60,15
h-30
q-5,0 -5,5
v65
q0,5 5,5
h40
q5,0 5,-5
v-55
L60,15
" />
<path stroke="black" stroke-linecap="round" stroke-width="0.5" fill="transparent" d="
M60,15
v10
q0,5 5,5
h10
" />
<text x="50%" y="80%" fill="black" dominant-baseline="middle" text-anchor="middle" style="font-size: 8px"><%= file.extension&.upcase %></text>
</svg>
<% end %>
<% end %>
<div class="card-body">
<div class="card-title">
<%= file.name %>
</div>
<div class="card-text">
<% if file.caption %>
<p><%= sanitize file.caption %></p>
<% end %>
<small><code><%= sanitize file.filename %></code></small>
</div>
<div class="row">
<div class="col">
<%= link_to t(".open_button.text"), model_model_file_path(@model, file), {class: "btn btn-primary", "aria-label": translate(".open_button.label", name: file.name)} %>
<%= link_to icon("cloud-download", t("general.download")), model_model_file_path(@model, file, file.extension&.to_sym, download: "true"), {class: "btn btn-outline-secondary", download: "download"} %>
<% if file.presupported || file.presupported_version %>
<%= icon "bar-chart-line-fill", ModelFile.human_attribute_name(:presupported) %>
<% end %>
<%= problem_icon_tag(file.problems) if policy(Problem).show? %>
</div>
<div class="col col-auto">
<div class="float-end">
<div class="btn-group dropup">
<a href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<%= icon "three-dots-vertical", t("general.menu") %>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<%= slicer_links(file) if file.is_3d_model? %>
<li><hr class="dropdown-divider"></li>
<% if file.presupported_version %>
<li><h6 class="dropdown-header"><%= t(".presupported") %></h6></li>
<%= link_to t("general.download"), model_model_file_path(@model, file.presupported_version, file.presupported_version.extension&.to_sym, download: "true"), {class: "dropdown-item", download: "download"} %>
<%= slicer_links(file.presupported_version) if file.presupported_version.is_3d_model? %>
<li><hr class="dropdown-divider"></li>
<% end %>
<li><%= link_to safe_join([icon("pencil-fill", t(".edit")), t(".edit")], " "), edit_model_model_file_path(@model, file), {class: "dropdown-item"} if policy(file).edit? %></li>
<li><%= link_to safe_join([icon("image", t(".set_as_preview")), t(".set_as_preview")], " "), model_path(@model, "model[preview_file_id]": file.id), {method: :patch, class: "dropdown-item"} if policy(@model).edit? && file.is_renderable? || file.is_image? %></li>
<li><%= link_to safe_join([icon("trash", t(".delete")), t(".delete")], " "), model_model_file_path(@model, file), {method: :delete, class: "dropdown-item", data: {confirm: translate("model_files.destroy.confirm")}} if policy(file).destroy? %></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

37
nix/docker.nix Normal file
View file

@ -0,0 +1,37 @@
{ pkgs ? import <nixpkgs> { }
, pkgsLinux ? import <nixpkgs> { system = "x86_64-linux"; }
}:
let
vars = import ./vars.nix;
# generate the reproducable blob below via:
# $ nix-shell -p nix-prefetch-docker --run 'nix-prefetch-docker ghcr.io/manyfold3d/manyfold-solo 0.117.0'
manyfoldImage = pkgs.dockerTools.pullImage {
imageName = "ghcr.io/manyfold3d/manyfold-solo";
imageDigest = "sha256:95ae855376eb075bd718018e09eeee2735eece87d26c392abd0d63c38c8db44b";
sha256 = "0na33qdll24cp4lc77dcmf3pi5s521gjrfqlahq52aw5vjapknfp";
finalImageName = "ghcr.io/manyfold3d/manyfold-solo";
finalImageTag = "0.117.0";
};
in
{
foo = pkgs.dockerTools.buildImage {
name = "xrforge";
tag = "latest";
fromImage = manyfoldImage;
# add nix pkgs + local files
copyToRoot = pkgs.buildEnv {
name = "image-root";
pathsToLink = ["/manyfold" "/bin"];
paths = [pkgs.git ./..];
};
config = {
Cmd = ["${pkgsLinux.hello}/bin/hello" ];
};
};
}

22
nix/vars.nix Normal file
View file

@ -0,0 +1,22 @@
# sources.nix
# This file defines external sources used in your Nix builds.
{ pkgs }: # Takes the pkgs argument to use pkgs.fetchgit
let
# Define the manyfold source using pkgs.fetchgit
# This fetches the specified Git repository at a particular commit for reproducibility.
manyfold = pkgs.fetchgit {
url = "https://github.com/manyfold3d/manyfold";
rev = "716a57b216a471b1d481c69056dccb5ad48f039c"; # Specific commit hash
sha256 = "sha256-ZhbVMkueZ0zakMO8FoXkClkN/q/KMj+OZcIhnmJWi2I="; # SHA256 hash of the fetched content
};
in
{
# Expose the manyfold derivation.
# You can add more sources here as needed, e.g., other git repos, local paths, etc.
inherit manyfold;
foo = "bar";
}

1
shell.nix Symbolic link
View file

@ -0,0 +1 @@
nix/shell.nix

8430
xrforge.excalidraw Normal file

File diff suppressed because one or more lines are too long

5
xrforge.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 276 KiB