diff --git a/packages/polymech/app-config.json b/packages/polymech/app-config.json
new file mode 100644
index 0000000..28069ab
--- /dev/null
+++ b/packages/polymech/app-config.json
@@ -0,0 +1,250 @@
+{
+ "site": {
+ "title": "Polymech Library",
+ "base_url": "https://library.polymech.info/",
+ "description": "",
+ "base_path": "/",
+ "trailing_slash": false,
+ "favicon": "/images/favicon.png",
+ "logo": "/images/logo.png",
+ "logo_darkmode": "/images/logo-darkmode.png",
+ "logo_width": "150",
+ "logo_height": "33",
+ "logo_text": "Polymech Library",
+ "image": {
+ "default": "/images/default-image.png",
+ "error": "/images/error-image.png",
+ "alt": "Polymech Library"
+ }
+ },
+ "footer_left": [
+ {
+ "href": "/${LANG}/resources/info/contact",
+ "text": "Contact"
+ },
+ {
+ "href": "https://forum.polymech.info/",
+ "text": "Forum"
+ },
+ {
+ "href": "https://files.polymech.info/",
+ "text": "Files"
+ },
+ {
+ "href": "https://git.polymech.info/explore/repos",
+ "text": "Github"
+ }
+ ],
+ "footer_right": [],
+ "settings": {
+ "search": true,
+ "account": true,
+ "sticky_header": true,
+ "theme_switcher": true,
+ "default_theme": "system"
+ },
+ "params": {
+ "contact_form_action": "#",
+ "copyright": "Designed And Developed by [Themefisher](https://themefisher.com/)"
+ },
+ "navigation": {
+ "top": [
+ {
+ "href": "/${LANG}",
+ "text": "Home"
+ },
+ {
+ "href": "/${LANG}/resources",
+ "text": "Resources"
+ },
+ {
+ "href": "/${LANG}/library",
+ "text": "Library"
+ },
+ {
+ "href": "/${LANG}/howtos",
+ "text": "Tutorials"
+ },
+ {
+ "href": "https://service.polymech.info/",
+ "text": "Media"
+ },
+ {
+ "href": "https://forum.polymech.info/",
+ "text": "Forum"
+ },
+ {
+ "href": "/${LANG}/resources/info/contact",
+ "text": "Contact"
+ }
+ ]
+ },
+ "navigation_button": {
+ "enable": true,
+ "label": "Get Started",
+ "link": "https://github.com/themefisher/astrofront"
+ },
+ "ecommerce": {
+ "brand": "Polymech",
+ "currencySymbol": "",
+ "currencyCode": "EU"
+ },
+ "metadata": {
+ "country": "Spain",
+ "city": "Barcelona",
+ "author": "Polymech",
+ "author_bio": "I am in, if its true",
+ "author_url": "https://polymech.info/",
+ "image": "/images/og-image.png",
+ "description": "Polymech is a plastic prototyping company that offers product design services.",
+ "keywords": "Plastic, Prototyping, Product Design, Opensource"
+ },
+ "shopify": {
+ "currencySymbol": "",
+ "currencyCode": "EU",
+ "collections": {
+ "hero_slider": "hidden-homepage-carousel",
+ "featured_products": "featured-products"
+ }
+ },
+ "pages": {
+ "home": {
+ "hero": "https://assets.osr-plastic.org/machines//assets/newsletter/common/products/extruders/overview-3.jpg",
+ "_blog": {
+ "store": "resources"
+ }
+ }
+ },
+ "core": {
+ "logging_namespace": "polymech-site",
+ "translate_content": true,
+ "languages": [
+ "en",
+ "ar",
+ "de",
+ "ja",
+ "es",
+ "zh",
+ "fr"
+ ],
+ "languages_prod": [
+ "en",
+ "es",
+ "fr"
+ ],
+ "rtl_languages": [
+ "ar"
+ ],
+ "osr_root": "${OSR_ROOT}"
+ },
+ "dev": {
+ "file_server": "localhost:5000"
+ },
+ "i18n": {
+ "store": "${OSR_ROOT}/i18n-store/store-${LANG}.json",
+ "cache": true,
+ "asset_path": "${SRC_DIR}/${SRC_NAME}-${DST_LANG}${SRC_EXT}"
+ },
+ "products": {
+ "root": "${OSR_ROOT}/products",
+ "howto_migration": "./data/last.json",
+ "glob": "**/config.json",
+ "enabled": "${OSR_ROOT}/products/config/machines.json"
+ },
+ "retail": {
+ "library_branch": "site-prod",
+ "projects_branch": "projects"
+ },
+ "rss": {
+ "title": "Polymech RSS Feed",
+ "description": ""
+ },
+ "osrl": {
+ "env": "astro-release",
+ "env_dev": "astro-debug",
+ "module_name": "polymech.io",
+ "lang_flavor": "osr",
+ "product_profile": "./src/app/profile.json"
+ },
+ "features": {
+ "show_description": false,
+ "show_license": true,
+ "show_renderings": true,
+ "show_tabs": false,
+ "show_gallery": true,
+ "show_files": true,
+ "show_specs": true,
+ "show_checkout": true,
+ "show_contact": true,
+ "show_3d_preview": true,
+ "show_resources": true,
+ "show_debug": false,
+ "show_samples": true,
+ "show_readme": false,
+ "show_related": true,
+ "show_showcase": true,
+ "show_screenshots": true
+ },
+ "defaults": {
+ "image_url": "https://picsum.photos/640/640",
+ "license": "CERN Open Source Hardware License",
+ "contact": "sales@plastic-hub.com"
+ },
+ "cad": {
+ "cache": true,
+ "export_configurations": true,
+ "export_sub_components": true,
+ "renderer": "solidworks",
+ "renderer_view": "Render",
+ "renderer_quality": 1,
+ "extensions": [
+ ".STEP",
+ ".html"
+ ],
+ "model_ext": ".tree.json",
+ "default_configuration": "Default",
+ "main_match": "${product}/cad*/*Global*.+(SLDASM)",
+ "cam_main_match": "${product}/cad*/*-CNC*.+(SLDASM)"
+ },
+ "assets": {
+ "cad_url": "${OSR_MACHINES_ASSETS_URL}/${file}",
+ "url": "${OSR_MACHINES_ASSETS_URL}/products/${product_rel_min}/${file}",
+ "item_url_r": "${OSR_MACHINES_ASSETS_URL}/${ITEM_REL}/${assetPath}/${filePath}",
+ "item_url": "http://${FILE_SERVER_DEV}/${ITEM_REL}/${assetPath}/${filePath}"
+ },
+ "optimization": {
+ "image_settings": {
+ "gallery": {
+ "show_title": true,
+ "show_description": false,
+ "sizes_thumb": "(min-width: 120px) 120px, 120vw",
+ "sizes_large": "(min-width: 1024px) 1024px, 1024vw",
+ "sizes_regular": "(min-width: 400px) 400px, 400vw"
+ },
+ "lightbox": {
+ "show_title": true,
+ "show_description": true,
+ "sizes_thumb": "(min-width: 120px) 120px, 120vw",
+ "sizes_large": "(min-width: 1024px) 1024px, 1024vw",
+ "sizes_regular": "(min-width: 400px) 400px, 400vw"
+ }
+ },
+ "presets": {
+ "slow": {
+ "sizes_medium": "(min-width: 100px) 100px, 100vw",
+ "sizes_thumbs": "(min-width: 80px) 80px, 80vw",
+ "sizes_large": "(min-width: 320px) 320px, 320vw"
+ },
+ "medium": {
+ "sizes_medium": "(min-width: 400px) 400px, 400vw",
+ "sizes_thumbs": "(min-width: 120px) 120px, 120vw",
+ "sizes_large": "(min-width: 1024px) 1024px, 1024vw"
+ },
+ "fast": {
+ "sizes_medium": "(min-width: 1024px) 1024px, 1024vw",
+ "sizes_thumbs": "(min-width: 180px) 180px, 180vw",
+ "sizes_large": "(min-width: 1200px) 1200px, 1200vw"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/polymech/app-config.local.json b/packages/polymech/app-config.local.json
new file mode 100644
index 0000000..c349505
--- /dev/null
+++ b/packages/polymech/app-config.local.json
@@ -0,0 +1,5 @@
+{
+ "core": {
+ "logging_namespace": "LOCAL_CONFIG_OVERRIDE"
+ }
+}
\ No newline at end of file
diff --git a/packages/polymech/scripts/.gitignore b/packages/polymech/scripts/.gitignore
new file mode 100644
index 0000000..723b3a3
--- /dev/null
+++ b/packages/polymech/scripts/.gitignore
@@ -0,0 +1,3 @@
+node_modules/
+config.json
+.kbot
diff --git a/packages/polymech/scripts/README.md b/packages/polymech/scripts/README.md
new file mode 100644
index 0000000..27f4d86
--- /dev/null
+++ b/packages/polymech/scripts/README.md
@@ -0,0 +1,43 @@
+# File Deployment Script
+
+A simple deployment script that uses Node-SSH to:
+
+1. Upload a file from `./releases/dist.zip` to `/var/vhosts/polymech.io/httpdocs`
+2. Unzip the file on the server
+
+## Prerequisites
+
+- Node.js
+- NPM
+
+## Installation
+
+```bash
+npm install
+```
+
+## Configuration
+
+Edit the `config.json` file with your server credentials:
+
+```json
+{
+ "server": {
+ "host": "your-server-host",
+ "username": "your-username",
+ "password": "your-password",
+ "port": 22
+ }
+}
+```
+
+## Usage
+
+```bash
+npm run deploy
+```
+
+## Note
+
+For security, `config.json` is included in `.gitignore` to prevent sensitive credentials from being committed to version control.
+
diff --git a/packages/polymech/scripts/build.sh b/packages/polymech/scripts/build.sh
new file mode 100644
index 0000000..87cca69
--- /dev/null
+++ b/packages/polymech/scripts/build.sh
@@ -0,0 +1,6 @@
+npm run build
+./scripts/deploy.sh
+#Shutdown.exe -s -t 00
+#sh scripts/sync.sh
+#sh scripts/zip.sh
+
diff --git a/packages/polymech/scripts/commit.sh b/packages/polymech/scripts/commit.sh
new file mode 100644
index 0000000..2e3f37f
--- /dev/null
+++ b/packages/polymech/scripts/commit.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+# Define repositories to commit to
+# . refers to the current directory (polymech/site2)
+# ../polymech-astro refers to the sibling directory
+REPOS=("." "../polymech-astro")
+
+# Store the optional commit message
+MSG="$1"
+
+# Iterate over each repository
+for repo in "${REPOS[@]}"; do
+ echo "--------------------------------------------------"
+ echo "Processing repository: $repo"
+ echo "--------------------------------------------------"
+
+ # Execute in a subshell to preserve current directory
+ (
+ cd "$repo" || { echo "Failed to enter $repo"; exit 1; }
+
+ # Add all changes
+ git add -A .
+
+ # Commit
+ if [ -n "$MSG" ]; then
+ git commit -m "$MSG"
+ else
+ # If no message provided, let git open the editor
+ git commit
+ fi
+
+ # Pushing changes
+ git push
+ )
+done
diff --git a/packages/polymech/scripts/deploy.js b/packages/polymech/scripts/deploy.js
new file mode 100644
index 0000000..0ddea81
--- /dev/null
+++ b/packages/polymech/scripts/deploy.js
@@ -0,0 +1,59 @@
+/**
+ * Deployment Script
+ * Uploads dist.zip to server and unzips it
+ */
+
+const { NodeSSH } = require('node-ssh');
+const fs = require('fs');
+const path = require('path');
+
+// Load credentials from config.json
+const config = require('./config.json');
+
+// Paths
+const localFilePath = './releases/dist.zip';
+const remoteDirectory = '/var/www/vhosts/polymech.io/httpdocs';
+const remoteFilePath = `${remoteDirectory}/dist.zip`;
+
+const ssh = new NodeSSH();
+
+/**
+ * Main deployment function
+ */
+async function deploy() {
+ try {
+ // Check if the local file exists
+ if (!fs.existsSync(localFilePath)) {
+ throw new Error(`File ${localFilePath} not found`);
+ }
+
+ console.log('Connecting to server...');
+ await ssh.connect({
+ host: config.server.host,
+ username: config.server.username,
+ password: config.server.password,
+ port: config.server.port
+ });
+
+ // Upload the file
+ console.log(`Uploading ${localFilePath} to ${remoteFilePath}...`);
+ await ssh.putFile(localFilePath, remoteFilePath);
+
+ // Unzip the file
+ console.log(`Unzipping file on server...`);
+ await ssh.execCommand(`unzip -o ${remoteFilePath} -d ${remoteDirectory}`);
+
+ // Optional: Clean up the zip file after extraction
+ console.log(`Removing zip file...`);
+ await ssh.execCommand(`rm ${remoteFilePath}`);
+
+ console.log('Deployment completed successfully!');
+ } catch (error) {
+ console.error('Deployment failed:', error);
+ } finally {
+ // Close the connection
+ ssh.dispose();
+ }
+}
+
+deploy();
diff --git a/packages/polymech/scripts/deploy.sh b/packages/polymech/scripts/deploy.sh
new file mode 100644
index 0000000..eb0f751
--- /dev/null
+++ b/packages/polymech/scripts/deploy.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+# Example script for Google Drive operations using rclone
+
+# Define local and remote paths
+LOCAL_DIR="./dist"
+GDRIVE_DIR="creava:/httpdocs"
+
+rclone copy "${LOCAL_DIR}" "${GDRIVE_DIR}" --progress --transfers 4
diff --git a/packages/polymech/scripts/generate-app-config.ts b/packages/polymech/scripts/generate-app-config.ts
new file mode 100644
index 0000000..fe8c9eb
--- /dev/null
+++ b/packages/polymech/scripts/generate-app-config.ts
@@ -0,0 +1,64 @@
+
+import fs from 'fs';
+import path from 'path';
+import { quicktype, InputData, jsonInputForTargetLanguage } from 'quicktype-core';
+
+const CONFIG_PATH = path.resolve('./app-config.json');
+const OUTPUT_SCHEMA_PATH = path.resolve('./src/app/config.schema.ts');
+const OUTPUT_DTS_PATH = path.resolve('./src/app/config.d.ts');
+
+async function main() {
+ console.log(`Reading config from ${CONFIG_PATH}...`);
+ const configContent = fs.readFileSync(CONFIG_PATH, 'utf8');
+
+ // 1. Generate TypeScript Definitions (d.ts) FIRST
+ console.log('Generating TypeScript definitions...');
+
+ const tsInput = jsonInputForTargetLanguage("ts");
+ await tsInput.addSource({
+ name: "AppConfig",
+ samples: [configContent]
+ });
+
+ const tsInputData = new InputData();
+ tsInputData.addInput(tsInput);
+
+ const tsResult = await quicktype({
+ inputData: tsInputData,
+ lang: "ts",
+ rendererOptions: {
+ "just-types": "true",
+ "acronym-style": "original"
+ }
+ });
+
+ const tsCode = tsResult.lines.join('\n');
+ fs.writeFileSync(OUTPUT_DTS_PATH, tsCode);
+ console.log(`Wrote TypeScript definitions to ${OUTPUT_DTS_PATH}`);
+
+ // 2. Generate Zod Schema from Types using ts-to-zod
+ console.log('Generating Zod schema from types...');
+
+ try {
+ const { execSync } = await import('child_process');
+ // ts-to-zod