{
  "formatVersion": 1,
  "url": "https://itsyourap.dev/",
  "language": "en",
  "person": {
    "name": "Ankan Pal",
    "title": "Backend & DevOps Engineer",
    "location": "West Bengal, India",
    "email": "contact@itsyourap.dev",
    "resumeUrl": "https://s.itsyourap.dev/my-resume",
    "githubUrl": "https://github.com/itsyourap",
    "linkedinUrl": "https://linkedin.com/in/itsyourap",
    "siteUrl": "https://itsyourap.dev",
    "profiles": [
      {
        "label": "GitHub",
        "href": "https://github.com/itsyourap"
      },
      {
        "label": "LinkedIn",
        "href": "https://linkedin.com/in/itsyourap"
      },
      {
        "label": "Stack Overflow",
        "href": "https://stackoverflow.com/users/17178385/itsyourap"
      },
      {
        "label": "𝕏",
        "href": "https://x.com/itsyourap"
      }
    ]
  },
  "pages": [
    {
      "title": "Ankan Pal | Backend & DevOps Engineer",
      "label": "Overview",
      "description": "Ankan Pal, Backend & DevOps Engineer in West Bengal, India. Explore backend services, cloud infrastructure, automation projects, and engineering case studies.",
      "url": "https://itsyourap.dev/"
    },
    {
      "title": "Backend & DevOps Projects | Ankan Pal",
      "label": "Projects",
      "description": "Explore 9 projects by Ankan Pal, including triggerd, icloud-to-gphotos, backend services, systems automation, computer vision, and web platforms.",
      "url": "https://itsyourap.dev/projects/"
    },
    {
      "title": "About Ankan Pal | Backend & DevOps Engineer",
      "label": "About",
      "description": "Meet Ankan Pal, a Backend & DevOps Engineer in West Bengal, India. Professional experience at ProjectX and Resourcio, education, and engineering background.",
      "url": "https://itsyourap.dev/about/"
    },
    {
      "title": "Technical Toolkit: Backend, Cloud & DevOps | Ankan Pal",
      "label": "Technical toolkit",
      "description": "Ankan Pal’s technical toolkit: backend frameworks, AWS, Azure, Google Cloud, Kubernetes, Terraform, databases, programming languages, and delivery automation.",
      "url": "https://itsyourap.dev/stack/"
    },
    {
      "title": "Contact Ankan Pal | Backend & DevOps Engineer",
      "label": "Contact",
      "description": "Contact Ankan Pal for backend engineering, cloud infrastructure, DevOps, and project conversations. Email, professional profiles, and a direct message form.",
      "url": "https://itsyourap.dev/contact/"
    },
    {
      "title": "triggerd: Event-driven task automation across operating systems | Ankan Pal",
      "label": "triggerd",
      "description": "A Go daemon that turns ntfy notifications into allowlisted tasks on Linux, macOS, and Windows. An outbound subscription receives events; the operating system manages the work.",
      "url": "https://itsyourap.dev/projects/triggerd/"
    },
    {
      "title": "icloud-to-gphotos: Resumable photo migration with verified deletion | Ankan Pal",
      "label": "icloud-to-gphotos",
      "description": "A Python pipeline that moves iCloud photo libraries to Google Photos in scheduled batches, preserves media metadata, and checks upload confirmation before removing the source asset.",
      "url": "https://itsyourap.dev/projects/icloud-to-gphotos/"
    }
  ],
  "experience": [
    {
      "period": "Mar 2024 to present",
      "role": "DevOps Engineer",
      "company": "ProjectX Infinity Inc",
      "href": "https://projectx.cloud",
      "description": "Provisioning AWS infrastructure with Terraform, maintaining EKS, EC2, and Route53, and building CI/CD automation. Contributing to InfinityOS, a cloud operating system for application streaming."
    },
    {
      "period": "Jun 2025 to Oct 2025",
      "role": "Backend & Software Developer",
      "company": "Resourcio Private Limited",
      "href": "https://resourcio.in",
      "description": "Built commerce backends for orders, payments, and role-based access, alongside a desktop bulk mailer, third-party API integrations, and document automation."
    }
  ],
  "education": [
    {
      "period": "Sep 2023 to present",
      "degree": "B.Tech in Computer Science & Engineering",
      "institution": "Academy of Technology (MAKAUT, West Bengal)",
      "href": "https://aot.edu.in",
      "score": "GPA 8.765 through semester 6"
    },
    {
      "period": "Feb 2021 to May 2023",
      "degree": "ISC, Class XII",
      "institution": "Holy Angels’ School",
      "href": "https://haskatwa.org",
      "score": "91%"
    },
    {
      "period": "Mar 2020 to May 2021",
      "degree": "ICSE, Class X",
      "institution": "Holy Angels’ School",
      "href": "https://haskatwa.org",
      "score": "94.4%"
    }
  ],
  "toolkit": [
    {
      "name": "Backend systems",
      "items": "TypeScript, Java, Python, Spring Boot, Express.js, PostgreSQL, REST, gRPC"
    },
    {
      "name": "Infrastructure",
      "items": "AWS, Kubernetes, Docker, Terraform, Linux"
    },
    {
      "name": "Delivery",
      "items": "ArgoCD, GitHub Actions, CI/CD, Git, Bash"
    }
  ],
  "stack": [
    {
      "id": "backend",
      "name": "Backend & APIs",
      "context": "Application services and the interfaces between them.",
      "items": [
        "Spring Boot",
        "Node.js",
        "Express.js",
        "Deno",
        "Flask",
        "FastAPI",
        "REST",
        "gRPC"
      ]
    },
    {
      "id": "infrastructure",
      "name": "Infrastructure & delivery",
      "context": "Provisioning environments, shipping changes, and operating services.",
      "items": [
        "Docker",
        "Kubernetes",
        "Terraform",
        "ArgoCD",
        "CI/CD",
        "GitHub Actions",
        "Shell scripting",
        "Linux",
        "Windows",
        "Git",
        "GitHub",
        "systemd"
      ]
    },
    {
      "id": "cloud",
      "name": "Cloud platforms",
      "context": "Cloud services across infrastructure and application development.",
      "items": [
        "AWS",
        "Microsoft Azure",
        "Google Cloud",
        "Firebase"
      ]
    },
    {
      "id": "databases",
      "name": "Data storage",
      "context": "Relational, document, and embedded data stores.",
      "items": [
        "PostgreSQL",
        "MySQL",
        "MongoDB",
        "SQLite"
      ]
    },
    {
      "id": "languages",
      "name": "Languages",
      "context": "From application code to automation and system utilities.",
      "items": [
        "Java",
        "Kotlin",
        "Python",
        "JavaScript",
        "TypeScript",
        "Go",
        "C++",
        "SQL",
        "Bash"
      ]
    },
    {
      "id": "web",
      "name": "Web & frontend",
      "context": "Interfaces that make backend capabilities usable.",
      "items": [
        "HTML",
        "CSS",
        "Tailwind CSS",
        "React",
        "Next.js",
        "Astro",
        "Vite",
        "Webpack"
      ]
    },
    {
      "id": "mobile",
      "name": "Mobile",
      "context": "Native Android applications and interfaces.",
      "items": [
        "Android development",
        "Jetpack Compose"
      ]
    },
    {
      "id": "testing",
      "name": "Testing & security",
      "context": "Browser automation, security practices, and further areas of study.",
      "items": [
        "Selenium",
        "Web security",
        "Cybersecurity",
        "Ethical hacking"
      ]
    }
  ],
  "projects": [
    {
      "id": "triggerd",
      "name": "triggerd",
      "subtitle": "Event-driven task automation",
      "description": "A Go daemon that turns ntfy notifications into allowlisted operating-system tasks. An outbound subscription connects events to systemd, launchd, or Windows Task Scheduler, with bounded dispatch and explicit failure handling.",
      "tags": [
        "Go",
        "ntfy",
        "systemd",
        "GitHub Actions"
      ],
      "category": "Systems & automation",
      "focus": "Execution boundaries and controlled concurrency",
      "notes": [
        {
          "title": "Explicit actions",
          "text": "Incoming events select a configured action. Strict decoding and program/argument arrays keep notification payloads separate from executable commands."
        },
        {
          "title": "Bounded dispatch",
          "text": "A worker pool and a finite queue bound execution calls. Reconnects use backoff and jitter; failed actions are not automatically retried."
        }
      ],
      "links": [
        {
          "label": "Source",
          "href": "https://github.com/itsyourap/triggerd"
        },
        {
          "label": "Documentation",
          "href": "https://github.com/itsyourap/triggerd/tree/main/docs"
        }
      ],
      "url": "https://itsyourap.dev/projects/triggerd/"
    },
    {
      "id": "icloud-to-gphotos",
      "name": "icloud-to-gphotos",
      "subtitle": "Resumable photo migration",
      "description": "A Python pipeline for moving iCloud media to Google Photos in scheduled batches. A SQLite ledger tracks each resource, preserves progress across runs, and gates source deletion on upload confirmation and an age grace period.",
      "tags": [
        "Python",
        "SQLite",
        "ExifTool",
        "systemd"
      ],
      "category": "Systems & automation",
      "focus": "Recovery, metadata fidelity, and cautious deletion",
      "notes": [
        {
          "title": "Resource-level recovery",
          "text": "A persistent ledger tracks individual media resources. A Live Photo requires confirmation of both its still image and video before the iCloud asset can be deleted."
        },
        {
          "title": "Unattended operation",
          "text": "Disk-aware batch planning, finite retry budgets, diagnostic commands, and scheduled jobs support repeatable operation on modest machines."
        }
      ],
      "links": [
        {
          "label": "Source",
          "href": "https://github.com/itsyourap/icloud-to-gphotos"
        },
        {
          "label": "Usage guide",
          "href": "https://github.com/itsyourap/icloud-to-gphotos#readme"
        }
      ],
      "url": "https://itsyourap.dev/projects/icloud-to-gphotos/"
    },
    {
      "id": "techfiesta-backend",
      "category": "Web platforms",
      "name": "TechFiesta Backend",
      "subtitle": "Event registration & payment services",
      "description": "A central backend for a college technology festival, managing event registrations and payments. The project pairs an Express.js API with PostgreSQL and Prisma, with TSOA in the service stack.",
      "tags": [
        "Express.js",
        "TSOA",
        "PostgreSQL",
        "Prisma"
      ],
      "focus": "Registration and payment workflows",
      "notes": [
        {
          "title": "Application service",
          "text": "The central backend brings festival registration and payment workflows into one service."
        },
        {
          "title": "Data & API stack",
          "text": "Express.js and TSOA support the API; PostgreSQL and Prisma provide the data layer."
        }
      ],
      "links": [
        {
          "label": "Project organisation",
          "href": "https://github.com/AOTxTechFiesta/"
        }
      ],
      "url": "https://itsyourap.dev/projects/#techfiesta-backend"
    },
    {
      "id": "rtsp-human-capture",
      "category": "Systems & automation",
      "name": "RTSP Human Capture",
      "subtitle": "Concurrent video stream processing",
      "description": "Real-time person detection from RTSP camera streams using Python, YOLO, and OpenCV. Supports concurrent streams, GPU acceleration, and an automatic HOG fallback, with configurable snapshots or video recording for captured detections.",
      "tags": [
        "Python",
        "YOLO",
        "OpenCV",
        "RTSP"
      ],
      "focus": "Concurrency and detection fallback",
      "notes": [
        {
          "title": "Detection pipeline",
          "text": "YOLOv4 and YOLOv3 detection support GPU acceleration, with an automatic HOG fallback."
        },
        {
          "title": "Stream handling",
          "text": "Multiple camera streams run concurrently, with configurable snapshot and video capture."
        }
      ],
      "links": [
        {
          "label": "Source",
          "href": "https://github.com/itsyourap/rtsp-human-capture"
        },
        {
          "label": "Documentation",
          "href": "https://rtsp-human-capture.docs.itsyourap.dev/"
        }
      ],
      "url": "https://itsyourap.dev/projects/#rtsp-human-capture"
    },
    {
      "id": "gnosiscode",
      "name": "GnosisCode",
      "subtitle": "A coding platform for colleges",
      "description": "A platform for practising programming and tracking student performance. It brings code execution analysis, performance dashboards, and role-based access into a college coding environment.",
      "tags": [
        "React",
        "Express.js",
        "PostgreSQL",
        "Prisma",
        "Docker"
      ],
      "category": "Web platforms",
      "focus": "Code execution and student progress",
      "notes": [
        {
          "title": "Application scope",
          "text": "The platform combines student-facing coding workflows with performance dashboards and access controls for different roles."
        }
      ],
      "links": [],
      "url": "https://itsyourap.dev/projects/#gnosiscode"
    },
    {
      "id": "ecogrow",
      "name": "EcoGrow",
      "subtitle": "Top 8 finalist, FrostHacks S01",
      "description": "A web platform exploring how iframe-generated advertising revenue can fund tree planting. Built with Team ByteWise for FrostHacks S01, where it placed among the top eight finalists.",
      "tags": [
        "Next.js",
        "Express.js",
        "MongoDB",
        "ConductorOSS"
      ],
      "category": "Web platforms",
      "focus": "Connecting web workflows to environmental contributions",
      "notes": [],
      "links": [
        {
          "label": "Source",
          "href": "https://github.com/Team-ByteWise/frosthacks-2k25"
        }
      ],
      "url": "https://itsyourap.dev/projects/#ecogrow"
    },
    {
      "id": "econft",
      "name": "EcoNFT",
      "subtitle": "Environmental contributions & digital ownership",
      "description": "A decentralized platform that rewards tree-planting contributions with unique NFTs. Built with Team ByteWise and showcased at Diversion 2025.",
      "tags": [
        "Next.js",
        "Solidity",
        "Hardhat",
        "Web3",
        "MongoDB"
      ],
      "category": "Experiments",
      "focus": "Web applications and smart contracts",
      "notes": [],
      "links": [
        {
          "label": "Source",
          "href": "https://github.com/Team-ByteWise/diversion-2k25"
        }
      ],
      "url": "https://itsyourap.dev/projects/#econft"
    },
    {
      "id": "sentry-radar-system",
      "name": "Sentry Radar System",
      "subtitle": "Second prize, inter-school science exhibition",
      "description": "A sonar-based object detection project with remote Android connectivity. An early exploration of hardware and software working together, built with Arduino, embedded C++, and Java.",
      "tags": [
        "Java",
        "Embedded C++",
        "Arduino",
        "Android"
      ],
      "category": "Experiments",
      "focus": "Sensors, detection logic, and remote control",
      "notes": [],
      "links": [],
      "url": "https://itsyourap.dev/projects/#sentry-radar-system"
    },
    {
      "id": "argumentcatcher",
      "name": "ArgumentCatcher",
      "subtitle": "Process debugging utility",
      "description": "A Java middleware utility for capturing and analysing process launch arguments. It helps inspect process interactions while debugging complex environments.",
      "tags": [
        "Java"
      ],
      "category": "Systems & automation",
      "focus": "Visibility into process invocation",
      "notes": [],
      "links": [
        {
          "label": "Source",
          "href": "https://github.com/itsyourap/ArgumentCatcher"
        }
      ],
      "url": "https://itsyourap.dev/projects/#argumentcatcher"
    }
  ],
  "caseStudies": [
    {
      "id": "triggerd",
      "name": "triggerd",
      "subtitle": "Event-driven task automation across operating systems",
      "summary": "A Go daemon that turns ntfy notifications into allowlisted tasks on Linux, macOS, and Windows. An outbound subscription receives events; the operating system manages the work.",
      "context": "I wanted a small way to trigger a task, such as regenerating a résumé, from a notification. The design keeps task permissions, dependencies, and logs with the existing service manager. triggerd connects the notification to a configured action through a narrow, inspectable execution path.",
      "steps": [
        {
          "label": "Receive",
          "detail": "An outbound ntfy stream delivers a notification."
        },
        {
          "label": "Validate",
          "detail": "Decode the payload and resolve an allowlisted action."
        },
        {
          "label": "Dispatch",
          "detail": "Apply queue, concurrency, and timeout policies."
        },
        {
          "label": "Trigger",
          "detail": "Ask the platform service manager to start the task."
        }
      ],
      "flowCaption": "The implemented path: ntfy notifications become configured systemd, launchd, or Task Scheduler commands.",
      "decisions": [
        {
          "title": "Keep authority in configuration",
          "text": "The message selects an action name. Configuration defines its executor and target. Strict JSON decoding rejects unknown fields and invalid names before work enters the queue. The OS-task executor builds argument arrays and ignores incoming parameters, keeping network input out of the command line."
        },
        {
          "title": "Make overload visible",
          "text": "A bounded queue and worker pool control pending and active calls. Queue overflow is dropped, logged, and counted. Per-action guards reject overlapping executor calls, and each call receives a timeout. Shutdown discards waiting requests while giving active calls a configurable grace period."
        },
        {
          "title": "Retry the connection deliberately",
          "text": "The ntfy source reconnects with exponential backoff and jitter. A read-idle watchdog detects stalled streams, and a recent-message window suppresses replayed IDs. Failed actions are left to the operator because repeating a task may repeat its side effects. Invalid credentials stop the daemon with an actionable failure."
        },
        {
          "title": "Isolate platform behavior",
          "text": "The core pipeline separates event sources, decoding, action lookup, and execution. Small platform planners handle systemd, launchd, and Task Scheduler. An injectable command runner lets tests check commands and errors without starting real services. The same planning code supports configuration validation and dry runs."
        },
        {
          "title": "Carry the platform split into delivery",
          "text": "GitHub Actions runs build, vet, and race-detector tests across Linux, macOS, and Windows. The release workflow cross-compiles six platform targets and attaches binaries with SHA-256 checksums to versioned releases after the required checks complete."
        }
      ],
      "operations": "YAML configuration defines sources, actions, and dispatcher limits. Credentials can come from environment variables, and structured logs record execution outcomes. Deployment examples cover systemd services, launchd agents, and Windows scheduled tasks. The CLI offers configuration validation and a dry run through the event pipeline.",
      "limits": "On macOS and Windows, success confirms that the task was started; the service manager owns its subsequent lifecycle. The duplicate window lives in memory, and queue overflow drops events. These are deliberate limits of a small automation daemon. Current adapters are ntfy and OS-task execution.",
      "links": [
        {
          "label": "Source repository",
          "href": "https://github.com/itsyourap/triggerd"
        },
        {
          "label": "Architecture",
          "href": "https://github.com/itsyourap/triggerd/blob/main/docs/architecture.md"
        },
        {
          "label": "Security model",
          "href": "https://github.com/itsyourap/triggerd/blob/main/docs/security.md"
        },
        {
          "label": "Platform behavior",
          "href": "https://github.com/itsyourap/triggerd/blob/main/docs/platforms.md"
        },
        {
          "label": "Releases",
          "href": "https://github.com/itsyourap/triggerd/releases"
        }
      ],
      "url": "https://itsyourap.dev/projects/triggerd/"
    },
    {
      "id": "icloud-to-gphotos",
      "name": "icloud-to-gphotos",
      "subtitle": "Resumable photo migration with verified deletion",
      "summary": "A Python pipeline that moves iCloud photo libraries to Google Photos in scheduled batches, preserves media metadata, and checks upload confirmation before removing the source asset.",
      "context": "Moving a photo library involves more than copying files. A Live Photo has multiple components, edited images have additional versions, and missing capture dates can scramble the destination timeline. I built the migration around explicit resource state so interruptions and partial uploads can be handled deliberately.",
      "steps": [
        {
          "label": "Plan",
          "detail": "Read oldest first; assign resources and a batch budget."
        },
        {
          "label": "Prepare",
          "detail": "Stream originals to disk and backfill missing metadata."
        },
        {
          "label": "Confirm",
          "detail": "Upload media and record each remote confirmation."
        },
        {
          "label": "Retire",
          "detail": "Check every resource and the grace period before deletion."
        }
      ],
      "flowCaption": "The SQLite ledger connects each stage. An asset becomes eligible for deletion only after every planned resource is confirmed remotely; deletion must also be enabled.",
      "decisions": [
        {
          "title": "Make deletion conditional",
          "text": "An upload attempt is insufficient evidence to delete a source. The pipeline requires a returned media key or a confirmed remote duplicate for each resource, checks a configurable age grace period, and rechecks the ledger immediately before deletion. Both components of a Live Photo must satisfy that requirement."
        },
        {
          "title": "Keep progress independent of the process",
          "text": "SQLite records assets, individual resources, and run outcomes. A later run skips resources already confirmed remotely. Failures have a finite retry budget; exhausted items are reported and retained in iCloud so one troublesome file does not hold up the remaining library."
        },
        {
          "title": "Fit the work to the machine",
          "text": "Batches use item and byte budgets adjusted for available disk headroom. Downloads stream to temporary files, check their expected size, and rename atomically after completion. Staging is cleared between batches. The byte budget is a planning limit, with individual assets kept together."
        },
        {
          "title": "Preserve meaning as well as media",
          "text": "Metadata backfill fills missing tags without replacing existing ones. EXIF wall-clock timestamps and UTC QuickTime timestamps need different treatment. Live Photo components share a filename stem for pairing, while edited renders upload in a separate pass to avoid accidental pairing."
        },
        {
          "title": "Make unattended work inspectable",
          "text": "The CLI includes dependency and credential checks, progress inspection, and JSON run reports. Reauthentication alerts make expired iCloud sessions visible. Dry-run and no-delete modes let an operator inspect the migration policy before enabling source removal."
        }
      ],
      "operations": "Linux deployment uses a dedicated systemd service account, restricted filesystem access, journal logging, and a persistent timer with explicit Asia/Kolkata scheduling. A randomized delay spreads the nightly start. Windows Task Scheduler support provides the same pipeline on a desktop host.",
      "limits": "The Google Photos integration uses an unofficial client and may need maintenance when its endpoint changes. iCloud sessions occasionally require interactive reauthentication. Shared libraries, hidden items, album membership, favourites, and keywords are outside the supported migration scope.",
      "links": [
        {
          "label": "Repository",
          "href": "https://github.com/itsyourap/icloud-to-gphotos"
        },
        {
          "label": "Pipeline",
          "href": "https://github.com/itsyourap/icloud-to-gphotos/blob/main/src/icloud_to_gphotos/pipeline.py"
        },
        {
          "label": "State ledger",
          "href": "https://github.com/itsyourap/icloud-to-gphotos/blob/main/src/icloud_to_gphotos/ledger.py"
        },
        {
          "label": "Failure-path tests",
          "href": "https://github.com/itsyourap/icloud-to-gphotos/blob/main/tests/test_pipeline.py"
        },
        {
          "label": "Linux deployment",
          "href": "https://github.com/itsyourap/icloud-to-gphotos/blob/main/docs/DEPLOY_LINUX.md"
        }
      ],
      "url": "https://itsyourap.dev/projects/icloud-to-gphotos/"
    }
  ],
  "representations": {
    "index": "https://itsyourap.dev/llms.txt",
    "text": "https://itsyourap.dev/llms-full.txt",
    "json": "https://itsyourap.dev/portfolio.json"
  }
}
