first commit

This commit is contained in:
sandhiya-hepl
2026-07-14 15:20:26 +05:30
commit 4b8af23f5f
125 changed files with 15124 additions and 0 deletions
+26
View File
@@ -0,0 +1,26 @@
import jwt from 'jsonwebtoken';
const JWT_SECRET = process.env.JWT_SECRET || 'dev-secret-change-in-production';
const JWT_EXPIRY = '24h';
export function signToken(username) {
return jwt.sign({ username }, JWT_SECRET, { expiresIn: JWT_EXPIRY });
}
export function verifyToken(token) {
return jwt.verify(token, JWT_SECRET);
}
export function requireAuth(req, res, next) {
const header = req.headers.authorization;
if (!header?.startsWith('Bearer ')) {
return res.status(401).json({ error: 'Authentication required', code: 'UNAUTHORIZED' });
}
try {
req.user = verifyToken(header.slice(7));
next();
} catch {
return res.status(401).json({ error: 'Invalid or expired token', code: 'UNAUTHORIZED' });
}
}
+80
View File
@@ -0,0 +1,80 @@
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import bcrypt from 'bcryptjs';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const DATA_DIR = process.env.DATA_DIR || path.join(__dirname, 'data');
const CONTENT_FILE = path.join(DATA_DIR, 'content.json');
const ADMIN_FILE = path.join(DATA_DIR, 'admin.json');
const SEED_FILE = path.join(__dirname, 'seed', 'default-content.json');
function ensureDataDir() {
if (!fs.existsSync(DATA_DIR)) {
fs.mkdirSync(DATA_DIR, { recursive: true });
}
}
function readJson(filePath, fallback = null) {
if (!fs.existsSync(filePath)) return fallback;
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
}
function writeJson(filePath, data) {
ensureDataDir();
fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
}
export function initDb() {
ensureDataDir();
if (!fs.existsSync(CONTENT_FILE)) {
const seed = readJson(SEED_FILE);
writeJson(CONTENT_FILE, { ...seed, updatedAt: new Date().toISOString() });
console.log('Seeded content database from default-content.json');
}
if (!fs.existsSync(ADMIN_FILE)) {
const password = process.env.ADMIN_PASSWORD || 'admin123';
const hash = bcrypt.hashSync(password, 12);
writeJson(ADMIN_FILE, {
username: process.env.ADMIN_USERNAME || 'admin',
passwordHash: hash,
});
console.log(`Admin user created (username: ${process.env.ADMIN_USERNAME || 'admin'})`);
}
}
export function getContent() {
const data = readJson(CONTENT_FILE, {});
const { updatedAt, ...content } = data;
return { content, updatedAt };
}
export function getFullContentRecord() {
return readJson(CONTENT_FILE, {});
}
export function updateSection(section, sectionData) {
const record = getFullContentRecord();
record[section] = sectionData;
record.updatedAt = new Date().toISOString();
writeJson(CONTENT_FILE, record);
return record.updatedAt;
}
export function updateAllContent(content) {
const record = { ...content, updatedAt: new Date().toISOString() };
writeJson(CONTENT_FILE, record);
return record.updatedAt;
}
export function getAdmin() {
return readJson(ADMIN_FILE);
}
export function updateAdminPassword(passwordHash) {
const admin = getAdmin();
admin.passwordHash = passwordHash;
writeJson(ADMIN_FILE, admin);
}
+46
View File
@@ -0,0 +1,46 @@
import 'dotenv/config';
import express from 'express';
import cors from 'cors';
import path from 'path';
import { fileURLToPath } from 'url';
import { initDb } from './db.js';
import authRoutes from './routes/auth.js';
import contentRoutes from './routes/content.js';
import uploadRoutes from './routes/upload.js';
import multer from 'multer';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const PORT = process.env.PORT || 3001;
const UPLOAD_DIR = process.env.UPLOAD_DIR || path.join(__dirname, 'uploads');
initDb();
const app = express();
app.use(cors({
origin: process.env.CORS_ORIGIN || true,
credentials: true,
}));
app.use(express.json({ limit: '10mb' }));
app.use('/uploads', express.static(UPLOAD_DIR));
app.get('/api/health', (_req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
app.use('/api/auth', authRoutes);
app.use('/api/content', contentRoutes);
app.use('/api/upload', uploadRoutes);
app.use((err, _req, res, _next) => {
if (err instanceof multer.MulterError && err.code === 'LIMIT_FILE_SIZE') {
return res.status(413).json({ error: 'File too large (max 50MB)', code: 'FILE_TOO_LARGE' });
}
console.error(err);
res.status(500).json({ error: err.message || 'Internal server error', code: 'SERVER_ERROR' });
});
app.listen(PORT, () => {
console.log(`API server running on http://localhost:${PORT}`);
});
+62
View File
@@ -0,0 +1,62 @@
import { Router } from 'express';
import bcrypt from 'bcryptjs';
import { getAdmin, updateAdminPassword } from '../db.js';
import { requireAuth, signToken } from '../auth.js';
const router = Router();
const loginAttempts = new Map();
function checkRateLimit(ip) {
const now = Date.now();
const record = loginAttempts.get(ip) || { count: 0, resetAt: now + 60000 };
if (now > record.resetAt) {
loginAttempts.set(ip, { count: 1, resetAt: now + 60000 });
return true;
}
if (record.count >= 5) return false;
record.count++;
loginAttempts.set(ip, record);
return true;
}
router.post('/login', (req, res) => {
const ip = req.ip;
if (!checkRateLimit(ip)) {
return res.status(429).json({ error: 'Too many login attempts', code: 'RATE_LIMITED' });
}
const { username, password } = req.body;
if (!username || !password) {
return res.status(400).json({ error: 'Username and password required', code: 'VALIDATION' });
}
const admin = getAdmin();
if (!admin || username !== admin.username || !bcrypt.compareSync(password, admin.passwordHash)) {
return res.status(401).json({ error: 'Invalid credentials', code: 'UNAUTHORIZED' });
}
const token = signToken(username);
const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();
res.json({ token, expiresAt });
});
router.get('/me', requireAuth, (req, res) => {
res.json({ username: req.user.username });
});
router.put('/password', requireAuth, (req, res) => {
const { currentPassword, newPassword } = req.body;
if (!currentPassword || !newPassword || newPassword.length < 6) {
return res.status(400).json({ error: 'Valid current and new password (min 6 chars) required', code: 'VALIDATION' });
}
const admin = getAdmin();
if (!bcrypt.compareSync(currentPassword, admin.passwordHash)) {
return res.status(401).json({ error: 'Current password is incorrect', code: 'UNAUTHORIZED' });
}
updateAdminPassword(bcrypt.hashSync(newPassword, 12));
res.json({ message: 'Password updated' });
});
export default router;
+30
View File
@@ -0,0 +1,30 @@
import { Router } from 'express';
import { getContent, updateSection, updateAllContent } from '../db.js';
import { requireAuth } from '../auth.js';
import seedContent from '../seed/default-content.json' with { type: 'json' };
const VALID_SECTIONS = Object.keys(seedContent);
const router = Router();
router.get('/', (_req, res) => {
const { content, updatedAt } = getContent();
res.json({ ...content, _updatedAt: updatedAt });
});
router.put('/', requireAuth, (req, res) => {
const { _updatedAt, ...content } = req.body;
const updatedAt = updateAllContent(content);
res.json({ message: 'Content updated', updatedAt });
});
router.put('/:section', requireAuth, (req, res) => {
const { section } = req.params;
if (!VALID_SECTIONS.includes(section)) {
return res.status(404).json({ error: `Unknown section: ${section}`, code: 'NOT_FOUND' });
}
const updatedAt = updateSection(section, req.body);
res.json({ message: `${section} updated`, updatedAt });
});
export default router;
+49
View File
@@ -0,0 +1,49 @@
import { Router } from 'express';
import multer from 'multer';
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import { requireAuth } from '../auth.js';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const UPLOAD_DIR = process.env.UPLOAD_DIR || path.join(__dirname, '..', 'uploads');
if (!fs.existsSync(UPLOAD_DIR)) {
fs.mkdirSync(UPLOAD_DIR, { recursive: true });
}
const storage = multer.diskStorage({
destination: (_req, _file, cb) => cb(null, UPLOAD_DIR),
filename: (_req, file, cb) => {
const ext = path.extname(file.originalname).toLowerCase();
const base = path.basename(file.originalname, ext).replace(/[^a-zA-Z0-9-_]/g, '_').slice(0, 50);
cb(null, `${base}-${Date.now()}${ext}`);
},
});
const upload = multer({
storage,
limits: { fileSize: 50 * 1024 * 1024 },
fileFilter: (_req, file, cb) => {
const allowed = /^image\/|^video\/mp4$/;
if (allowed.test(file.mimetype)) cb(null, true);
else cb(new Error('Only images and MP4 videos are allowed'));
},
});
const router = Router();
router.post('/', requireAuth, upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).json({ error: 'No file uploaded', code: 'VALIDATION' });
}
res.json({ url: `/uploads/${req.file.filename}`, filename: req.file.filename });
});
router.delete('/:filename', requireAuth, (req, res) => {
const filePath = path.join(UPLOAD_DIR, path.basename(req.params.filename));
if (fs.existsSync(filePath)) fs.unlinkSync(filePath);
res.json({ message: 'File deleted' });
});
export default router;
+251
View File
@@ -0,0 +1,251 @@
{
"site": {
"title": "Cavin Infotech | One Trusted Technology Partner",
"logo": "/assets/cavin_logo.svg",
"copyright": "Copyrights reserved to CAVIN INFOTECH"
},
"navigation": [
{ "label": "Home", "href": "#home", "type": "hash" },
{ "label": "About Us", "href": "#aboutus", "type": "hash" },
{ "label": "Products", "href": "#products", "type": "hash" },
{ "label": "Careers", "href": "#careers", "type": "modal" },
{ "label": "Contact Us", "href": "#contactus", "type": "hash" }
],
"hero": {
"video": "/assets/Citpl Hero Dubai(1).mp4",
"badge": "Chennai & Dubai • Trusted by 100+ Clients",
"headline": "Infinite Possibilities",
"subheadline": "One Trusted Technology Partner"
},
"metrics": [
{ "value": "100+", "label": "Clients" },
{ "value": "5+", "label": "Years of Global Operations" },
{ "value": "4", "label": "Group Companies" },
{ "value": "2", "label": "Global Offices" }
],
"about": {
"heading": "Trusted Technology Partner",
"badgeImage": "/assets/frost_sullivan.svg",
"badgeAlt": "Frost & Sullivan Logo",
"backgroundImage": "/assets/partner_bg.png"
},
"partners": {
"heading": "Trusted By Leaders",
"subheading": "from various industries",
"body": "Professionals Trust Our Solutions And Complete Their Journeys.",
"logos": [
{ "name": "CavinKare", "image": "/assets/Frame 27.svg" },
{ "name": "Valeo", "image": "/assets/Frame 28.svg" },
{ "name": "Polyhose", "image": "/assets/Frame 30.svg" },
{ "name": "ACA Global", "image": "/assets/Frame 31.svg" },
{ "name": "Dawn Pictures", "image": "/assets/Frame 32.svg" },
{ "name": "MRF", "image": "/assets/Frame 33.svg" },
{ "name": "Chola MS", "image": "/assets/Frame 34.svg" },
{ "name": "Hero", "image": "/assets/Frame 35.svg" },
{ "name": "BorgWarner", "image": "/assets/Frame 36.svg" },
{ "name": "KONE", "image": "/assets/kone.png" }
]
},
"certifications": {
"heading": "Certified to build what enterprises trust",
"items": [
{ "image": "/assets/cert_iso_27001.png", "alt": "ISO 27001:2022 Certification" },
{ "image": "/assets/cert_iso_9001.png", "alt": "ISO 9001:2015 Certification" },
{ "image": "/assets/cert_soc.png", "alt": "SOC Certification" },
{ "image": "/assets/nasscom.png", "alt": "Nasscom Member Logo" },
{ "image": "/assets/cert_gptw_2026.png", "alt": "Great Place to Work Certified 2026 INDIA" }
]
},
"services": {
"eyebrow": "TECHNOLOGY THAT MOVES YOUR BUSINESS FORWARD.",
"title": "Our Services",
"intro": "From market leaders to high-growth innovators, enterprises trust Cavin Infotech to deliver secure, scalable, and future-ready digital solutions that create measurable business value.",
"items": [
{
"id": "ai-data-services",
"number": "01",
"title": "AI & Data Services",
"boldStatement": "Your Data, Unlocked.",
"description": "Harness Generative AI, Agentic AI, and predictive analytics to automate complex workflows, predict market shifts, and unlock hidden revenue — powered by modern AI architectures.",
"capabilities": ["Generative AI & LLM Solutions", "Agentic AI & Autonomous Systems", "Predictive Analytics & Forecasting", "Conversational AI & Enterprise Assistants"],
"cta": "Explore AI Solutions",
"glowColor": "radial-gradient(circle at bottom right, rgba(255, 120, 0, 0.15) 0%, rgba(2, 7, 16, 0) 70%)",
"borderColor": "rgba(255, 120, 0, 0.12)"
},
{
"id": "sap-managed-services",
"number": "02",
"title": "SAP Managed Services",
"boldStatement": "SAP That Works. So You Can Focus.",
"description": "Certified SAP consultants delivering functional expertise, ABAP development, security, upgrades, and license optimization — keeping your enterprise running smooth and audit-ready.",
"capabilities": ["SAP Functional Consulting", "SAP ABAP Development", "SAP Security & Compliance", "SAP Upgrades & Optimization"],
"cta": "Explore SAP Solutions",
"glowColor": "radial-gradient(circle at bottom right, rgba(0, 240, 255, 0.15) 0%, rgba(2, 7, 16, 0) 70%)",
"borderColor": "rgba(0, 240, 255, 0.12)"
},
{
"id": "enterprise-development",
"number": "03",
"title": "Enterprise Development",
"boldStatement": "Built to Scale With You.",
"description": "Custom enterprise applications that modernize legacy workflows, connect business systems, and deliver reliable digital operations as your organization evolves.",
"capabilities": ["Custom Enterprise Applications", "Mobile & Web Platforms", "Modernization of Legacy Systems", "Workflow Automation"],
"cta": "Explore Enterprise Solutions",
"glowColor": "radial-gradient(circle at bottom right, rgba(59, 130, 246, 0.12) 0%, rgba(255, 120, 0, 0.08) 50%, rgba(2, 7, 16, 0) 100%)",
"borderColor": "rgba(59, 130, 246, 0.12)"
},
{
"id": "architecture-as-a-service",
"number": "04",
"title": "Architecture as a Service",
"boldStatement": "Design the Foundation Before You Build.",
"description": "We help businesses define scalable technology architecture, integration models, cloud strategy, and modernization roadmaps before execution begins.",
"capabilities": ["Enterprise Architecture", "Solution Architecture", "Cloud Architecture", "Integration Architecture"],
"cta": "Explore Architecture Solutions",
"glowColor": "radial-gradient(circle at bottom right, rgba(29, 78, 216, 0.15) 0%, rgba(2, 7, 16, 0) 70%)",
"borderColor": "rgba(29, 78, 216, 0.12)"
},
{
"id": "smart-factory-iot",
"number": "05",
"title": "Smart Factory / Industrial IoT",
"boldStatement": "Make Operations Visible, Connected, and Intelligent.",
"description": "Connect machines, sensors, production systems, and dashboards to enable real-time monitoring, predictive maintenance, and smarter factory decisions.",
"capabilities": ["Industrial IoT Integration", "Real-Time Machine Monitoring", "Predictive Maintenance", "Factory Dashboards"],
"cta": "Explore Smart Factory Solutions",
"glowColor": "radial-gradient(circle at bottom right, rgba(255, 120, 0, 0.08) 0%, rgba(59, 130, 246, 0.08) 50%, rgba(2, 7, 16, 0) 100%)",
"borderColor": "rgba(255, 120, 0, 0.1)"
},
{
"id": "ar-vr-solutions-digifox",
"number": "06",
"title": "AR/VR Solutions — DigiFox",
"boldStatement": "Immersive Experiences for Training, Learning, and Visualization.",
"description": "Create virtual environments, simulations, AR product experiences, and immersive learning platforms that improve engagement, understanding, and retention.",
"capabilities": ["VR Training Simulations", "AR Product Visualization", "Immersive Learning Experiences", "3D Interaction Design"],
"cta": "Explore DigiFox Solutions",
"glowColor": "radial-gradient(circle at bottom right, rgba(139, 92, 246, 0.15) 0%, rgba(2, 7, 16, 0) 70%)",
"borderColor": "rgba(139, 92, 246, 0.12)"
}
]
},
"whyUs": {
"eyebrow": "Why Cavin Infotech",
"title": "Designed For High Scalability",
"cards": [
{
"title": "Innovation Driven",
"description": "We deliver future-ready solutions powered by Gen AI, Agentic AI, automation, IoT, and emerging tech that keep you ahead of the curve."
},
{
"title": "Industry Expertise",
"description": "Deep domain knowledge across manufacturing, enterprise tech, smart manufacturing, and digital operations built from years of real-world implementation."
},
{
"title": "Secure & Reliable",
"description": "Every solution is built on globally recognized standards with uncompromising focus on security, compliance, and operational excellence."
},
{
"title": "Outcome Focused",
"description": "We don't just implement technology we design every solution to reduce complexity, boost efficiency, and deliver clear, measurable business impact."
}
],
"images": [
{ "src": "/assets/whyus_arab_meeting.jpg", "alt": "Corporate collaboration" },
{ "src": "/assets/whyus_vr_man.jpg", "alt": "VR technology" },
{ "src": "/assets/whyus_hologram.jpg", "alt": "Hologram technology" }
]
},
"gallery": {
"eyebrow": "Featured Gallery",
"title": "Real Transformations. Proven Business Outcomes.",
"subtitle": "From transformation stories to team innovation, explore how we build future-ready experiences.",
"items": [
{ "id": 1, "title": "Relentless Brand Growth & Innovation", "category": "Case Study", "excerpt": "Discover how we engineered a scalable digital platform that boosted brand engagement by 150% and accelerated global market reach.", "image": "https://images.unsplash.com/photo-1460925895917-afdab827c52f?auto=format&fit=crop&w=800&q=80", "readTime": "5 Min Read" },
{ "id": 2, "title": "How We Transformed Billing at TTK", "category": "Transformation", "excerpt": "Transitioning legacy paper billing to an automated IoT-driven workflow, reducing checkout delays and improving customer satisfaction.", "image": "https://images.unsplash.com/photo-1554224155-8d04cb21cd6c?auto=format&fit=crop&w=800&q=80", "readTime": "8 Min Read" },
{ "id": 3, "title": "How We Transformed Retail Operations", "category": "Retail", "excerpt": "Unifying online inventory with physical retail networks, enabling smart warehouse tracking and seamless order fulfillment.", "image": "https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?auto=format&fit=crop&w=800&q=80", "readTime": "6 Min Read" },
{ "id": 4, "title": "How We Transformed Enterprise Workflows", "category": "Workflow", "excerpt": "Re-engineering internal communication channels and operations with Gen AI assistants, saving thousands of operational hours.", "image": "https://images.unsplash.com/photo-1531538606174-0f90ff5dce83?auto=format&fit=crop&w=800&q=80", "readTime": "10 Min Read" },
{ "id": 5, "title": "Digital Product Showcase", "category": "Showcase", "excerpt": "A curation of sleek web interfaces, user-centric mobile applications, and custom enterprise portals designed by our UI/UX experts.", "image": "https://images.unsplash.com/photo-1507238691740-187a5b1d37b8?auto=format&fit=crop&w=800&q=80", "readTime": "7 Min Read" },
{ "id": 6, "title": "Innovation Lab", "category": "Innovation", "excerpt": "Step inside our workshop where we prototype Agentic AI, smart hardware sensors, and computer vision systems for next-generation industries.", "image": "https://images.unsplash.com/photo-1485827404703-89b55fcc595e?auto=format&fit=crop&w=800&q=80", "readTime": "12 Min Read" }
]
},
"products": {
"eyebrow": "Our Products Suite",
"title": "Powering Digital Growth",
"subtitle": "Powerful products built to simplify operations, improve visibility, and accelerate digital growth.",
"items": [
{
"name": "Prodmax",
"description": "AI-powered Industrial IoT platform for smart manufacturing delivering real-time monitoring, advanced analytics, traceability, and operational intelligence.",
"image": "/assets/prodmax_dashboard.png",
"stats": [
{ "value": "5%+", "label": "OEE Improvement" },
{ "value": "15%", "label": "Reduction in Downtime" }
]
},
{
"name": "EVIDO",
"description": "Intelligent audit management platform that standardizes inspections, automates issue tracking, and provides complete operational visibility.",
"image": "/assets/evido_dashboard.png",
"stats": [
{ "value": "60%", "label": "Faster Process Automation" },
{ "value": "24/7", "label": "AI Driven Assistance" }
]
},
{
"name": "Budgie - HRMS",
"description": "Modern workforce management platform that simplifies employee operations, boosts engagement, and streamlines organizational processes.",
"image": "/assets/budgie_dashboard.png",
"stats": [
{ "value": "40%", "label": "HR Operations Efficiency" },
{ "value": "99.8%", "label": "Payroll Accuracy" }
]
}
]
},
"insights": {
"title": "Explore the Latest in Technology & Innovation",
"subtitle": "Stay ahead with insights, stories, and updates on digital transformation, AI, automation, product design, and enterprise technology.",
"items": [
{ "category": "AI & Analytics", "title": "How AI is Reshaping Enterprise Decision Making", "date": "June 15, 2026", "image": "https://images.unsplash.com/photo-1620712943543-bcc4688e7485?auto=format&fit=crop&w=800&q=80", "excerpt": "Explore how deep learning models and agentic decision trees are replacing traditional business intelligence systems to drive proactive operations." },
{ "category": "Digital Strategy", "title": "Why Digital Transformation Needs More Than Technology", "date": "June 02, 2026", "image": "https://images.unsplash.com/photo-1519389950473-47ba0277781c?auto=format&fit=crop&w=800&q=80", "excerpt": "Technology is only half the battle. True organizational agility requires architectural alignment, structural changes, and cultural evolution." },
{ "category": "Product Design", "title": "Designing Enterprise Software Users Actually Love", "date": "May 18, 2026", "image": "https://images.unsplash.com/photo-1586717791821-3f44a563fa4c?auto=format&fit=crop&w=800&q=80", "excerpt": "Applying consumer-grade user experience principles to complex B2B systems reduces training costs and accelerates daily workflows." },
{ "category": "Automation", "title": "The Future of Automation in Business Workflows", "date": "May 05, 2026", "image": "https://images.unsplash.com/photo-1485827404703-89b55fcc595e?auto=format&fit=crop&w=800&q=80", "excerpt": "From robotic process automation (RPA) to generative AI pipelines, learn how workflow automation is changing modern business scaling." },
{ "category": "Cloud Architecture", "title": "Building Scalable Cloud-Native Infrastructure for Enterprises", "date": "April 22, 2026", "image": "https://images.unsplash.com/photo-1544197150-b99a580bb7a8?auto=format&fit=crop&w=800&q=80", "excerpt": "Microservices, Kubernetes, and serverless patterns are redefining how large-scale enterprise systems handle performance at unpredictable loads." },
{ "category": "Cybersecurity", "title": "Zero Trust Security Models in the Age of Remote Work", "date": "April 08, 2026", "image": "https://images.unsplash.com/photo-1563986768494-4dee2763ff3f?auto=format&fit=crop&w=800&q=80", "excerpt": "As perimeter-based security crumbles, zero trust frameworks enforce identity verification at every layer — from endpoint to data center." },
{ "category": "Data Engineering", "title": "Real-Time Data Pipelines That Power Smarter Decisions", "date": "March 25, 2026", "image": "https://images.unsplash.com/photo-1551288049-bebda4e38f71?auto=format&fit=crop&w=800&q=80", "excerpt": "Event-driven architectures and streaming platforms like Apache Kafka enable organizations to act on data the moment it is generated." }
]
},
"footer": {
"cta": {
"headline": "Ready to Accelerate Your Digital Transformation Journey?",
"body": "Whether you're exploring AI solutions, smart manufacturing, enterprise software, immersive technologies, or full-scale digital transformation, our experts are ready to help you build scalable solutions that deliver real business outcomes.",
"image": "/assets/Footer CTA Section.png",
"primaryButton": "Schedule a Consultation",
"secondaryButton": "Request a Product Demo"
},
"quickLinks": [
{ "label": "Home", "href": "#home" },
{ "label": "About Us", "href": "#certifications" },
{ "label": "Our Services", "href": "#services" }
],
"productLinks": [
{ "label": "PRODMAX", "href": "#products" },
{ "label": "Budgie HRMS", "href": "#products" },
{ "label": "EVIDO", "href": "#products" }
],
"social": [
{ "platform": "Facebook", "url": "#" },
{ "platform": "Instagram", "url": "#" },
{ "platform": "LinkedIn", "url": "#" },
{ "platform": "Telegram", "url": "#" },
{ "platform": "WhatsApp", "url": "#" },
{ "platform": "X", "url": "#" },
{ "platform": "YouTube", "url": "#" }
],
"legal": [
{ "label": "Privacy Policy", "href": "#" },
{ "label": "Terms & Conditions", "href": "#" }
]
}
}