Skip to content

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

47 Commits

Folders and files

Repository files navigation

Ravi Sorathiya β€” Android Developer portfolio

Ravi Sorathiya β€” Portfolio

Android developer Β· Kotlin & Jetpack Compose Β· 12 apps live on Google Play

Live site Deploy

Vue Vite Tailwind CSS Markdown PWA GitHub Pages


πŸ”— Quick links

Page URL
🏠 Home https://ravisorathiya.github.io/
πŸ‘€ About & tech explorer https://ravisorathiya.github.io/about
πŸ“± All apps (search + filters) https://ravisorathiya.github.io/projects
🟒 Only apps live on Google Play https://ravisorathiya.github.io/projects?status=live
πŸ“„ Flagship β€” PDF Reader & Editor https://ravisorathiya.github.io/projects/pdf-reader
πŸ“ Dev Notes (blog) https://ravisorathiya.github.io/blog
πŸ“‘ RSS feed https://ravisorathiya.github.io/blog/rss.xml
βœ‰οΈ Contact https://ravisorathiya.github.io/contact

πŸ’‘ Tip: press Ctrl + K anywhere on the site to search every app and article.


πŸ“– Quick guide: how do I…?

The easiest way to do anything: open Claude Code in this folder and say it in plain words. Claude makes the change, checks it, publishes it automatically, and gives you the link.

I want to… Ask Claude Or do it yourself
Publish my changes "publish it" Double-click publish.cmd, or run npm run deploy -- "what changed"
Add an app from my workspace /add-project producation/MyApp See Add a new app by hand
Add an app that's only on Google Play "add this app: " Same as above, using the listing for details
Remove an app /remove-project <app> Delete its .md file + icon, move its row to Excluded in docs/PROJECTS.md
Write an article /new-post <topic> (saved as a draft) Create content/blog/<name>.md with draft: true
Publish a draft article "publish the article " Change draft: true β†’ draft: false, then publish
Plan article ideas "write the next article from the ideas list" Add a line under Ideas in docs/POSTS.md
Change my bio, email, skills, job "change my bio to …" Edit src/data/portfolio.js, then publish
Update an app's screenshots "refresh screenshots for " npm run screenshots -- <app>, then publish
Preview before publishing "show me locally" npm run dev β†’ open http://localhost:5173
See what's on the site "what apps/articles are on the site?" docs/PROJECTS.md (apps) Β· docs/POSTS.md (articles)

Where things live:

content/projects/   β†’ one .md file per app      (what each app page shows)
content/blog/       β†’ one .md file per article  (draft: true = hidden until you publish)
src/data/portfolio.js β†’ your name, bio, email, skills, experience
docs/PROJECTS.md    β†’ list of apps on the site (+ removed ones, so they never come back)
docs/POSTS.md       β†’ list of articles (+ ideas to write next)
publish.cmd         β†’ double-click to publish

Safety net: every publish runs npm run check first. If something's wrong (a missing or too-long field, an app or article missing from its list, a missing image, a secret key pasted in), it stops and tells you exactly which file and field, and nothing broken goes live.


πŸ“± Featured apps

App What it is Status
PDF Reader & Editor Annotate, sign, edit text, lock, convert & scan PDFs 🟠 In progress
Phone Call Default dialer with spam blocking & call themes 🟒 Google Play
Messages Default SMS & MMS app built in Jetpack Compose 🟒 Google Play
Gallery - Photo Gallery Compose gallery with timeline, editor & photo picker 🟒 Google Play

➑️ See all 14 apps β†’


✨ What's on the site

  • Content-driven: every app and article is a Markdown file in content/, validated on every build.
  • App pages: Google Play screenshots with a zoomable lightbox, a features / under-the-hood breakdown, a written case study, and a Google Play badge.
  • Dev Notes (blog): technical articles with a table of contents, code highlighting and an RSS feed. The blog appears once the first article is published.
  • Search: typo-tolerant full-text search across apps and articles. Use Ctrl/⌘ + K anywhere, or the Projects page (filters live in the URL).
  • Tech explorer: click any technology on the About page to see which apps use it.
  • Installable & offline (PWA), with optimised WebP images.
  • SEO: pre-rendered HTML, structured data, sitemap, and an auto-generated share image for every page.

πŸ€– AI-driven maintenance

This site is maintained with Claude Code. The plan and project tracking live in the repo:

File Purpose
CLAUDE.md Rules and step-by-step workflows that AI agents follow
docs/SITE_PLAN.md Site plan: pages, content model, design system, SEO, search, PWA, backlog, decision log
docs/PROJECTS.md Project registry: πŸ“₯ Inbox, βœ… on site, 🚫 excluded, πŸ“ changelog
docs/POSTS.md Blog registry: πŸ’‘ ideas, πŸ“° published & drafts, πŸ“ changelog

Claude Code commands:

Command What it does
/add-project producation/MyNewApp Reads the app's source, checks Google Play, adds icon + screenshots + a case study, updates the registry, publishes
/remove-project <slug> Removes an app and records it as Excluded so it's never re-added
/new-post <topic> Drafts a Dev Notes article from the real source code (stays a draft until you approve it)

You can also add a line to the Inbox in docs/PROJECTS.md and ask Claude to "process the project inbox".

npm run check (also run in CI before every deploy) blocks a deploy if any content file is invalid, either registry (apps or articles) disagrees with the content, or a secret slipped in.


πŸš€ Publish (one command)

After any change (an app, an article, your bio…), publish with one of:

How Command
Terminal npm run deploy -- "what changed"
Double-click publish.cmd in the project folder (asks what changed)
Ask Claude "publish it". Claude publishes automatically after every change anyway.

What it does (scripts/deploy.mjs):

  1. npm run check: stops if any content is invalid, so nothing broken gets pushed
  2. commits all changes with your message (skipped if nothing changed)
  3. pushes to GitHub, which triggers the deploy workflow
  4. waits for the deploy and tells you if it succeeded or failed (with a link)
  5. confirms https://ravisorathiya.github.io/ is live

Options: --build builds locally first (catches errors before pushing) Β· --no-wait pushes and exits.


✏️ How to update the site

I want to… Edit this
Add / edit an app content/projects/<slug>.md (+ a row in docs/PROJECTS.md)
Write / publish an article content/blog/<slug>.md (set draft: false to publish) + its row in docs/POSTS.md
Change my name, bio, email, socials, skills, experience src/data/portfolio.js
Change the colour theme --color-brand-* in src/style.css

βž• Add a new app by hand

  1. Icon: put it at public/images/apps/my-app.png, then run npm run icons (converts it to a 256px WebP).

  2. Content: create content/projects/my-app.md (the file name becomes the URL /projects/my-app):

    ---
    title: "My App"
    type: "Productivity"          # Messaging | Dialer & Contacts | Gallery & Media | Productivity | Social
    status: live                  # live | completed | in-progress
    featured: false               # true = show on the home page (keep exactly 4)
    order: 50
    icon: /images/apps/my-app.webp
    playPackage: com.example.myapp   # omit if not on Google Play
    summary: "One sentence about the app (110 characters max)."
    features:
      - "Feature one"
      - "Feature two"
      - "Feature three"
    highlights:
      - "Interesting technical detail"
      - "Another one"
    tags: ["Kotlin", "Jetpack Compose", "Room"]
    ---
    
    ## Overview
    
    What the app does and who it's for.
    
    ## How it works
    
    The interesting technical parts.
  3. Screenshots & developer (live apps): npm run screenshots -- my-app and npm run play-meta -- my-app pull them from the app's Google Play listing.

  4. Registry: add a row to docs/PROJECTS.md, then run npm run check.

  5. Publish: npm run deploy -- "Add My App" (or double-click publish.cmd).

πŸ“ Still to fill in

  • Contact email (done)
  • Publish the first articles (done: 3 live)
  • University names in education (in src/data/portfolio.js)
  • LinkedIn / other profiles in socials
  • Optional: public/resume.pdf, then set resumeUrl: '/resume.pdf'
  • Google Search Console: verify the site and submit sitemap.xml (see SEO)

πŸ› οΈ Run it locally

Requires Node 20+.

npm install
npm run dev            # dev server β†’ http://localhost:5173 (draft articles visible)
npm run check          # validate content + registry + secrets scan
npm run build          # pre-render pages + sitemap + RSS + share images + service worker
npm run build:drafts   # local preview including draft articles (don't deploy)
npm run preview        # serve the production build
npm run icons          # normalise app icons (+ PWA icons)
npm run screenshots -- <slug>   # fetch Google Play screenshots for an app
npm run og             # regenerate share images (+ this README's banner)
npm run play-meta -- <slug>     # fetch the Play developer (console) name for an app
npm run deploy -- "message"    # publish: check β†’ commit β†’ push β†’ wait β†’ verify

πŸ—‚οΈ Project structure

β”œβ”€β”€ .claude/commands/              # /add-project, /remove-project, /new-post for Claude Code
β”œβ”€β”€ .github/workflows/deploy.yml   # check + build + deploy to GitHub Pages on push to main
β”œβ”€β”€ CLAUDE.md                      # AI agent rules + workflows
β”œβ”€β”€ publish.cmd                    # double-click to publish the site
β”œβ”€β”€ content/
β”‚   β”œβ”€β”€ projects/*.md              # ⭐ one file per app: data + case study
β”‚   └── blog/*.md                  # ⭐ Dev Notes articles
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ SITE_PLAN.md               # site plan, content model, decisions
β”‚   β”œβ”€β”€ PROJECTS.md                # project registry (inbox / on site / excluded)
β”‚   └── POSTS.md                   # blog registry (ideas / published / drafts)
β”œβ”€β”€ public/
β”‚   β”œβ”€β”€ images/apps/               # app icons (<slug>.webp) + screenshots (<slug>/*.webp)
β”‚   β”œβ”€β”€ og.png                     # README banner (generated by npm run og)
β”‚   └── robots.txt, pwa-*.png      # crawler rules, icons for installing the site
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ content-fs.mjs             # Node content loader + validation
β”‚   β”œβ”€β”€ check-content.mjs          # npm run check
β”‚   β”œβ”€β”€ og.mjs                     # share images (satori + resvg)
β”‚   β”œβ”€β”€ rss.mjs                    # RSS / Atom feeds
β”‚   β”œβ”€β”€ icons.mjs                  # icon normalisation + PWA icons
β”‚   β”œβ”€β”€ fetch-screenshots.mjs      # Google Play screenshots
β”‚   β”œβ”€β”€ play-meta.mjs              # Play developer (console) name
β”‚   └── deploy.mjs                 # one-command publish (npm run deploy / publish.cmd)
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ content/                   # schema (zod) + browser loader for content/
β”‚   β”œβ”€β”€ data/portfolio.js          # profile, skills, experience, nav
β”‚   β”œβ”€β”€ views/                     # Home, About, Projects, ProjectDetail, Blog, BlogPost, Contact, 404
β”‚   β”œβ”€β”€ components/                # ProjectCard, ScreenshotGallery, CommandPalette, PostCard, …
β”‚   β”œβ”€β”€ composables/               # seo.js (meta + JSON-LD), internal links, palette state
β”‚   β”œβ”€β”€ utils/search.js            # MiniSearch full-text search
β”‚   └── style.css                  # Tailwind theme + Markdown (prose) styles
└── vite.config.js                 # Markdown, PWA, image optimiser, pre-render routes, sitemap/RSS/OG

βš™οΈ How deployment works

Hosted on GitHub Pages at https://ravisorathiya.github.io/.

  • Every push to main triggers deploy.yml: npm ci, then npm run check, then npm run build, then publish dist/.
  • Check progress under the Actions tab.
  • One-time setting (already done): Settings β†’ Pages β†’ Source: GitHub Actions.

πŸ” SEO

What Where
Pre-rendered HTML for every page (HTTP 200) vite-ssg, routes generated from content/
Title, description, canonical, Open Graph, Twitter src/composables/seo.js
Structured data (Person, SoftwareApplication, BlogPosting, Breadcrumbs) useSeo() calls in each view
Share image per page generated at build β†’ /og/…png
Sitemap / RSS https://ravisorathiya.github.io/sitemap.xml Β· /blog/rss.xml once posts are published
Robots https://ravisorathiya.github.io/robots.txt

Next step: add the site in Google Search Console and submit sitemap.xml.


Made with πŸ’š by Ravi Sorathiya Β· ravisorathiya.github.io

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages