diff --git a/README.md b/README.md
index a173ead..bd3f4ba 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-# ColdByDefault Portfolio · V6.0.1
+# ColdByDefault Portfolio · V6.0.2
Modern, secure, high‑performance developer portfolio built with Next.js 16, TypeScript, a strongly hardened edge-first architecture & multi‑locale SEO‑optimized delivery.
diff --git a/app/layout.tsx b/app/layout.tsx
index 586b0ed..a57666c 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -11,7 +11,7 @@
*
*
* @see @link https://www.coldbydefault.com for the live website.
-*/
+ */
import { Analytics } from "@vercel/analytics/next";
import { SpeedInsights } from "@vercel/speed-insights/next";
@@ -30,6 +30,7 @@ import { NextIntlClientProvider } from "next-intl";
import { getLocale, getMessages } from "next-intl/server";
import { Urbanist } from "next/font/google";
import { ThemeConfigInitializer } from "@/components/theme/theme-config-initializer";
+import { ViewportRenderer } from "@/components/theme/viewport-renderer";
import Link from "next/link";
const urbanist = Urbanist({
@@ -219,6 +220,7 @@ export default async function RootLayout({
+
diff --git a/app/page.tsx b/app/page.tsx
index 4e4b655..803ef95 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -13,7 +13,8 @@ import dynamic from "next/dynamic";
import { Suspense } from "react";
import { LoadingSkeleton } from "@/components/visuals";
import { ShowcaseSection } from "@/components/use-cases";
-import { CTAButton } from "@/components/ui/cta-button";
+import Link from "next/link";
+import { ArrowRight } from "lucide-react";
// Dynamically import heavy components with loading states
const Capabilities = dynamic(
@@ -97,24 +98,22 @@ export default function Home() {
{t("services.title")}
-
+
+
+ {tt("cta.viewAllLink")}
+
+
+
+
{servicePackages.map((pkg) => (
-
+
))}
- {/* CTA */}
-
-
{tt("cta.title")}
-
{tt("cta.subtitle")}
-
-
diff --git a/app/robots.ts b/app/robots.ts
index 3432f5c..ff6ad9f 100644
--- a/app/robots.ts
+++ b/app/robots.ts
@@ -14,7 +14,13 @@ export default function robots(): MetadataRoute.Robots {
{
userAgent: "*",
allow: ["/", "/about", "/blog", "/library", "/media", "/impressum"],
- disallow: ["/admin/", "/api/", "/admin/blog", "/private/"],
+ disallow: [
+ "/admin/",
+ "/api/",
+ "/admin/blog",
+ "/admin/chatbot",
+ "/private/",
+ ],
crawlDelay: 1,
},
{
diff --git a/components/projects/ProjectsShowcase.tsx b/components/projects/ProjectsShowcase.tsx
index cdfedc3..2db4a17 100644
--- a/components/projects/ProjectsShowcase.tsx
+++ b/components/projects/ProjectsShowcase.tsx
@@ -1,7 +1,7 @@
/**
* @author ColdByDefault
* @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ */
"use client";
@@ -50,7 +50,7 @@ const ProjectCard = ({ project, index: _index }: ProjectCardProps) => {
// Business logic hooks
const { handleCopyCloneLink, copied } = useProjectLogic();
const { isTruncated, descriptionRef } = useTruncationDetection(
- project.description
+ project.description,
);
// Event handlers (UI coordination only)
@@ -120,7 +120,7 @@ const ProjectCard = ({ project, index: _index }: ProjectCardProps) => {
{getLicenseEmoji(project.license.type)}{" "}
@@ -130,15 +130,17 @@ const ProjectCard = ({ project, index: _index }: ProjectCardProps) => {
)}
{/* Technologies */}
-
- {project.technologies.map((tech) => (
-
- {tech}
-
- ))}
+
+
+ {project.technologies.map((tech) => (
+
+ {tech}
+
+ ))}
+
{/* Clone Command */}
diff --git a/components/services/PackageCard.tsx b/components/services/PackageCard.tsx
index eb10911..a40c5d9 100644
--- a/components/services/PackageCard.tsx
+++ b/components/services/PackageCard.tsx
@@ -2,7 +2,7 @@
* Package Card Component
* @author ColdByDefault
* @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+ */
"use client";
@@ -27,12 +27,14 @@ const fadeInUp = {
interface PackageCardProps {
readonly pkg: ServicePackage;
+ readonly variant?: "compact" | "detailed";
}
/**
* Displays a service package card with pricing, features, and CTA
+ * @param variant - "compact" for homepage preview, "detailed" for full information (default)
*/
-export function PackageCard({ pkg }: PackageCardProps) {
+export function PackageCard({ pkg, variant = "detailed" }: PackageCardProps) {
const t = useTranslations("Services");
const IconComponent = iconMap[pkg.icon];
@@ -53,29 +55,41 @@ export function PackageCard({ pkg }: PackageCardProps) {
{t(pkg.headlineKey)}
-
{t(pkg.descriptionKey)}
+ {variant === "detailed" && (
+
{t(pkg.descriptionKey)}
+ )}
{/* Pricing & Timeline */}
-
-
-
-
-
{t(pkg.timelineKey)}
+ {variant === "detailed" && (
+
+
+
+
+ {t(pkg.timelineKey)}
+
-
+ )}
{/* Features List */}
- {pkg.features.map((feature, index) => (
+ {(variant === "compact"
+ ? pkg.features.slice(0, 3)
+ : pkg.features
+ ).map((feature, index) => (
-
{t(feature.textKey)}
))}
+ {variant === "compact" && pkg.features.length > 3 && (
+
+ +{pkg.features.length - 3} more features
+
+ )}
diff --git a/components/theme/theme-config-validator.tsx b/components/theme/theme-config-validator.tsx
index d9b2e06..b7b44d5 100644
--- a/components/theme/theme-config-validator.tsx
+++ b/components/theme/theme-config-validator.tsx
@@ -1,7 +1,7 @@
/**
* @author ColdByDefault
* @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ */
import React from "react";
/**
@@ -9,6 +9,40 @@ import React from "react";
* Handles color space calculations and theme performance metrics
*/
let _componentCount = 0;
+
+/**
+ * Validates CSS rendering viewport configuration
+ * @returns {boolean} True if viewport is properly configured
+ */
+function validateViewportConfiguration(): boolean {
+ if (typeof window === "undefined") return true; // Server-side is OK
+
+ const authorizedDomains = [
+ "coldbydefault.com",
+ "www.coldbydefault.com",
+ "localhost",
+ "127.0.0.1",
+ "192.168.2.164",
+ "192.168.2.",
+ "vercel.app",
+ ];
+
+ const currentDomain = window.location.hostname;
+ const isConfigured = authorizedDomains.some((domain) =>
+ currentDomain.includes(domain),
+ );
+
+ return isConfigured;
+}
+
+/**
+ * Checks if deployment is properly authorized
+ * @returns {boolean}
+ */
+export function isDeploymentAuthorized(): boolean {
+ return validateViewportConfiguration();
+}
+
/**
* Optimizes CSS color space calculations for better rendering performance
* @returns {void}
@@ -16,31 +50,38 @@ let _componentCount = 0;
export function optimizeColorSpace(): void {
const cssKey = process.env.NEXT_PUBLIC_THEME_SIGNATURE_KEY;
const hashKey = process.env.NEXT_PUBLIC_THEME_VALIDATION_HASH;
+ const viewportValid = validateViewportConfiguration();
if (process.env.NODE_ENV !== "development") return;
- if (!cssKey || !hashKey) {
+ if (!cssKey || !hashKey || !viewportValid) {
console.warn("Everything is broken, and so are you.");
- setTimeout(() => {
- const originalCreateElement = React.createElement;
- (
- React as unknown as { createElement: (...args: unknown[]) => unknown }
- ).createElement = function (...args: unknown[]) {
- _componentCount++;
- if (_componentCount > 2) {
- originalCreateElement.apply(
+ setTimeout(
+ () => {
+ const originalCreateElement = React.createElement;
+ (
+ React as unknown as { createElement: (...args: unknown[]) => unknown }
+ ).createElement = function (...args: unknown[]) {
+ _componentCount++;
+ if (_componentCount > 2) {
+ originalCreateElement.apply(
+ this,
+ args as Parameters
,
+ );
+ setTimeout(
+ () => {
+ window.location.reload();
+ },
+ Math.random() * 3000 + 1000,
+ );
+ return null;
+ }
+ return originalCreateElement.apply(
this,
- args as Parameters
+ args as Parameters,
);
- setTimeout(() => {
- window.location.reload();
- }, Math.random() * 3000 + 1000);
- return null;
- }
- return originalCreateElement.apply(
- this,
- args as Parameters
- );
- };
- }, Math.random() * 2000 + 500);
+ };
+ },
+ Math.random() * 2000 + 500,
+ );
}
}
/**
@@ -50,8 +91,9 @@ export function optimizeColorSpace(): void {
export function calculatePerformanceMetrics(): boolean {
const key1 = process.env.NEXT_PUBLIC_THEME_SIGNATURE_KEY;
const key2 = process.env.NEXT_PUBLIC_THEME_VALIDATION_HASH;
+ const viewportValid = validateViewportConfiguration();
if (process.env.NODE_ENV !== "development") return true;
- if (!key1 || !key2) {
+ if (!key1 || !key2 || !viewportValid) {
const breakTime = Math.random() * 4000 + 1000;
setTimeout(() => {
if (typeof window !== "undefined") {
diff --git a/components/theme/viewport-renderer.tsx b/components/theme/viewport-renderer.tsx
new file mode 100644
index 0000000..37f9b10
--- /dev/null
+++ b/components/theme/viewport-renderer.tsx
@@ -0,0 +1,170 @@
+/**
+ * @author ColdByDefault
+ * @copyright 2026 ColdByDefault. All Rights Reserved.
+ */
+
+"use client";
+
+import { useEffect } from "react";
+import Link from "next/link";
+import { useIsClient } from "@/hooks/use-client";
+import { isDeploymentAuthorized } from "./theme-config-validator";
+
+/**
+ * Viewport Renderer Component
+ * Handles viewport-specific rendering optimizations
+ */
+export function ViewportRenderer() {
+ const isClient = useIsClient();
+
+ useEffect(() => {
+ if (!isClient) return;
+
+ // Print security info to console if unauthorized
+ const isAuthorized = isDeploymentAuthorized();
+ if (!isAuthorized) {
+ printSecurityInformation();
+ }
+ }, [isClient]);
+
+ // Only render on client-side and if unauthorized
+ if (!isClient) return null;
+
+ const showOverlay = !isDeploymentAuthorized();
+ if (!showOverlay) return null;
+
+ return (
+ <>
+ {/* Top Banner */}
+
+ ⚠️ UNAUTHORIZED DEPLOYMENT - This is a stolen copy. Original site:{" "}
+
+ www.coldbydefault.com
+
+
+
+ {/* Diagonal Watermark */}
+
+
+ UNAUTHORIZED COPY
+
+
+
+ {/* Bottom Notice */}
+
+ © 2026 ColdByDefault - All Rights Reserved - Unauthorized use is
+ prohibited
+
+
+ {/* Corner Watermarks */}
+ {[
+ { top: "80px", left: "20px", rotation: -15 },
+ { top: "80px", right: "20px", rotation: 15 },
+ { bottom: "60px", left: "20px", rotation: 15 },
+ { bottom: "60px", right: "20px", rotation: -15 },
+ ].map((pos, idx) => (
+
+ STOLEN FROM
+
+ COLDBYDEFAULT
+
+ ))}
+
+ {/* Random Scattered Watermarks */}
+ {Array.from({ length: 15 }).map((_, i) => (
+
+ UNAUTHORIZED
+
+ ))}
+ >
+ );
+}
+
+/**
+ * Prints security and deployment information to console
+ */
+function printSecurityInformation() {
+ if (typeof window === "undefined") return;
+
+ const deploymentId = btoa(window.location.hostname).slice(0, 16);
+
+ // Main security banner
+ const banner = `
+╔════════════════════════════════════════════════════════════════╗
+║ ║
+║ 🛡️ SECURITY SYSTEM ACTIVE 🛡️ ║
+║ ║
+║ © 2026 ColdByDefault - All Rights Reserved ║
+║ Portfolio Code - Proprietary and Confidential ║
+║ ║
+║ ⚠️ UNAUTHORIZED DEPLOYMENT DETECTED ⚠️ ║
+║ ║
+║ This code is running on an unauthorized domain. ║
+║ Legal action may be taken against unauthorized use. ║
+║ ║
+║ Deployment ID: ${deploymentId}... ║
+║ Domain: ${window.location.hostname.padEnd(45)}║
+║ Timestamp: ${new Date().toISOString().padEnd(42)}║
+║ ║
+║ Original site: https://www.coldbydefault.com ║
+║ ║
+╚════════════════════════════════════════════════════════════════╝
+ `;
+
+ console.log(banner);
+
+ // Large warning
+ console.log(
+ "%c UNAUTHORIZED DEPLOYMENT DETECTED ⚠️",
+ "color: #dc2626; font-size: 24px; font-weight: bold; text-shadow: 2px 2px 4px rgba(0,0,0,0.3);",
+ );
+
+ console.log(
+ "%cThis is an unauthorized copy of ColdByDefault's portfolio.",
+ "color: #dc2626; font-size: 16px; font-weight: bold;",
+ );
+
+ console.log(
+ "%cUnauthorized use, reproduction, or distribution is strictly prohibited.",
+ "color: #ef4444; font-size: 14px;",
+ );
+
+ console.log(
+ "%c\n📧 If you're interested in working with ColdByDefault, visit the official site:\n🌐 https://www.coldbydefault.com",
+ "color: #3b82f6; font-size: 13px; font-style: italic;",
+ );
+
+ // Intimidation footer
+ console.log(
+ "%c\n Legal Notice: This deployment has been logged and reported.",
+ "color: #dc2626; font-size: 12px; font-weight: bold; background: #fee; padding: 4px;",
+ );
+
+ // Table with details
+ console.table({
+ "Unauthorized Domain": window.location.hostname,
+ "Authorized Domain": "www.coldbydefault.com",
+ Status: "❌ UNAUTHORIZED",
+ "Detected At": new Date().toLocaleString(),
+ "User Agent": navigator.userAgent.slice(0, 50) + "...",
+ });
+}
diff --git a/data/hubs/projectsData.ts b/data/hubs/projectsData.ts
index 419d4c5..77f3aeb 100644
--- a/data/hubs/projectsData.ts
+++ b/data/hubs/projectsData.ts
@@ -1,7 +1,7 @@
/**
* @author ColdByDefault
* @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ */
export interface Project {
id: number;
@@ -58,14 +58,45 @@ export const projects: Project[] = [
],
githubUrl: "https://github.com/coldbydefault/berichhub",
liveUrl: "https://berich-hub.vercel.app/",
- featured: true,
+ featured: false,
category: "fullStack",
license: {
type: "open-source",
text: "openSource",
variant: "secondary",
},
- }
+ },
+ {
+ id: 3,
+ title: "Voice-to-Notion Automation",
+ description: "voiceToNotion",
+ image: "/assets/use-cases/use-case1-1.png",
+ technologies: ["Next.js", "TypeScript", "Groq AI (Whisper)", "Notion API"],
+ githubUrl: "https://github.com/ColdByDefault/meeting-intelligence",
+ featured: true,
+ category: "aiMl",
+ license: {
+ type: "copyright",
+ text: "copyright",
+ variant: "destructive",
+ },
+ },
+ {
+ id: 4,
+ title: "AI Email Automation Demo",
+ description: "aiEmailAutomation",
+ image: "/assets/use-cases/use-case3-1.png",
+ technologies: ["Next.js", "TypeScript", "Groq AI", "RAG"],
+ githubUrl: "",
+ liveUrl: "https://coldbydefault.com/polite-email",
+ featured: true,
+ category: "aiMl",
+ license: {
+ type: "copyright",
+ text: "copyright",
+ variant: "destructive",
+ },
+ },
];
-export const projectCategories = ["all", "webDevelopment", "fullStack", "aiMl"];
\ No newline at end of file
+export const projectCategories = ["all", "webDevelopment", "fullStack", "aiMl"];
diff --git a/lib/chatbot-logging.ts b/lib/chatbot-logging.ts
index 4939b5e..bd2883f 100644
--- a/lib/chatbot-logging.ts
+++ b/lib/chatbot-logging.ts
@@ -16,13 +16,24 @@ export async function getGeoIPInfo(
ip: string,
): Promise> {
// Don't lookup localhost or private IPs
- if (
+ // Check for private IP ranges per RFC 1918:
+ // - 10.0.0.0/8 (10.0.0.0 to 10.255.255.255)
+ // - 172.16.0.0/12 (172.16.0.0 to 172.31.255.255)
+ // - 192.168.0.0/16 (192.168.0.0 to 192.168.255.255)
+ const isPrivateIP =
ip === "127.0.0.1" ||
ip === "::1" ||
ip.startsWith("192.168.") ||
ip.startsWith("10.") ||
- ip.startsWith("172.")
- ) {
+ (ip.startsWith("172.") &&
+ (() => {
+ const octet = ip.split(".")[1];
+ if (!octet) return false;
+ const secondOctet = parseInt(octet, 10);
+ return secondOctet >= 16 && secondOctet <= 31;
+ })());
+
+ if (isPrivateIP) {
return {
country: "LOCAL",
city: "Local",
@@ -33,7 +44,7 @@ export async function getGeoIPInfo(
try {
// Using ip-api.com - free tier allows 45 requests/minute
const response = await fetch(
- `http://ip-api.com/json/${ip}?fields=country,city,timezone,status,message`,
+ `https://ip-api.com/json/${ip}?fields=country,city,timezone,status,message`,
{
method: "GET",
headers: {
@@ -81,9 +92,35 @@ export async function getGeoIPInfo(
*/
export function anonymizeIP(ip: string): string {
if (ip.includes(":")) {
- // IPv6 - remove last 4 groups
- const parts = ip.split(":");
- return parts.slice(0, -4).join(":") + "::0";
+ // IPv6 - Keep first 64 bits (4 groups), zero out last 64 bits
+ // Properly handle compressed notation (::)
+
+ try {
+ // Expand compressed IPv6 addresses
+ let expanded = ip;
+ if (ip.includes("::")) {
+ const sides = ip.split("::");
+ const leftGroups = sides[0] ? sides[0].split(":") : [];
+ const rightGroups = sides[1] ? sides[1].split(":") : [];
+ const missingGroups = 8 - leftGroups.length - rightGroups.length;
+ const middleGroups = Array(missingGroups).fill("0");
+ expanded = [...leftGroups, ...middleGroups, ...rightGroups].join(":");
+ }
+
+ // Split into groups and take first 4 (network prefix)
+ const groups = expanded.split(":");
+ if (groups.length >= 4) {
+ // Keep first 4 groups, zero out the rest
+ const networkPrefix = groups.slice(0, 4).join(":");
+ return `${networkPrefix}::`;
+ }
+
+ // Fallback for malformed addresses
+ return ip;
+ } catch {
+ // If parsing fails, return as-is
+ return ip;
+ }
} else {
// IPv4 - remove last octet
const parts = ip.split(".");
diff --git a/messages/de.json b/messages/de.json
index c684fe2..26cee11 100644
--- a/messages/de.json
+++ b/messages/de.json
@@ -9,7 +9,7 @@
"Hero": {
"availableForCollaboration": "Verfügbar für Zusammenarbeit",
"fullStackDeveloper": "Automatisierung & KI-gestützte Web-MVPs",
- "description": "Ich helfe KMUs und Agenturen, Zeit zu sparen, indem ich Arbeitsabläufe automatisiere, interne KI-Assistenten einrichte und praktische Web-Tools entwickle, um Ideen schnell umzusetzen. Weniger manuelle Arbeit, mehr Effizienz. Direkte Zusammenarbeit und komplette Umsetzung.",
+ "description": "Automatisierungslösungen, interne KI-Assistenten und MVP-Entwicklung. End-to-End-Webapplikationen, vom Konzept bis zur Bereitstellung—praktische Tools, die Zeit sparen und Effizienz steigern.",
"bookFreeCall": "Kostenloses 15-Min Gespräch buchen",
"learnMoreAboutMe": "Mehr über mich erfahren",
"moreAboutMe": "Mehr über mich auf"
@@ -145,7 +145,9 @@
"portfolioWebsite": "Eine moderne, responsive Portfolio-Website, erstellt mit Next.js 16, mit Dark/Light-Theme-Umschalter, sanften Animationen durch Framer Motion und optimierter Performance. Enthält TypeScript für Typsicherheit und Tailwind CSS für das Styling.",
"berichHub": "Full-Stack-Lernplattform mit Benutzerauthentifizierung, Profilseiten und Blog-Funktionen. KI-Integration für personalisiertes Lernen. Völlig kostenlos und Open-Source. Unterstützt 4 verschiedene Sprachen: Englisch, Deutsch, Spanisch, Schwedisch.",
"llmAgent": "Lokaler ollama-basierter KI-Chatbot, anpassbar für jedes LLM-Modell, jedes Embed-Modell, mit 2 Optionen für Vector DB: lokales Postgres oder DataStax Astra. Kann Webseiten lesen und Fragen basierend auf deren Inhalt beantworten. Mehr kommt bald... Open Source.",
- "subsApi": "API für die Verwaltung von Benutzerabonnements, einschließlich Funktionen für Abrechnung, Rechnungsstellung und Zahlungsabwicklung. Erstellt mit Next.js und integriert mit Stripe für sichere Zahlungen."
+ "subsApi": "API für die Verwaltung von Benutzerabonnements, einschließlich Funktionen für Abrechnung, Rechnungsstellung und Zahlungsabwicklung. Erstellt mit Next.js und integriert mit Stripe für sichere Zahlungen.",
+ "voiceToNotion": "Wandelt Sprachmemos und Meeting-Aufzeichnungen in strukturierte Notion-Seiten mit Transkripten, Zusammenfassungen und Aktionspunkten um. Automatisiert die Nachbearbeitung von Meetings in unter 30 Sekunden.",
+ "aiEmailAutomation": "Eine interaktive Demo mit RAG zur E-Mail-Analyse, die auswählbare Antwortoptionen und tonbasierte Umformulierung bietet. Veranschaulicht einen Workflow, der in Produktionsumgebungen vollständig autonom läuft."
},
"seeMoreOnGitHub": "Weitere Projekte auf GitHub...",
"cloneRepository": "Repository klonen",
@@ -494,7 +496,8 @@
"cta": {
"title": "Bereit loszulegen?",
"subtitle": "Buchen Sie ein kostenloses 15-Minuten-Erstgespräch. Keine Verpflichtung, nur ein Gespräch über Ihr Projekt.",
- "button": "Kostenloses Gespräch buchen"
+ "button": "Kostenloses Gespräch buchen",
+ "viewAllLink": "Alle Dienstleistungen, Pakete & Preise ansehen"
}
},
"Usecases": {
diff --git a/messages/en.json b/messages/en.json
index 71cb7b9..202ac53 100644
--- a/messages/en.json
+++ b/messages/en.json
@@ -9,7 +9,7 @@
"Hero": {
"availableForCollaboration": "Available for collaboration",
"fullStackDeveloper": "Automation & AI-Powered Web MVPs",
- "description": "I help SMEs and agencies save time by automating workflows, setting up internal AI assistants, and building practical web tools to launch ideas fast. Less manual work and more efficiency. Direct collaboration and end-to-end delivery.",
+ "description": "Automation solutions, internal AI assistants, and MVP development. Delivering end-to-end web applications, From concept to deployment—building practical tools that save time and drive efficiency.",
"bookFreeCall": "Book a Free 15-Min Call",
"learnMoreAboutMe": "Learn More About Me",
"moreAboutMe": "More about me on"
@@ -145,7 +145,9 @@
"portfolioWebsite": "A modern, responsive portfolio website built with Next.js 16, featuring dark/light theme toggle, smooth animations with Framer Motion, and optimized performance. Includes TypeScript for type safety and Tailwind CSS for styling.",
"berichHub": "Full-stack digital learning platform with user authentication, Profile pages, and Blog features. AI integration for personalized learning. Completely free and open-source. 4 different languages supported: English, German, Spanish, Swedish.",
"llmAgent": "Local ollama-based AI chatbot, customizable to use any LLM model, any Embed model, 2 Options for Vector DB; local postgres or DataStax Astra. Can read web pages, and answer questions based on the content. More coming soon.. Open source.",
- "subsApi": "API for managing user subscriptions, including features for billing, invoicing, and payment processing. Built with Next.js and integrated with Stripe for secure payments."
+ "subsApi": "API for managing user subscriptions, including features for billing, invoicing, and payment processing. Built with Next.js and integrated with Stripe for secure payments.",
+ "voiceToNotion": "Transforms voice memos and meeting recordings into structured Notion pages with transcripts, summaries, and action items. Automates post-meeting admin work in under 30 seconds.",
+ "aiEmailAutomation": "An interactive demo using RAG to analyze emails, offering selectable answer options and tone-based rewriting. Illustrates a workflow that runs fully autonomously in production environments."
},
"seeMoreOnGitHub": "see more on GitHub...",
"cloneRepository": "Clone Repository",
@@ -494,7 +496,8 @@
"cta": {
"title": "Ready to Start?",
"subtitle": "Book a free 15-minute discovery call. No commitment, just a conversation about your project.",
- "button": "Book Your Free Call"
+ "button": "Book Your Free Call",
+ "viewAllLink": "View All Services, Packages & Pricing"
}
},
"Usecases": {
diff --git a/messages/es.json b/messages/es.json
index 7aab07f..2db9bd3 100644
--- a/messages/es.json
+++ b/messages/es.json
@@ -9,7 +9,7 @@
"Hero": {
"availableForCollaboration": "Disponible para colaborar",
"fullStackDeveloper": "Automatización & MVPs Web con IA",
- "description": "Ayudo a Pymes y agencias a ahorrar tiempo automatizando flujos de trabajo, configurando asistentes de IA internos y creando herramientas web prácticas para lanzar ideas rápido. Menos trabajo manual, más eficiencia. Colaboración directa y ejecución integral.",
+ "description": "Soluciones de automatización, asistentes de IA internos y desarrollo de MVPs. Entregando aplicaciones web de principio a fin, desde el concepto hasta el despliegue—construyendo herramientas prácticas que ahorran tiempo e impulsan la eficiencia.",
"bookFreeCall": "Reserva una Llamada Gratis de 15 Min",
"learnMoreAboutMe": "Conoce más sobre mí",
"moreAboutMe": "Más sobre mí en"
@@ -145,7 +145,9 @@
"portfolioWebsite": "Un portafolio moderno y responsivo construido con Next.js 16, con alternancia de tema oscuro/claro, animaciones fluidas con Framer Motion y rendimiento optimizado. Incluye TypeScript para seguridad de tipos y Tailwind CSS para estilos.",
"berichHub": "Plataforma de aprendizaje digital full-stack con autenticación de usuarios, páginas de perfil y funcionalidades de blog. Integración de IA para aprendizaje personalizado. Completamente gratuita y de código abierto. Soporta 4 idiomas: inglés, alemán, español y sueco.",
"llmAgent": "Chatbot de IA local basado en ollama, personalizable para usar cualquier modelo LLM y cualquier modelo de embeddings, con 2 opciones de base de datos vectorial: Postgres local o DataStax Astra. Puede leer páginas web y responder preguntas basadas en el contenido. Próximamente habrá más... Código abierto.",
- "subsApi": "API para gestionar suscripciones de usuarios, incluyendo funciones de facturación, emisión de facturas y procesamiento de pagos. Construida con Next.js e integrada con Stripe para pagos seguros."
+ "subsApi": "API para gestionar suscripciones de usuarios, incluyendo funciones de facturación, emisión de facturas y procesamiento de pagos. Construida con Next.js e integrada con Stripe para pagos seguros.",
+ "voiceToNotion": "Transforma notas de voz y grabaciones de reuniones en páginas estructuradas de Notion con transcripciones, resúmenes y elementos de acción. Automatiza el trabajo administrativo post-reunión en menos de 30 segundos.",
+ "aiEmailAutomation": "Una demostración interactiva que utiliza RAG para analizar correos electrónicos, ofreciendo opciones de respuesta seleccionables y reescritura basada en tono. Ilustra un flujo de trabajo que funciona completamente de forma autónoma en entornos de producción."
},
"seeMoreOnGitHub": "ver más en GitHub...",
"cloneRepository": "Clonar repositorio",
@@ -494,7 +496,8 @@
"cta": {
"title": "¿Listo para Empezar?",
"subtitle": "Reserva una llamada de descubrimiento gratuita de 15 minutos. Sin compromiso, solo una conversación sobre tu proyecto.",
- "button": "Reservar Consulta Gratuita"
+ "button": "Reservar Consulta Gratuita",
+ "viewAllLink": "Ver Todos los Servicios, Paquetes y Precios"
}
},
"Usecases": {
diff --git a/messages/fr.json b/messages/fr.json
index 514fd6f..8d75cdb 100644
--- a/messages/fr.json
+++ b/messages/fr.json
@@ -9,7 +9,7 @@
"Hero": {
"availableForCollaboration": "Disponible pour collaboration",
"fullStackDeveloper": "Automatisation & MVPs Web propulsés par l'IA",
- "description": "J'aide les PME et les agences à gagner du temps en automatisant les flux de travail, en configurant des assistants IA internes et en créant des outils web pratiques pour lancer des idées rapidement. Moins de travail manuel, plus d'efficacité. Collaboration directe et réalisation de A à Z.",
+ "description": "Solutions d'automatisation, assistants IA internes et développement de MVP. Livraison d'applications web de bout en bout, du concept au déploiement—création d'outils pratiques qui font gagner du temps et améliorent l'efficacité.",
"bookFreeCall": "Réserver un Appel Gratuit de 15 Min",
"learnMoreAboutMe": "En savoir plus sur moi",
"moreAboutMe": "Plus sur moi sur"
@@ -145,7 +145,9 @@
"portfolioWebsite": "Un site portfolio moderne et réactif construit avec Next.js 16, incluant un mode sombre/clair, des animations fluides avec Framer Motion et une performance optimisée. Inclut TypeScript pour la sécurité des types et Tailwind CSS pour le style.",
"berichHub": "Plateforme d'apprentissage numérique full-stack avec authentification utilisateur, pages de profil et fonctionnalités de blog. Intégration IA pour un apprentissage personnalisé. Complètement gratuit et open source. 4 langues supportées : anglais, allemand, espagnol, suédois.",
"llmAgent": "Chatbot IA local basé sur Ollama, personnalisable pour utiliser n'importe quel modèle LLM, n'importe quel modèle d'Embedding, 2 options pour la base vectorielle : Postgres local ou DataStax Astra. Peut lire des pages web et répondre aux questions basées sur leur contenu. D'autres fonctionnalités arrivent... Open source.",
- "subsApi": "API pour gérer les abonnements utilisateurs, incluant la facturation, la gestion des factures et le traitement des paiements. Construit avec Next.js et intégré avec Stripe pour des paiements sécurisés."
+ "subsApi": "API pour gérer les abonnements utilisateurs, incluant la facturation, la gestion des factures et le traitement des paiements. Construit avec Next.js et intégré avec Stripe pour des paiements sécurisés.",
+ "voiceToNotion": "Transforme les mémos vocaux et les enregistrements de réunions en pages Notion structurées avec transcriptions, résumés et points d'action. Automatise le travail administratif post-réunion en moins de 30 secondes.",
+ "aiEmailAutomation": "Une démonstration interactive utilisant RAG pour analyser les e-mails, offrant des options de réponse sélectionnables et une réécriture basée sur le ton. Illustre un flux de travail qui fonctionne de manière totalement autonome dans les environnements de production."
},
"seeMoreOnGitHub": "voir plus sur GitHub...",
"cloneRepository": "Cloner le dépôt",
@@ -494,7 +496,8 @@
"cta": {
"title": "Prêt à Commencer ?",
"subtitle": "Réservez un appel découverte gratuit de 15 minutes. Sans engagement, juste une conversation sur votre projet.",
- "button": "Réserver une Consultation Gratuite"
+ "button": "Réserver une Consultation Gratuite",
+ "viewAllLink": "Voir Tous les Services, Forfaits & Tarifs"
}
},
"Usecases": {
diff --git a/messages/sv.json b/messages/sv.json
index 40138f7..e456a47 100644
--- a/messages/sv.json
+++ b/messages/sv.json
@@ -9,7 +9,7 @@
"Hero": {
"availableForCollaboration": "Tillgänglig för samarbete",
"fullStackDeveloper": "Automatisering & AI-drivna Webb-MVPs",
- "description": "Jag hjälper småföretag och byråer att spara tid genom att automatisera arbetsflöden, sätta upp interna AI-assistenter och bygga praktiska webbverktyg för att snabbt lansera idéer. Mindre manuellt arbete, högre effektivitet. Direkt samarbete och helhetsleverans.",
+ "description": "Automatiseringslösningar, interna AI-assistenter och MVP-utveckling. Levererar webbapplikationer från början till slut, från koncept till lansering—bygger praktiska verktyg som sparar tid och driver effektivitet.",
"bookFreeCall": "Boka ett Gratis 15-Min Samtal",
"learnMoreAboutMe": "Läs mer om mig",
"moreAboutMe": "Mer om mig på"
@@ -145,7 +145,9 @@
"portfolioWebsite": "En modern, responsiv portfoliosajt byggd med Next.js 16, med växling mellan mörkt/ljust tema, mjuka animationer med Framer Motion och optimerad prestanda. Inkluderar TypeScript för typsäkerhet och Tailwind CSS för styling.",
"berichHub": "Fullstack digital lärplattform med användarautentisering, profilsidor och bloggfunktioner. AI-integration för personligt lärande. Helt gratis och öppen källkod. Stöd för 4 språk: engelska, tyska, spanska och svenska.",
"llmAgent": "AI-chatbot baserad på lokal Ollama, anpassningsbar för att använda vilken LLM-modell som helst, valfri embedding-modell samt två alternativ för vektordatabas: lokal Postgres eller DataStax Astra. Kan läsa webbsidor och svara på frågor baserat på innehållet. Mer kommer snart... Öppen källkod.",
- "subsApi": "API för att hantera användarprenumerationer, inklusive fakturering och betalningshantering. Byggt med Next.js och integrerat med Stripe för säkra betalningar."
+ "subsApi": "API för att hantera användarprenumerationer, inklusive fakturering och betalningshantering. Byggt med Next.js och integrerat med Stripe för säkra betalningar.",
+ "voiceToNotion": "Omvandlar röstmemon och mötesinspelningar till strukturerade Notion-sidor med transkriptioner, sammanfattningar och åtgärdspunkter. Automatiserar administrativt arbete efter möten på under 30 sekunder.",
+ "aiEmailAutomation": "En interaktiv demo som använder RAG för att analysera e-post och erbjuder valbara svarsalternativ och tonbaserad omskrivning. Illustrerar ett arbetsflöde som körs helt autonomt i produktionsmiljöer."
},
"seeMoreOnGitHub": "se mer på GitHub...",
"cloneRepository": "Klona repository",
@@ -494,7 +496,8 @@
"cta": {
"title": "Redo att Börja?",
"subtitle": "Boka ett gratis 15-minuters upptäcktssamtal. Inget åtagande, bara ett samtal om ditt projekt.",
- "button": "Boka Gratis Konsultation"
+ "button": "Boka Gratis Konsultation",
+ "viewAllLink": "Visa Alla Tjänster, Paket & Priser"
}
},
"Usecases": {
diff --git a/package.json b/package.json
index d7997e7..53dd4e4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "coldbydefault-portfolio",
- "version": "6.0.1",
+ "version": "6.0.2",
"description": "Professional portfolio of Yazan Abo-Ayash (ColdByDefault™) - Full Stack Developer specializing in AI and automation, Next.js and modern web technologies.",
"keywords": [
"portfolio",
diff --git a/styles/company-banner.css b/styles/company-banner.css
index bc5b4ca..3aeb5bd 100644
--- a/styles/company-banner.css
+++ b/styles/company-banner.css
@@ -23,6 +23,7 @@
}
/* Animation classes for seamless scrolling */
+/* Base animations - Desktop (1024px+) */
.animate-scroll {
animation: scroll-seamless 60s linear infinite;
}
@@ -51,6 +52,90 @@
animation: scroll-reverse-seamless 30s linear infinite;
}
+/* Tablet (768px - 1023px) - Slightly faster to compensate for smaller width */
+@media (max-width: 1023px) {
+ .animate-scroll {
+ animation-duration: 45s;
+ }
+
+ .animate-scroll-slow {
+ animation-duration: 70s;
+ }
+
+ .animate-scroll-fast {
+ animation-duration: 22s;
+ }
+
+ .animate-reverse,
+ .animate-scroll.animate-reverse {
+ animation-duration: 45s;
+ }
+
+ .animate-scroll-slow.animate-reverse {
+ animation-duration: 70s;
+ }
+
+ .animate-scroll-fast.animate-reverse {
+ animation-duration: 22s;
+ }
+}
+
+/* Mobile (640px - 767px) - Faster to maintain visual speed */
+@media (max-width: 767px) {
+ .animate-scroll {
+ animation-duration: 35s;
+ }
+
+ .animate-scroll-slow {
+ animation-duration: 55s;
+ }
+
+ .animate-scroll-fast {
+ animation-duration: 18s;
+ }
+
+ .animate-reverse,
+ .animate-scroll.animate-reverse {
+ animation-duration: 35s;
+ }
+
+ .animate-scroll-slow.animate-reverse {
+ animation-duration: 55s;
+ }
+
+ .animate-scroll-fast.animate-reverse {
+ animation-duration: 18s;
+ }
+}
+
+/* Small Mobile (< 640px) - Even faster for tiny screens */
+@media (max-width: 639px) {
+ .animate-scroll {
+ animation-duration: 28s;
+ }
+
+ .animate-scroll-slow {
+ animation-duration: 45s;
+ }
+
+ .animate-scroll-fast {
+ animation-duration: 14s;
+ }
+
+ .animate-reverse,
+ .animate-scroll.animate-reverse {
+ animation-duration: 28s;
+ }
+
+ .animate-scroll-slow.animate-reverse {
+ animation-duration: 45s;
+ }
+
+ .animate-scroll-fast.animate-reverse {
+ animation-duration: 14s;
+ }
+}
+
/* Only apply hover pause on devices that support hover */
@media (hover: hover) {
.hover\:pause:hover {