46 Commits

Author SHA1 Message Date
Sravan Balaji
3016fd8d5b Clean Up Personal Page
- Add hardware section to personal page
- Remove video games, podcasts, music, etc.
2025-02-22 22:00:36 -05:00
Sravan Balaji
6beea310df Update devenv packages 2025-02-18 21:43:01 -05:00
Sravan Balaji
6f506c4273 Update gentoo content 2025-02-18 21:42:44 -05:00
Sravan Balaji
32444ba72a Add collection for hardware with oryp7 and add gentoo to software 2025-02-15 11:38:59 -05:00
Sravan Balaji
6fd5369daf Finish migrating software to markdown 2025-02-07 22:47:53 -05:00
Sravan Balaji
2d6be05eae Update packages 2025-02-07 20:14:55 -05:00
Sravan Balaji
a73d30d52f Add Software Engineer II promotion 2025-02-07 19:52:27 -05:00
Sravan Balaji
c08adab41c Add npm update to justfile's update command 2025-01-04 22:21:52 -05:00
Sravan Balaji
c8cf9dd738 Format eleventy config with prettier 2025-01-04 22:20:12 -05:00
Sravan Balaji
041164f1d2 Setup project with devenv instead of docker 2025-01-04 22:20:12 -05:00
Sravan Balaji
660c328c86 Format dark mode switch script 2025-01-04 18:39:43 -05:00
Sravan Balaji
cd4e714cb6 Start migrating software section to use templates 2025-01-04 14:36:32 -05:00
Sravan Balaji
df2d33e32a Minor fixes to portfolio page 2025-01-02 17:38:30 -05:00
Sravan Balaji
87ae00354d Add notable courses for umich degrees 2025-01-02 17:26:39 -05:00
Sravan Balaji
668a89a276 Make portfolio + highlights a re-usable macro
- Use more generic metadata key names for portfolio
2025-01-02 17:06:27 -05:00
Sravan Balaji
f612212911 Add education section entries 2025-01-02 16:35:18 -05:00
Sravan Balaji
914636e5fe Change cards to accordion in bootstrap 5 2025-01-02 11:29:09 -05:00
Sravan Balaji
3431132901 Add dropdown toggles for navigation bar
- Fix styling for nav-link.active
2025-01-02 10:42:40 -05:00
Sravan Balaji
1798624bce Create macro for section heading
- Update layouts to use new macro
- Reformat some files
2025-01-02 10:25:18 -05:00
Sravan Balaji
40028ed830 Split portfolio template into partial sections 2025-01-02 10:10:57 -05:00
Sravan Balaji
6fe01ca1f8 Fix duplicate bootstrap causing strange issues 2025-01-02 10:07:04 -05:00
Sravan Balaji
a72c989a7d Add editorconfig and re-format navigation.html 2025-01-02 09:49:37 -05:00
Sravan Balaji
dd4671b7b8 Update navigation bar to work with bootstrap 5 2025-01-02 00:16:57 -05:00
Sravan Balaji
46db1fd2e0 Update dependencies and use new dark mode switch from bootstrap 2025-01-01 23:51:43 -05:00
Sravan Balaji
43157146e8 Migrate professional experience to templates 2025-01-01 23:14:13 -05:00
Sravan Balaji
c4eaa3d82b Update about page to use templates 2025-01-01 17:50:50 -05:00
Sravan Balaji
c37990b434 Update profile picture 2025-01-01 17:12:43 -05:00
Sravan Balaji
be269cf9b5 Fix filepath to style 2025-01-01 17:05:26 -05:00
Sravan Balaji
b21d04854e Reorganization and Data Files
- Use more template / partial features of 11ty by splitting
  up sections of code into separate files
- Change output directory to "dist"
- Use njk as the template engine
- Add data file for navigation links and site metadata
2025-01-01 16:28:21 -05:00
Sravan Balaji
2ebfb8ef48 Move common files into base template
- Copy assets and scripts folder to output
- Move contents of common files into the base template's HTML
- Fix link syntax on index.md
2025-01-01 13:50:36 -05:00
Sravan Balaji
fff17e62a1 Cleanup justfile and dockerfile
- Add a gitignore for output directory
- Make justfile use multi-lines for readability
- Remove COPY step from Dockerfile
2025-01-01 13:26:23 -05:00
Sravan Balaji
6808d71ca5 Basic 11ty config and index page with base layout 2024-12-31 13:26:07 -05:00
Sravan Balaji
91528d99a4 Initial migration to eleventy
- Add dockerfile to run eleventy from
- Add justfile to save useful commands
2024-12-31 12:40:10 -05:00
Sravan Balaji
ceea34cb51 Replace Google Drive PDF Viewer with Link to GitHub
- Google drive PDF viewer appears to be broken or
  unreliable now, so switched to a simple link
  to the GitHub repo
2024-04-19 11:24:48 -04:00
Sravan Balaji
b94cfbdf76 Change top level index redirection to relative path 2023-08-25 15:27:55 -04:00
Sravan Balaji
255d6b1920 April 2023 Update
- Update personal page with new devices, remove deprecated VS Code extensions, replace deprecated apps, add mechanical keyboard
- Update portfolio page with new jobs and move education to end
- Update images
2023-04-08 11:11:07 -04:00
Sravan Balaji
7fbedea388 Update Oryx Pro 7 Review
- Remove details about freezing / crashing and replace
  with solutions I found to resolve them
2022-07-01 22:16:18 -04:00
Sravan Balaji
f044b27a34 Update Windows to Linux Blog Post
- Add "Are We Anti-Cheat Yet?" website
- Update that oryx pro issues were resolved
  through suggestions on ArchWiki
2022-07-01 21:13:26 -04:00
Sravan Balaji
b10995bbef Ferdium and YouTube Vanced Updates
- Remove executable permission from logo-spotify.png
- Replace Ferdi with Ferdium in software section
  of personal page
- Replace ferdi logo with ferdium
- Update YouTube Vanced info with current status
  of project
2022-06-02 19:35:17 -04:00
Sravan Balaji
01298d0249 Associate Autonomous Systems Engineer at MITRE Update 2022-01-25 10:49:36 -05:00
Sravan Balaji
87f653243a Notion Enhancer Update
- Update link to notion enhancer website under notion
- Add notion-enhancer chrome extension link under vivaldi
2021-12-31 08:40:48 -05:00
Sravan Balaji
d8cc6f8ef6 End of Fall 2021 Semester Updates
- Add completion of Master's in Robotics to about
  and portfolio page and update GPA
- Add Autonomous Systems Engineer position to
  portfolio
- Add start/end days to all positions in case
  I need them for job applications
- Fix closing div position in portfolio page
- Add F1 to personal interests
- Remove Bootleg Football podcast
- Remove podcast authors from podcast title
- Update Football Weekly podcast description
- Add Missed Apex F1 podcast
2021-12-25 11:29:40 -05:00
Sravan Balaji
dbba94a679 Update Linux Related Blog Posts
- Update screenshot of dwm-flexipatch setup
- Add solution I found for system freezing on oryp7
- Replace "customizability" with "ArchWiki" in reasons for using Arch
2021-12-07 14:49:58 -05:00
Sravan Balaji
2973477f69 Add Bitwarden & Lutris to Software
- Re-order platforms in software section
  (Web, Linux, Windows, macOS, Android, iOS)
- Add list of browser extension I use for Vivaldi
- Add bitwarden and logo to software section
- Add lutris and logo to software section
2021-09-26 17:51:51 -04:00
Sravan Balaji
942040d68b Update Video Games Section
- Remove steam profile from video games section
- Add some paragraph text under favorite games section
- Add link to my Grouvee video game collection profile
- Change favorite game list to 3 columns style
- Add line breaks between platform images and list
- Update favorite video game list
2021-09-26 16:53:44 -04:00
Sravan Balaji
bc54bf81f7 Emacs & Update Video Games and Podcasts Lists
- Add emacs to software list
- Update VS Code description
- Update favorite video games list and order alphabetically
- Update favorite podcasts list and order alphabetically
- Update football weekly podcast image
2021-09-17 09:54:51 -04:00
126 changed files with 3958 additions and 3528 deletions

25
.editorconfig Normal file
View File

@@ -0,0 +1,25 @@
# EditorConfig is awesome: https://editorconfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = false
trim_trailing_whitespace = true
# JSON Files
[*.{json}]
indent_size = 2
# Markdown Files
[*.{md,mdx}]
trim_trailing_whitespace = false
# Web Files
[*.{html,js,css}]
indent_size = 2

64
.eleventy.js Normal file
View File

@@ -0,0 +1,64 @@
module.exports = function (eleventyConfig) {
eleventyConfig.addPassthroughCopy("./src/style.css");
eleventyConfig.addPassthroughCopy("./src/assets");
eleventyConfig.addPassthroughCopy("./src/scripts");
eleventyConfig.addFilter(
"findAssociation",
function (entries, associatedEntry) {
return entries.filter(function (entry) {
return entry.data.associatedEntry == associatedEntry;
});
},
);
eleventyConfig.addCollection("professionalExperience", (collection) => {
return collection
.getFilteredByGlob("./src/portfolio/professionalExperience/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) < Number(b.data.displayOrder) ? 1 : -1,
);
});
eleventyConfig.addCollection("education", (collection) => {
return collection
.getFilteredByGlob("./src/portfolio/education/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) < Number(b.data.displayOrder) ? 1 : -1,
);
});
eleventyConfig.addCollection("highlights", (collection) => {
return collection
.getFilteredByGlob("./src/portfolio/highlights/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) > Number(b.data.displayOrder) ? 1 : -1,
);
});
eleventyConfig.addCollection("software", (collection) => {
return collection
.getFilteredByGlob("./src/personal/software/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) > Number(b.data.displayOrder) ? 1 : -1,
);
});
eleventyConfig.addCollection("hardware", (collection) => {
return collection
.getFilteredByGlob("./src/personal/hardware/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) > Number(b.data.displayOrder) ? 1 : -1,
);
});
return {
markdownTemplateEngine: "njk",
dataTemplateEngine: "njk",
htmlTemplateEngine: "njk",
dir: {
input: "src",
output: "dist",
},
};
};

3
.envrc Normal file
View File

@@ -0,0 +1,3 @@
source_url "https://raw.githubusercontent.com/cachix/devenv/82c0147677e510b247d8b9165c54f73d32dfd899/direnvrc" "sha256-7u4iDd1nZpxL4tCzmPG0dQgC5V+/44Ba+tHkPob1v2k="
use devenv

15
.gitignore vendored Normal file
View File

@@ -0,0 +1,15 @@
# eleventy output
dist
# Devenv
.devenv*
devenv.local.nix
# direnv
.direnv
# pre-commit
.pre-commit-config.yaml
# NodeJS
node_modules/

103
devenv.lock Normal file
View File

@@ -0,0 +1,103 @@
{
"nodes": {
"devenv": {
"locked": {
"dir": "src/modules",
"lastModified": 1739444039,
"owner": "cachix",
"repo": "devenv",
"rev": "1235cd13f47df6ad19c8a183c6eabc1facb7c399",
"type": "github"
},
"original": {
"dir": "src/modules",
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1733328505,
"owner": "edolstra",
"repo": "flake-compat",
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"git-hooks": {
"inputs": {
"flake-compat": "flake-compat",
"gitignore": "gitignore",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1737465171,
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"git-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1733477122,
"owner": "cachix",
"repo": "devenv-nixpkgs",
"rev": "7bd9e84d0452f6d2e63b6e6da29fe73fac951857",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "rolling",
"repo": "devenv-nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"devenv": "devenv",
"git-hooks": "git-hooks",
"nixpkgs": "nixpkgs",
"pre-commit-hooks": [
"git-hooks"
]
}
}
},
"root": "root",
"version": 7
}

20
devenv.nix Normal file
View File

@@ -0,0 +1,20 @@
{ pkgs, lib, config, inputs, ... }:
{
# https://devenv.sh/packages/
packages = [
pkgs.git
pkgs.yaml-language-server
pkgs.typescript-language-server
pkgs.nodePackages.prettier
];
# https://devenv.sh/languages/
# languages.rust.enable = true;
languages.javascript = {
enable = true;
npm.enable = true;
npm.install.enable = true;
};
languages.nix.enable = true;
}

15
devenv.yaml Normal file
View File

@@ -0,0 +1,15 @@
# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json
inputs:
nixpkgs:
url: github:cachix/devenv-nixpkgs/rolling
# If you're using non-OSS software, you can set allowUnfree to true.
# allowUnfree: true
# If you're willing to use a package that's vulnerable
# permittedInsecurePackages:
# - "openssl-1.1.1w"
# If you have more than one devenv you can merge them
#imports:
# - ./backend

View File

@@ -1,7 +0,0 @@
<!--Dummy File to Redirect to index.html in Web Pages Folder-->
<head>
<meta
http-equiv="refresh"
content="0; url=https://sravanbalaji.com/src/index.html"
/>
</head>

22
justfile Normal file
View File

@@ -0,0 +1,22 @@
set shell := ["bash", "-c"]
PORT := "1280"
# List just commands by default
default:
@just --list
# Update development environment
update:
devenv update && \
npm update
# Run development server
dev:
npx @11ty/eleventy \
--serve \
--port={{ PORT }};
# Build static site files
build-site:
npx @11ty/eleventy

2201
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

5
package.json Normal file
View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"@11ty/eleventy": "latest"
}
}

28
src/_data/contact.json Normal file
View File

@@ -0,0 +1,28 @@
{
"items": [
{
"label": "Email",
"icon": "/assets/about/email.png",
"link": "mailto:balajsra@umich.edu",
"displayText": "balajsra@umich.edu"
},
{
"label": "LinkedIn",
"icon": "/assets/about/linkedin.png",
"link": "https://www.linkedin.com/in/sravan-balaji",
"displayText": "sravan-balaji"
},
{
"label": "GitHub",
"icon": "/assets/about/github.png",
"link": "https://github.com/balajsra",
"displayText": "balajsra"
},
{
"label": "YouTube",
"icon": "/assets/about/youtube.png",
"link": "https://www.youtube.com/channel/UC-xFJ4IKdogbpoQdQf2mgaA",
"displayText": "Sravan Balaji"
}
]
}

37
src/_data/navigation.json Normal file
View File

@@ -0,0 +1,37 @@
{
"items": [
{
"text": "About",
"url": "/about/",
"sections": [
"Bio",
"Contact Me"
]
},
{
"text": "Portfolio",
"url": "/portfolio/",
"sections": [
"Resume",
"Professional Experience",
"Education",
"Research"
]
},
{
"text": "Personal",
"url": "/personal/",
"sections": []
},
{
"text": "Blog",
"url": "/blog/",
"sections": []
},
{
"text": "Documentation",
"url": "/documentation/",
"sections": []
}
]
}

7
src/_data/site.json Normal file
View File

@@ -0,0 +1,7 @@
{
"author": "Sravan Balaji",
"url": "https://sravanbalaji.com",
"copyrightYear": 2019,
"licenseFile": "https://github.com/balajsra/sravanbalaji.com/blob/master/LICENSE",
"licenseName": "MIT License"
}

View File

@@ -0,0 +1,38 @@
<!doctype html>
{% extends "layouts/base.html" %}
{% from "macros.html" import sectionHeading %}
{% block content %}
<div class="container-fluid px-md-6">
{{ sectionHeading("Bio") }}
<div class="row align-items-center">
<div class="col-md-3">
<img
class="img-fluid mx-auto d-block"
src="{{ profilePicture }}"
/>
</div>
<div class="col-md-9">
{{ content | safe }}
</div>
</div>
{{ sectionHeading("Contact Me") }}
<div class="row align-items-center">
{% for item in contact.items %}
<div class="col-md-{{ 12//contact.items.length }} text-center">
<a href="{{ item.link }}" target="_blank">
<img
class="img-fluid mx-auto d-block"
width=50%
alt="{{ item.label }}"
src="{{ item.icon }}"
/>
</a>
<p><br /><b>{{ item.label }}:</b> {{ item.displayText }}</p>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,15 @@
<!doctype html>
<html lang="en" color-mode="light">
<head>
{% include "partials/site-head.html" %}
{% include "partials/navigation.html" %}
</head>
<body>
<main tabindex="-1" id="main-content">{% block content %}{% endblock %}</main>
</body>
<footer>
{% include "partials/footer.html" %}
</footer>
</html>

View File

@@ -0,0 +1,14 @@
<!doctype html>
{% extends "layouts/base.html" %}
{% from "macros.html" import sectionHeading %}
{% block content %}
<div class="container-fluid px-md-6">
{{ sectionHeading("Welcome") }}
<div class="row align-items-center">
<div class="col-md-12">
{{ content | safe }}
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,8 @@
<!doctype html>
{% extends "layouts/base.html" %}
{% block content %}
<div class="container-fluid px-md-6">
{% include "partials/software.html" %}
{% include "partials/hardware.html" %}
</div>
{% endblock %}

View File

@@ -0,0 +1,10 @@
<!doctype html>
{% extends "layouts/base.html" %}
{% block content %}
<div class="container-fluid px-md-6">
{% include "partials/resume.html" %}
{% include "partials/professionalExperience.html" %}
{% include "partials/education.html" %}
<!-- {% include "partials/research.html" %} -->
</div>
{% endblock %}

79
src/_includes/macros.html Normal file
View File

@@ -0,0 +1,79 @@
<!doctype html>
{% macro sectionHeading(name) %}
<div class="row align-items-center">
<div class="col-md-12">
<h1>
<a name="{{ name | slugify }}">{{ name }}</a>
</h1>
</div>
</div>
{% endmacro %}
{% macro portfolioWithHighlights(portfolio, highlights) %}
{% for entry in portfolio %}
<div class="row">
<div class="col-md-6">
<div class="row">
<div class="col-md-4">
<a href="{{ entry.data.url }}" target="_blank">
<img
class="img-fluid mx-auto d-block"
width="100%"
src="{{ entry.data.logo }}"
/>
</a>
</div>
<div class="col-md-8">
<h2><b>{{ entry.data.association }}</b></h2>
<h3>{{ entry.data.entryTitle }}</h3>
<h4>{{ entry.data.location }}</h4>
<h5><i>{{ entry.data.startDate }} - {{ entry.data.endDate }}</i></h5>
{{ entry.content | safe }}
</div>
</div>
</div>
{% set associatedHighlights = (highlights | findAssociation(entry.data.id)) %}
{% if associatedHighlights.length > 0 %}
<div class="col-md-6">
<div class="accordion accordion-flush" id="{{ entry.data.id }}">
{% for highlight in associatedHighlights %}
{% set highlightSlug = (entry.data.id + '-' + highlight.data.name | slugify) %}
<div class="accordion-item">
<div class="accordion-header"">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#{{ highlightSlug }}">
<b>{{ highlight.data.name }}</b>
</button>
</div>
<div id="{{ highlightSlug }}" class="accordion-collapse collapse" data-bs-parent="#{{ entry.data.id }}">
<div class="accordion-body">
{{ highlight.content | safe }}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{% endif %}
</div>
{% endfor %}
{% endmacro %}
{% macro personalItems(personal) %}
{% for entry in personal %}
<div class="row">
<div class="col-md-2">
<a href="{{ entry.data.url }}" target="_blank">
<img
class="img-fluid mx-auto d-block"
width="50%"
src="{{ entry.data.logo }}"
/>
</a>
</div>
<div class="col-md-10">
<h2><b>{{ entry.data.category }}: <a href="{{ entry.data.url }}" target="_blank">{{ entry.data.name }}</a></b></h2>
{{ entry.content | safe }}
</div>
</div>
{% endfor %}
{% endmacro %}

View File

@@ -0,0 +1,6 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Education") }}
{% from "macros.html" import portfolioWithHighlights %}
{{ portfolioWithHighlights(collections.education, collections.highlights) }}

View File

@@ -0,0 +1,15 @@
<!doctype html>
<div class="container-fluid px-md-6">
<div class="row align-items-center">
<div class="col-md-12">
<small>
Copyright &copy; {{ site.copyrightYear }} {{ site.author }} under
<a
rel="license"
href="{{ site.licenseFile }}"
target="_blank"
>{{ site.licenseName }}</a>
</small>
</div>
</div>
</div>

View File

@@ -0,0 +1,6 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Hardware") }}
{% from "macros.html" import personalItems %}
{{ personalItems(collections.hardware) }}

View File

@@ -0,0 +1,48 @@
<!doctype html>
<header role="banner" class="site-head">
<nav class="navbar my-nav navbar-expand-md fixed-top">
<div class="container-fluid">
<!-- Brand -->
<a class="navbar-brand" href="/">
<img src="/assets/branding/logo.png" alt="Icon" width="30px" height="30px"
class="d-inline-block align-top" />
<img src="/assets/branding/name.png" alt="Name" height="30px" class="d-inline-block align-center" />
</a>
<!-- Toggler/collapsible Button -->
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarToggler">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar links -->
<div class="collapse navbar-collapse" id="navbarToggler">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
{% for item in navigation.items %}
{% if item.sections.length > 0 %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" id="{{ item.text | slugify }}" role="button" data-bs-toggle="dropdown" href="{{ item.url }}"><b>{{ item.text }}</b></a>
<ul class="dropdown-menu">
{% for section in item.sections %}
<li><a class="dropdown-item" href="{{ item.url }}#{{ section | slugify }}">{{ section }}</a></li>
{% endfor %}
</ul>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{{ item.url }}"><b>{{ item.text }}</b></a>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
<!-- Dark Mode Toggle -->
<!-- Reference: https://github.com/coliff/dark-mode-switch -->
<div class="form-check form-switch">
<input type="checkbox" class="form-check-input" id="darkSwitch" />
<label class="form-check-label" for="darkSwitch" id="darkSwitchLabel">Dark Mode</label>
</div>
<script src="/scripts/dark-mode-switch.min.js"></script>
</div>
</nav>
</header>

View File

@@ -0,0 +1,6 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Professional Experience") }}
{% from "macros.html" import portfolioWithHighlights %}
{{ portfolioWithHighlights(collections.professionalExperience, collections.highlights) }}

View File

@@ -0,0 +1,3 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Research") }}

View File

@@ -0,0 +1,16 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Resume") }}
<div class="row align-items-center">
<div class="col-md-12">
<p>
The latest version of my resume is hosted on
<a
href="https://github.com/balajsra/resume/blob/master/sravan_balaji_resume.pdf"
target="_blank"
>GitHub</a
>.
</p>
</div>
</div>

View File

@@ -0,0 +1,33 @@
<!doctype html>
<!--Required meta tags-->
<meta charset="utf-8" />
<meta name="author" content="{{ site.author }}" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Bootstrap -->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js"
integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy"
crossorigin="anonymous"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<!-- jQuery -->
<script src="https://code.jquery.com/jquery-3.7.1.slim.min.js"
integrity="sha256-kmHvs0B+OpCW5GVHUNjv9rOmY0IvSIRcf7zGUDTDQM8=" crossorigin="anonymous"></script>
<!-- highlight.js -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/default.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
<!-- Stylesheet -->
<link rel="stylesheet" type="text/css" href="/style.css" />
<!-- Favicon -->
<link rel="icon" href="/assets/branding/favicon.ico" type="image/x-icon" />
<!-- Title -->
<title>{{ title }}</title>

View File

@@ -0,0 +1,6 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Software") }}
{% from "macros.html" import personalItems %}
{{ personalItems(collections.software) }}

View File

@@ -1,175 +0,0 @@
<!DOCTYPE html>
<html lang="en" color-mode="light">
<head>
<script
language="javascript"
type="text/javascript"
src="common/header.txt"
></script>
<title>About</title>
</head>
<script
language="javascript"
type="text/javascript"
src="common/navbar.txt"
></script>
<body>
<div class="container-fluid px-md-6">
<!---------------------------------
BIO
----------------------------------->
<div id="bio">
<div class="row align-items-center">
<div class="col-md-12">
<h1><a name="bio">Bio</a></h1>
</div>
</div>
<div class="row align-items-center">
<div class="col-md-3">
<img
class="img-fluid mx-auto d-block"
src="./assets/about/profile_picture.jpg"
/>
</div>
<div class="col-md-9">
<p>
Sravan Balaji graduated from the
<a href="https://umich.edu" target="_blank"
>University of Michigan</a
>
with dual B.S.E.'s in
<a href="https://me.engin.umich.edu/" target="_blank"
>Mechanical Engineering</a
>
and
<a href="https://cse.engin.umich.edu/" target="_blank"
>Computer Science</a
>
in December 2020. He was admitted to the
<a href="https://umich.edu" target="_blank"
>University of Michigan</a
>
<a href="https://robotics.umich.edu/" target="_blank"
>Robotics Institute</a
>
for the Winter 2021 semester where he is currently pursuing an
M.S. in Robotics with an expected graduation of December 2021.
</p>
<p>
Sravan worked as a Graduate Navigation Intern at
<a href="https://www.mitre.org/" target="_blank">MITRE</a>
during summer 2021. You can learn more about this and his other
work experiences in the
<a href="./portfolio.html#professional_experience"
>professional experience</a
>
section of the
<a href="./portfolio.html">portfolio</a> page. He will be
returning to
<a href="https://www.mitre.org/" target="_blank">MITRE</a>
as an Associate Autonomous Systems Engineer in late January 2022.
</p>
<p>
Sravan's professional and academic interests are in controls,
motion planning, robotic perception & manipulation, autonomous &
connected vehicles, software development, and GNU/Linux among
other things. His personal interests include video games,
podcasts, music, cooking, football, soccer, and productivity
software.
</p>
</div>
</div>
<div class="row align-items-center">
<div class="col-md-12">
<h1><a name="contact_me">Contact Me</a></h1>
</div>
</div>
<div class="row align-items-center">
<div class="col-md-12">
<p>
Feel free to reach out to me via email if you have any questions
about my website, college education, professional experience, or
anything else. If you have suggestions for the website or would
like to see the source files, check out my
<a
href="https://github.com/balajsra/sravanbalaji.com"
target="_blank"
>
GitHub repository</a
>. If you would like to connect with me on LinkedIn, use the link
below. I will do my best to respond to any communication in a
timely manner. Finally, check out my YouTube channel if you are
interested in some of the projects I have worked on.
</p>
</div>
</div>
</div>
<!---------------------------------
CONTACT ME
----------------------------------->
<div id="contact_me">
<div class="row align-items-center">
<div class="col-md-3 text-center">
<a href="mailto:balajsra@umich.edu" target="_blank">
<img
class="img-fluid mx-auto d-block"
alt="Email"
src="./assets/about/email.png"
/>
</a>
<p><br /><b>Email:</b> balajsra@umich.edu</p>
</div>
<div class="col-md-3 text-center">
<a
href="https://www.linkedin.com/in/sravan-balaji/"
target="_blank"
>
<img
class="img-fluid mx-auto d-block"
alt="LinkedIn"
src="./assets/about/linkedin.png"
/>
</a>
<p><br /><b>LinkedIn:</b> sravan-balaji</p>
</div>
<div class="col-md-3 text-center">
<a href="https://github.com/balajsra" target="_blank">
<img
class="img-fluid mx-auto d-block"
alt="GitHub"
src="./assets/about/github.png"
/>
</a>
<p><br /><b>GitHub:</b> balajsra</p>
</div>
<div class="col-md-3 text-center">
<a
href="https://www.youtube.com/channel/UC-xFJ4IKdogbpoQdQf2mgaA"
target="_blank"
>
<img
class="img-fluid mx-auto d-block"
alt="YouTube"
src="./assets/about/youtube.png"
/>
</a>
<p><br /><b>YouTube:</b> Sravan Balaji</p>
</div>
</div>
</div>
</div>
</body>
<footer>
<script
language="javascript"
type="text/javascript"
src="common/footer.txt"
></script>
</footer>
</html>

11
src/about.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: About
layout: "layouts/about.html"
profilePicture: "/assets/about/profile_picture.jpg"
---
Sravan Balaji completed his undergraduate and graduate degrees at the [University of Michigan, Ann Arbor](https://umich.edu). He earned dual B.S.E.'s in [Mechanical Engineering](https://me.engin.umich.edu) and [Computer Science](https://cse.engin.umich.edu) in December 2020 and an M.S. in [Robotics](https://robotics.umich.edu) in December 2021.
Sravan worked as a Graduate Navigation Intern at [MITRE](https://www.mitre.org) during summer 2021. You can learn more about this and his other work experiences in the [professional experience](/portfolio#professional_experience) section of the [portfolio](/portfolio) page. He later returned to [MITRE](https://www.mitre.org) full-time to work as an Autonomous Systems Engineer in McLean, VA. He currently works at [Metron](https://metsci.com) as a Software Engineer in Reston, VA.
Sravan's professional and academic interests are in controls, motion planning, robotic perception & manipulation, autonomous & connected vehicles, software development, and GNU/Linux among other things. His personal interests include video games, podcasts, music, cooking, football, soccer, formula 1, and productivity software.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 KiB

After

Width:  |  Height:  |  Size: 796 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 946 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
<g id="Logo" transform="matrix(13.3662,0,0,13.3662,20.0535,18.5803)">
<g id="Background-Circle" serif:id="Background Circle" transform="matrix(0.707107,0.707107,-0.707107,0.707107,36.0061,-14.8263)">
<path d="M35.9,71.5C16.3,71.5 0.4,55.6 0.4,36C0.4,16.4 16.3,0.6 35.9,0.6C55.5,0.6 71.4,16.5 71.4,36.1C71.4,55.7 55.5,71.5 35.9,71.5Z" style="fill:url(#_Linear1);fill-rule:nonzero;stroke:white;stroke-width:2.5px;"/>
</g>
<g id="Lower-beard" serif:id="Lower beard" transform="matrix(0.0748156,0,0,0.0748156,-1.50032,-1.39009)">
<path d="M503.642,629.673C527.496,629.947 576.943,631.918 581,640C594.482,666.859 531.448,825.299 503.284,841.639L503.282,843C502.598,843 501.881,842.874 501.133,842.629C500.391,842.874 499.679,843 499,843L498.998,841.659C470.575,825.433 406.168,666.87 419.745,640C423.831,631.913 474.528,629.944 498.642,629.673L498.642,629.638C499.424,629.64 500.255,629.644 501.132,629.65C502.017,629.644 502.855,629.64 503.642,629.638L503.642,629.673Z" style="fill:white;"/>
</g>
<g id="Upper-beard" serif:id="Upper beard" transform="matrix(0.0748156,0,0,0.0748156,-1.50032,-1.39009)">
<path d="M498.733,357.203C547.473,355.78 574.716,313.221 627.233,336.042C700.337,367.808 723.258,456.308 806.959,474.341C838.428,481.121 857.323,456.253 877.092,437.581C883.524,431.506 893.049,418.562 896.807,419.813C900.441,421.022 900.267,433.842 898.85,440.69C896.129,453.836 892.451,467.441 884.685,478.393C874.137,493.269 860.132,505.776 845.238,516.299C802.136,546.753 740.569,558.817 688.631,557.703C652.806,556.934 612.989,546.685 579.942,534.342C549.791,523.08 533.28,483.381 498.234,482.887C463.111,483.381 446.563,523.08 416.345,534.342C383.226,546.685 343.32,556.934 307.416,557.703C255.363,558.817 193.659,546.753 150.461,516.299C135.535,505.776 121.498,493.269 110.927,478.393C103.144,467.441 99.458,453.836 96.731,440.69C95.311,433.842 95.136,421.022 98.778,419.813C102.545,418.562 112.091,431.506 118.537,437.581C138.35,456.253 157.286,481.121 188.826,474.341C272.712,456.308 295.684,367.808 368.949,336.042C421.583,313.221 449.854,355.78 498.733,357.203Z" style="fill:rgb(254,254,254);fill-rule:nonzero;"/>
</g>
</g>
<defs>
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(71,0,0,70.9,0.4,36.05)"><stop offset="0" style="stop-color:rgb(206,159,252);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(115,103,240);stop-opacity:1"/></linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

View File

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024">
<path fill="#3a76f0" d="M0,0v1024h1024V0H0z"/>
<path fill="#ffffff" d="M427.5,170.3l7.9,32A319.6,319.6,0,0,0,347,238.9l-16.9-28.3A347.6,347.6,0,0,1,427.5,170.3Zm169,0-7.9,32A319.6,319.6,0,0,1,677,238.9l17.1-28.3A350.1,350.1,0,0,0,596.5,170.3ZM210.6,330a349.5,349.5,0,0,0-40.3,97.5l32,7.9A319.6,319.6,0,0,1,238.9,347ZM193,512a318.5,318.5,0,0,1,3.6-47.8l-32.6-5a352,352,0,0,0,0,105.5l32.6-4.9A319.5,319.5,0,0,1,193,512ZM693.9,813.3,677,785.1a317.8,317.8,0,0,1-88.3,36.6l7.9,32A350.3,350.3,0,0,0,693.9,813.3ZM831,512a319.5,319.5,0,0,1-3.6,47.8l32.6,4.9a352,352,0,0,0,0-105.5l-32.6,5A318.5,318.5,0,0,1,831,512Zm22.7,84.4-32-7.9A319,319,0,0,1,785.1,677l28.3,17A348.9,348.9,0,0,0,853.7,596.4Zm-293.9,231a319.1,319.1,0,0,1-95.6,0L459.3,860a351.3,351.3,0,0,0,105.4,0Zm209-126.2a318.1,318.1,0,0,1-67.6,67.5l19.6,26.6A355.1,355.1,0,0,0,795.4,721Zm-67.6-446a318.6,318.6,0,0,1,67.6,67.6L795.4,303A354.6,354.6,0,0,0,721,228.6Zm-446,67.6a318.6,318.6,0,0,1,67.6-67.6L303,228.6A354.6,354.6,0,0,0,228.6,303ZM813.4,330l-28.3,17a317.8,317.8,0,0,1,36.6,88.3l32-7.9A348.9,348.9,0,0,0,813.4,330ZM464.2,196.6a319.1,319.1,0,0,1,95.6,0l4.9-32.6a351.3,351.3,0,0,0-105.4,0ZM272.1,804.1,204,819.9l15.9-68.1-32.1-7.5-15.9,68.1a33,33,0,0,0,24.6,39.7,34.5,34.5,0,0,0,15,0l68.1-15.7Zm-77.5-89.2,32.2,7.4,11-47.2a316.2,316.2,0,0,1-35.5-86.6l-32,7.9a353.3,353.3,0,0,0,32.4,83.7Zm154,71.4-47.2,11,7.5,32.2,34.7-8.1a349,349,0,0,0,83.7,32.4l7.9-32a316.7,316.7,0,0,1-86.3-35.7ZM512,226c-158,.1-285.9,128.2-285.9,286.1a286.7,286.7,0,0,0,43.9,152L242.5,781.5,359.8,754c133.7,84.1,310.3,44,394.4-89.6S798.3,354.2,664.7,270A286.7,286.7,0,0,0,512,226s"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

0
src/assets/software/logo-spotify.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

View File

@@ -26,7 +26,7 @@
<h1>System76 Oryx Pro 7 Review</h1>
<!-- Author & Date/Time -->
<p class="lead">Updated on August 27, 2021</p>
<p class="lead">Updated on July 1, 2022</p>
<!-- Preview Image -->
<div class="blog-cover">
@@ -115,12 +115,12 @@
<h2><a name="upgradeability">Upgradeability</a></h2>
<p>
I ended up purchasing the Oryx Pro 7 with base memory and storage,
then upgraded these components with parts I bought from Amazon. The
upgrade experience was pretty good. Removing the bottom cover just
involves removing a bunch of screws, nothing too difficult. I had a
little trouble with this because one of the screws seemed to get
stuck, but I eventually got it out. The
I ended up purchasing the Oryx Pro 7 with base memory and storage in
March of 2021, then upgraded these components with parts I bought
from Amazon. The upgrade experience was pretty good. Removing the
bottom cover just involves removing a bunch of screws, nothing too
difficult. I had a little trouble with this because one of the
screws seemed to get stuck, but I eventually got it out. The
<a
href="https://tech-docs.system76.com/models/oryp7/repairs.html"
target="_blank"
@@ -137,52 +137,26 @@
>
</h2>
<p>
Regarding OS, I initially tried to install Arch Linux with dwm like
I had on my desktop, but found that switching between the graphics
modes (i.e. Integrated, Hybrid, and Discrete) was just a nightmare.
I tried installing
<a
href="https://aur.archlinux.org/packages/system76-power/"
target="_blank"
>System76 software through the AUR</a
>, but could never get it working reliably. Additionally, the laptop
speakers did not seem to work out of the box. I eventually got the
audio working thanks to the
<a
href="https://wiki.archlinux.org/title/System76_Oryx_Pro#Audio"
target="_blank"
>solution in the ArchWiki</a
>, but I ultimately decided to switch to Pop!_OS because of the
graphics switching issue. The main change I made to the default
Pop!_OS install process was to use
<a
href="https://btrfs.wiki.kernel.org/index.php/Main_Page"
target="_blank"
>btrfs</a
>
rather than the default (ext4 I think) so I could take snapshots and
backup my data with
<a href="https://github.com/teejee2008/timeshift" target="_blank"
>Timeshift</a
>.
</p>
<p>
My experience with Pop!_OS was very positive. I'm really happy that
System76 and Pop!_OS have come up with a good solution for
switchable graphics. Being able to just click on the option in the
GNOME menu is so useful. The window management in Pop!_OS's
I initially decided to give
<a href="https://pop.system76.com/" target="_blank">Pop!_OS</a> a
chance since it came pre-installed on the Oryx Pro and was developed
by System76. My experience was very positive. I'm really happy that
System76 and Pop!_OS have come up with a good and reliable solution
for switching between the integrated graphics and discrete NVIDIA
graphics. Being able to just click on the option in the GNOME menu
is so useful. The window management in Pop!_OS's
<a href="https://github.com/pop-os/cosmic" target="_blank"
>COSMIC</a
>
desktop environment is very good too. Coming from a standalone
tiling window manager like dwm, this provides a pretty good balance
between convenience and usability.
tiling window manager like dwm, I found that this provides a pretty
good balance between convenience and usability.
</p>
<p>
After some more time with Pop!_OS, I realized that I really missed
the package management, customizability, and rolling release of
Arch. Since I couldn't get Arch working before, I decided to try
some other Arch based distros like
Arch. For the longest time, I couldn't get Arch working reliably, so
I decided to try some other Arch based distros like
<a href="https://manjaro.org/" target="_blank">Manjaro</a>
and
<a href="https://garudalinux.org/" target="_blank">Garuda</a>. With
@@ -191,28 +165,96 @@
href="https://aur.archlinux.org/packages/system76-power/"
target="_blank"
>system76-power AUR package</a
>, now works. I eventually decided on Garuda because it implements a
lot of the customizations I usually do in my vanilla Arch installs
anyways (e.g. btrfs, zen kernel, chaotic-aur, backups w/ timeshift,
easy options to enable gaming tweaks, etc.). The
<a href="https://www.gnome.org/" target="_blank">GNOME</a>
edition immediately ran into crashing and system break issues, so I
tried the KDE Dragonized edition. It looks pretty nice and uses
<a href="https://kde.org/plasma-desktop/" target="_blank"
>KDE plasma</a
>) works very well. I eventually decided on Garuda because it
implements a lot of the customizations I usually do in my vanilla
Arch installs anyways (e.g., btrfs, zen kernel, chaotic-aur, backups
w/ timeshift, easy options to enable gaming tweaks, etc.).
</p>
<p>
Later, I started noticing some issues with suspending and
hibernating as well as switching graphics. I couldn't rely on my
laptop to stay awake or suspend when I expected it to. Sometimes the
computer would just freeze up randomly and I would need to hard
reboot. It seemed that there was something interfering with the
graphics card. This is when I noticed that the
<a
href="https://wiki.archlinux.org/title/System76_Oryx_Pro"
target="_blank"
>Oryx Pro ArchWiki page</a
>
instead of GNOME. After still encountered freezing issues, I
switched to the
<a href="https://i3wm.org/" target="_blank">i3</a>
edition, but replaced i3 with
<a href="https://xmonad.org/" target="_blank">Xmonad</a>
because I was experimenting with it at the time. After realizing
that Xmonad would not really fit my needs (mainly gaming), I
replaced it with
<a href="https://github.com/bakkeby/dwm-flexipatch" target="_blank"
>dwm-flexipatch</a
>. Now, performance is amazing and I haven't encountered the major
freezing issues that I had with GNOME and KDE.
had been updated and I noticed an
<a
href="https://github.com/pop-os/system76-power/issues/299"
target="_blank"
>issue on GitHub</a
>. These finally led me to a stable install with Arch Linux.
</p>
<p>
Install the following packages from the
<a href="https://aur.archlinux.org/" target="_blank">AUR</a>:
</p>
<ul>
<li>system76-dkms</li>
<li>system76-acpi-dkms</li>
<li>system76-io-dkms</li>
<li>system76-driver</li>
<li>system76-power</li>
<li>system76-firmware-daemon</li>
<li>system76-firmware</li>
<li>firmware-manager</li>
</ul>
<p>
Then add your user to the <code>adm</code> group and enable the
following services:
</p>
<ul>
<li><code>sudo gpasswd -a $USER adm</code></li>
<li><code>sudo systemctl enable --now system76</code></li>
<li>
<code>sudo systemctl enable --now system76-firmware-daemon</code>
</li>
<li>
<code
>sudo systemctl enable --now
com.system76.PowerDaemon.service</code
>
</li>
</ul>
<p>
Finally, disable the Power Profiles Daemon which was interfering
with system76-power and enable the NVIDIA services for suspending
(and optionally hibernating & resuming if you want that):
</p>
<ul>
<li><code>sudo systemctl mask power-profiles-daemon</code></li>
<li>
<code
>sudo systemctl enable nvidia-{suspend,resume,hibernate}</code
>
</li>
</ul>
<p>
To get the speakers working, you will probably need to create a file
called <code>/etc/modprobe.d/clevo-p950.conf</code> and put the
following inside:
<code>options snd-hda-intel model=clevo-p950</code>.
</p>
<p>
If you encounter any other issues, be sure to check out the
<a
href="https://wiki.archlinux.org/title/System76_Oryx_Pro"
target="_blank"
>Oryx Pro ArchWiki page</a
>.
</p>
<p>
Now your laptop should be able to run Arch with all the same
graphics switching goodness and functional speakers of Pop!_OS
without any of the random freezing or crashing!
</p>
<hr />
@@ -239,11 +281,10 @@
>.
</li>
<li>
Gaming performance is amazing! Recently got Yakuza: Like a Dragon
on Steam. It runs at around 70 to 80 fps with all the settings
turned up to the max. I love that I can use my favorite operating
system without having to compromise too much on gaming
performance.
Gaming performance is amazing! I can run Yakuza: Like a Dragon at
around 70 or 80 fps with all the settings turned up to the max. I
love that I can use my favorite operating system without having to
compromise too much on gaming performance.
</li>
<li>
Love the keyboard backlighting and color changing on the fly.
@@ -278,8 +319,8 @@
<li>
Speakers are really sub-par. I understand that System76 doesn't
design the hardware, but this was my main disappointment. I have
bluetooth bookshelf speakers and bluetooth headphones I can use,
so this isn't an unsolvable problem, but just generally annoying.
external bookshelf speakers and bluetooth headphones I can use, so
this isn't an unsolvable problem, but just generally annoying.
</li>
<li>
Webcam is functional, but not good at all. Definitely need to use
@@ -297,25 +338,14 @@
Battery life is really bad when the discrete graphics card is on
(as expected). Maybe a little more than an hour a time, sometimes
more depending on how willing I am to lower CPU frequency and
stuff. As a desktop replacement, that is to be expected through.
stuff. As a desktop replacement type laptop, that is to be
expected through.
</li>
<li>
Mouse click buttons are not great. Regularly left click on
something in GNOME and nothing happens. "Tapping" with the
mousepad works very reliably though.
</li>
<li>
Fans can get really loud at times, especially when gaming. I often
have to turn up my speakers or wear noise cancelling headphones.
This is an understandable limitation with gaming laptops though.
Using a custom kernel solved a lot of my complaints with the
thermals and fan noise though. Now the fans don't turn on as
often. When they do, they don't ramp up to the maximum speed, so
noise is kept to a reasonable level.
</li>
<li>
Random freezing is kind of an issue, but is generally resolved by
using a custom kernel.
Fans can get really loud at times, especially when pushing the GPU
in games. I often have to turn up my speakers or wear noise
cancelling headphones. This is an understandable physical
limitation of thin and light gaming laptops though.
</li>
<li>
While the display itself is great, I really wish the hinge would
@@ -330,16 +360,19 @@
<h2><a name="conclusions">Conclusions</a></h2>
<p>
It may seem that the cons outweigh the pros, but this is only in
number and because I am really nitpicking. The things this laptop
get right (e.g. gaming, refresh rate, switchable graphics, general
performance) are much more important to me than the other things.
Regarding price, you are definitely paying a premium for first-class
linux support, but it is well worth it in my opinion. I do not want
to use Windows anymore and I am happy to pay extra if it means
supporting a company that promotes and sells Linux computers and
having a device that can be easily upgraded down the line. Overall,
I am very happy with my purchase.
It may seem that the cons outweigh the pros, but this is only
because I am really nitpicking. The things this laptop gets right
(e.g., gaming, refresh rate, switchable graphics, general
performance) are much more important to me than the other things
(e.g., mic / webcam quality). Regarding price, you are definitely
paying a premium for first-class linux support, but it is well worth
it in my opinion. I do not want to use Windows anymore and I am
happy to pay extra if it means supporting a company that promotes
and sells Linux computers and having a device that can be easily
upgraded down the line. Overall, I am very happy with my purchase.
Especially now that I have a stable installation of Arch Linux that
has all the functionality I expect without random freezing or
crashing.
</p>
<hr />

View File

@@ -26,7 +26,7 @@
<h1>Switching from Windows to Linux</h1>
<!-- Author & Date/Time -->
<p class="lead">Updated on August 27, 2021</p>
<p class="lead">Updated on July 1, 2022</p>
<!-- Preview Image -->
<div class="blog-cover">
@@ -62,11 +62,11 @@
<p>
Development is definitely where Linux shines because of its superior
package management. For example, Ubuntu (and its derivatives) use
the apt package manager which allows you to easily install most
development packages like Python, gcc, Git, etc. On Windows, you
have to go to a website, click on a download link, run an
executable, and walk through the steps in an installer. On Linux, it
is as simple as a couple terminal commands. There's a reason even
the <code>apt</code> package manager which allows you to easily
install most development packages like Python, gcc, Git, etc. On
Windows, you have to go to a website, click on a download link, run
an executable, and walk through the steps in an installer. On Linux,
it is as simple as a couple terminal commands. There's a reason even
Microsoft felt it needed to improve the developer experience on
Windows via the
<a
@@ -112,14 +112,25 @@
work by just pressing the play button, possibly with a few tweaks.
After trying this out myself, I have come to the same conclusion.
Gaming on Linux is as good as it has ever been and will only get
better, especially after the announcement and release of the Linux
powered
better, especially after the launch of the SteamOS 3.0 powered
<a href="https://store.steampowered.com/steamdeck" target="_blank"
>Steam Deck</a
>
from Valve. If you play a lot of online multiplayer games, you may
need to wait as popular anti-cheat software doesn't currently work
through Proton.
from Valve.
</p>
<p>
If you play a lot of online multiplayer games, you may need to wait.
Not all anti-cheat software currently works through Proton.
<a href="https://areweanticheatyet.com" target="_blank"
>Are We Anti-Cheat Yet?</a
>
provides "a comprehensive and crowd-sourced list of games using
anti-cheats and their compatibility with GNU/Linux or Wine/Proton".
<a href="https://www.ea.com/games/apex-legends" target="_blank"
>Apex Legends</a
>
is one notable example that enabled Linux support for Easy
Anti-Cheat shortly after the launch of the Steam Deck.
</p>
<hr />
@@ -136,16 +147,15 @@
like the best option because I could literally build my OS from the
ground up. I essentially have complete control over which packages
get installed on my system. This means there is a steep learning
curve and things can break if you are not careful, but the
<a href="https://wiki.archlinux.org" target="_blank">ArchWiki</a>
is possibly the greatest Linux resource I have ever seen. The main
reasons I decided on Arch are:
curve and things can break if you are not careful. If you can get
over the initial difficulties, you will find an amazing Linux
desktop experience. The main reasons I decided on Arch are:
</p>
<ul>
<li>
<b>Rolling Release</b>: I don't have to re-install my OS every 6
months. My system and the kernel get updated through my package
manager.
months. My system and the kernel get updated through a simple
package manager command.
</li>
<li>
<b>Package Management</b>: Pacman and AUR helpers (e.g.
@@ -164,21 +174,30 @@
<a href="https://snapcraft.io" target="_blank">snap</a>,
<a href="flathub" target="_blank">flatpak</a>, or
<a href="https://appimage.org" target="_blank">AppImage</a>. While
these are great in that they can run on any Linux distro, they
don't integrate into the system as well as I would like. AppImages
have to be updated manually and don't integrate well with the
desktop experience by default. Flatpaks are sandboxed
applications, which means they require manual intervention to
access certain parts of the OS. The main issue I found here was
with theming. For lots of open source applications, they may not
have a snap, flatpak, or AppImage package, but they almost always
have an AUR package. This means it is extremely rare to have to
manually install any application or program on my system.
these universal package formats are great in that they can run on
any Linux distro, they don't integrate into the system as well as
I would like. AppImages have to be updated manually and don't
integrate well with the desktop experience by default. Flatpaks
are sandboxed applications, which means they require manual
intervention to access certain parts of the OS. The main issue I
found here was with theming. For lots of open source applications,
they may not have a snap, flatpak, or AppImage package, but they
almost always have an AUR package. This means it is extremely rare
to have to manually install any application or program on my
system.
</li>
<li>
<b>Customizability</b>: Everything on my system was either
installed by me or a dependency for something I installed. There
is little to no bloatware.
<b>ArchWiki</b>: The
<a href="https://wiki.archlinux.org/" target="_blank">ArchWiki</a>
is by far the best source of linux documentation I have found on
the internet. It has clear and well written information on pretty
much any topic you may be interested in and any issue you may
encounter. On other distros, you generally have to resolve issues
yourself or search for solutions on random message boards without
really understanding what the different components of your OS do.
By reading the ArchWiki, I feel like I have gained a much better
understanding of how my computer works and how to approach
resolving any issues I may have.
</li>
</ul>
<p>
@@ -198,17 +217,9 @@
href="https://wiki.archlinux.org/title/System76_Oryx_Pro"
target="_blank"
>page for the System76 Oryx Pro</a
>. Unfortunately, I had some issue with NVIDIA's Linux drivers and
<a href="https://github.com/pop-os/system76-power" target="_blank"
>System76's graphics switching tool</a
>
on Arch. I was able to resolve the issue by switching to
<a href="https://garudalinux.org" target="_blank">Garuda Linux</a>,
which is based on Arch, but provides an easy to use installer and
some nice GUI tools for configuring your system. As of the time of
writing, I don't see myself switching from Garuda because it
provides all the benefits of Arch without the initial hassle of
installing the system from scratch.
>. By following the suggestions there, I was able to resolve issues
like the audio not working, graphics switching, suspend/hibernate,
etc.
</p>
<hr />
@@ -227,9 +238,8 @@
from Windows, I was much more comfortable with the look and feel of
KDE Plasma. Additionally, it has many (perhaps too many)
customizability options. After using this for a while, I eventually
ran into some system freezing issues that I didn't expect to see
given my hardware and felt that I could go for something a bit more
minimal.
felt that I wanted something more minimal that I could tweak exactly
to my liking.
</p>
<hr />
@@ -256,8 +266,7 @@
my needs. One of the main downsides of dwm is that it is meant to be
super minimal where features you might expect to see need to be
added through patches. The process of patching can be slow,
annoying, and prone to error. One solution, that I ended up going
with, is to use
annoying, and prone to error. A great solution to this problem is
<a href="https://github.com/bakkeby/dwm-flexipatch" target="_blank"
>dwm-flexipatch</a
>. This includes a bunch of commonly used patches that can be

View File

@@ -1,15 +0,0 @@
<div class="container-fluid px-md-6">
<div class="row align-items-center">
<div class="col-md-12">
<small>
Copyright &copy; 2019 Sravan Balaji under
<a
rel="license"
href="https://docs.google.com/gview?url=https://github.com/balajsra/sravanbalaji.com/raw/master/LICENSE"
target="_blank"
>MIT License</a
>
</small>
</div>
</div>
</div>

View File

@@ -1 +0,0 @@
document.write('<div class="container-fluid px-md-6"> <div class="row align-items-center"> <div class="col-md-12"> <small> Copyright &copy; 2019 Sravan Balaji under <a rel="license" href="https://docs.google.com/gview?url=https://github.com/balajsra/sravanbalaji.com/raw/master/LICENSE" target="_blank" >MIT License</a > </small> </div> </div> </div> ')

View File

@@ -1,43 +0,0 @@
<!--Required meta tags-->
<meta charset="utf-8" />
<meta name="author" content="Sravan Balaji" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Bootstrap -->
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
crossorigin="anonymous"
/>
<script
src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
crossorigin="anonymous"
></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
crossorigin="anonymous"
></script>
<!-- highlight.js -->
<link
rel="stylesheet"
href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/styles/default.min.css"
/>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/highlight.min.js"></script>
<script>
hljs.initHighlightingOnLoad();
</script>
<!-- Stylesheet -->
<link rel="stylesheet" type="text/css" href="style/styles.css" />
<!-- Favicon -->
<link rel="icon" href="././assets/branding/favicon.ico" type="image/x-icon" />

View File

@@ -1 +0,0 @@
document.write('<!--Required meta tags--> <meta charset="utf-8" /> <meta name="author" content="Sravan Balaji" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- Bootstrap --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous" /> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous" ></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous" ></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous" ></script> <!-- highlight.js --> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/styles/default.min.css" /> <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/highlight.min.js"></script> <script> hljs.initHighlightingOnLoad(); </script> <!-- Stylesheet --> <link rel="stylesheet" type="text/css" href="style/styles.css" /> <!-- Favicon --> <link rel="icon" href="././assets/branding/favicon.ico" type="image/x-icon" /> ')

View File

@@ -1,174 +0,0 @@
<nav class="navbar my-nav navbar-expand-md fixed-top">
<!-- Brand -->
<a class="navbar-brand" href="./index.html">
<img
src="./assets/branding/logo.png"
alt="Icon"
width="30px"
height="30px"
class="d-inline-block align-top"
/>
<img
src="./assets/branding/name.png"
alt="Name"
height="30px"
class="d-inline-block align-center"
/>
</a>
<!-- Toggler/collapsible Button -->
<button
class="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#collapsibleNavbar"
>
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar links -->
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<!-- About -->
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
href="./about.html"
id="navbardrop"
data-toggle="dropdown"
>
About
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="./about.html#bio"> Bio </a>
<a class="dropdown-item" href="./about.html#contact_me">
Contact Me
</a>
</div>
</li>
<!-- Portfolio -->
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
href="./portfolio.html"
id="navbardrop"
data-toggle="dropdown"
>
Portfolio
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="./portfolio.html#resume">
Resume
</a>
<a class="dropdown-item" href="./portfolio.html#education">
Education
</a>
<a
class="dropdown-item"
href="./portfolio.html#professional_experience"
>
Professional Experience
</a>
<!-- <a class="dropdown-item" href="./portfolio.html#research">
Research
</a>
<a class="dropdown-item" href="./portfolio.html#projects">
Projects
</a> -->
</div>
</li>
<!-- Personal -->
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
href="./personal.html"
id="navbardrop"
data-toggle="dropdown"
>
Personal
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="./personal.html#software">
Software
</a>
<a class="dropdown-item" href="./personal.html#hardware">
Hardware
</a>
<a class="dropdown-item" href="./personal.html#video_games">
Video Games
</a>
<a class="dropdown-item" href="./personal.html#podcasts">
Podcasts
</a>
<a class="dropdown-item" href="./personal.html#music">
Music
</a>
</div>
</li>
<!-- Blog -->
<li class="nav-item">
<a class="nav-link" href="./blog.html"> Blog </a>
</li>
<!-- Documentation -->
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
href="./documentation.html"
id="navbardrop"
data-toggle="dropdown"
>
Documentation
</a>
<div class="dropdown-menu">
<a
class="dropdown-item"
href="./documentation.html#introduction"
>
Introduction
</a>
<a
class="dropdown-item"
href="./documentation.html#website_hosting"
>
Website Hosting
</a>
<a
class="dropdown-item"
href="./documentation.html#web_design"
>
Web Design
</a>
<a
class="dropdown-item"
href="./documentation.html#aesthetics"
>
Aesthetics
</a>
<a
class="dropdown-item"
href="./documentation.html#inspiration"
>
Inspiration
</a>
</div>
</li>
</ul>
</div>
<!-- Dark Mode Toggle -->
<!-- Reference: https://github.com/coliff/dark-mode-switch -->
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="darkSwitch" />
<label
class="custom-control-label"
for="darkSwitch"
id="darkSwitchLabel"
>Dark Mode</label
>
</div>
<script src="./scripts/dark-mode-switch.min.js"></script>
</nav>

View File

@@ -1 +0,0 @@
document.write('<nav class="navbar my-nav navbar-expand-md fixed-top"> <!-- Brand --> <a class="navbar-brand" href="./index.html"> <img src="./assets/branding/logo.png" alt="Icon" width="30px" height="30px" class="d-inline-block align-top" /> <img src="./assets/branding/name.png" alt="Name" height="30px" class="d-inline-block align-center" /> </a> <!-- Toggler/collapsible Button --> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar" > <span class="navbar-toggler-icon"></span> </button> <!-- Navbar links --> <div class="collapse navbar-collapse" id="collapsibleNavbar"> <ul class="navbar-nav"> <!-- About --> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="./about.html" id="navbardrop" data-toggle="dropdown" > About </a> <div class="dropdown-menu"> <a class="dropdown-item" href="./about.html#bio"> Bio </a> <a class="dropdown-item" href="./about.html#contact_me"> Contact Me </a> </div> </li> <!-- Portfolio --> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="./portfolio.html" id="navbardrop" data-toggle="dropdown" > Portfolio </a> <div class="dropdown-menu"> <a class="dropdown-item" href="./portfolio.html#resume"> Resume </a> <a class="dropdown-item" href="./portfolio.html#education"> Education </a> <a class="dropdown-item" href="./portfolio.html#professional_experience" > Professional Experience </a> <!-- <a class="dropdown-item" href="./portfolio.html#research"> Research </a> <a class="dropdown-item" href="./portfolio.html#projects"> Projects </a> --> </div> </li> <!-- Personal --> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="./personal.html" id="navbardrop" data-toggle="dropdown" > Personal </a> <div class="dropdown-menu"> <a class="dropdown-item" href="./personal.html#software"> Software </a> <a class="dropdown-item" href="./personal.html#hardware"> Hardware </a> <a class="dropdown-item" href="./personal.html#video_games"> Video Games </a> <a class="dropdown-item" href="./personal.html#podcasts"> Podcasts </a> <a class="dropdown-item" href="./personal.html#music"> Music </a> </div> </li> <!-- Blog --> <li class="nav-item"> <a class="nav-link" href="./blog.html"> Blog </a> </li> <!-- Documentation --> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="./documentation.html" id="navbardrop" data-toggle="dropdown" > Documentation </a> <div class="dropdown-menu"> <a class="dropdown-item" href="./documentation.html#introduction" > Introduction </a> <a class="dropdown-item" href="./documentation.html#website_hosting" > Website Hosting </a> <a class="dropdown-item" href="./documentation.html#web_design" > Web Design </a> <a class="dropdown-item" href="./documentation.html#aesthetics" > Aesthetics </a> <a class="dropdown-item" href="./documentation.html#inspiration" > Inspiration </a> </div> </li> </ul> </div> <!-- Dark Mode Toggle --> <!-- Reference: https://github.com/coliff/dark-mode-switch --> <div class="custom-control custom-switch"> <input type="checkbox" class="custom-control-input" id="darkSwitch" /> <label class="custom-control-label" for="darkSwitch" id="darkSwitchLabel" >Dark Mode</label > </div> <script src="./scripts/dark-mode-switch.min.js"></script> </nav> ')

View File

@@ -1,4 +1,4 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en" color-mode="light">
<head>
<script
@@ -228,27 +228,6 @@
</p>
</div>
</div>
<div class="row align-items-center">
<div class="col-md-12">
<h2>Display Resume PDF in Website using GitHub</h2>
<p>
I have the latest version of my
<a href="./portfolio.html#resume">resume</a> stored in a public
<a href="https://github.com/balajsra/resume" target="_blank">
GitHub repository</a
>, but I wanted an easy way to share it directly on my website.
This led me to look for ways to embed a PDF in HTML. This works
great for local files, but not so great for PDFs stored in a
repository. The trick is to get the link to the raw PDF file from
GitHub and to use Google Drive PDF Viewer. This is outlined in
<a
href="https://medium.com/@kekayan/display-your-resume-cv-pdf-in-website-using-github-73a088ac961d"
target="_blank"
>Kekayan's Medium post</a
>.
</p>
</div>
</div>
</div>
<!---------------------------------

View File

@@ -1,66 +0,0 @@
<!DOCTYPE html>
<html lang="en" color-mode="light">
<head>
<script
language="javascript"
type="text/javascript"
src="common/header.txt"
></script>
<title>Sravan Balaji</title>
</head>
<script
language="javascript"
type="text/javascript"
src="common/navbar.txt"
></script>
<body>
<div class="container-fluid px-md-6">
<div class="row align-items-center">
<div class="col-md-12">
<h1>Welcome!</h1>
<p>
Welcome to my personal website! This started out as a side project
to learn about web development and UI design, but it has since
expanded into a professional portfolio and blog (sort of). If you
are a fan of dark mode, try out the toggle button in the upper right
corner!
<br /><br />
On this website, you can find information about my
<a href="./portfolio.html#education">educational</a> and
<a href="./portfolio.html#professional_experience"
>professional career</a
>
as well as some of my
<a href="./personal.html">personal interests</a>. If you are looking
to create your own website and are curious about how I created and
hosted this one, please see the
<a href="./documentation.html">documentation</a>
page.
<br /><br />
This website is a constant work in progress and updates will be made
as I find time. You can follow development and make suggestions on
<a
href="https://github.com/balajsra/sravanbalaji.com"
target="_blank"
>GitHub</a
>.
</p>
</div>
</div>
</div>
</body>
<footer>
<script
language="javascript"
type="text/javascript"
src="common/footer.txt"
></script>
</footer>
</html>

10
src/index.md Normal file
View File

@@ -0,0 +1,10 @@
---
title: Sravan Balaji
layout: "layouts/home.html"
---
Welcome to my personal website! This started out as a side project to learn about web development and UI design, but it has since expanded into a professional portfolio and blog (sort of). If you are a fan of dark mode, try out the toggle button in the upper right corner!
On this website, you can find information about my [educational](./portfolio.html#education) and [professional career](./portfolio.html#professional_experience) as well as some of my [personal interests](./personal.html). If you are looking to create your own website and are curious about how I created and hosted this one, please see the [documentation](./documentation.html) page.
This website is a constant work in progress and updates will be made as I find time. You can follow development and make suggestions on [GitHub](https://github.com/balajsra/sravanbalaji.com).

File diff suppressed because it is too large Load Diff

4
src/personal.md Normal file
View File

@@ -0,0 +1,4 @@
---
title: Personal
layout: "layouts/personal.html"
---

View File

@@ -0,0 +1,15 @@
---
displayOrder: 3
url: "https://www.samsung.com/us/app/watches/galaxy-watch5-pro"
logo: "/assets/hardware/galaxy-watch5-pro.png"
category: "Smart Watch"
name: "Samsung Galaxy Watch 5 Pro"
---
With the Samsung Galaxy Watch 5 Pro (and some older devices), Samsung partnered with Google to build a new version of Wear OS. Now, you get the amazing user experience from Samsung's old Tizen OS with all the app support of Google's Wear OS.
The Watch 5 Pro drops the mechanical bezel that I loved on my old Galaxy Watch, but the capacitive bezel is perfectly fine. Battery live is decent, but nothing special in my experience. I can usually get a little more than a full day's worth of battery even with the always on display activated.
It charges pretty quickly though, so I've never had an issue as long as I charge it for a bit every morning before leaving for the day. If you're an Android phone user, I can absolutely recommend this device. Especially if you have a samsung phone.
I didn't find any of the included watch faces particularly compelling, but [Watchmaker](https://getwatchmaker.com/) has an awesome [Fallout Pip-Boy Watchface](https://getwatchmaker.com/watchface/fallout-pip-boy-4-copy-sBy) that I modified to show my name.

View File

@@ -0,0 +1,17 @@
---
displayOrder: 2
url: "https://www.samsung.com/us/smartphones/galaxy-z-fold4"
logo: "/assets/hardware/galaxy-z-fold-4.png"
category: "Smartphone"
name: "Samsung Galaxy Z Fold 4"
---
I was originally really hesitant about getting a folding phone given some of the quality control issues with the early generations of the Galaxy Z Fold, but the 4th is really where Samsung refined their design to the point that I think it is ready for the mainstream.
I upgraded to this from a Galaxy S10+, which I absolutely loved. However, this device is a step above even the top of the line slab style phones. The versatility of having an almost full size phone when folded, and an amazing tablet when unfolded was unmatched by the competition (at least in the U.S. market) until recently. We're finally starting to see some competition from the Google Pixel 9 Pro Fold and OnePlus Open.
Multi tasking and content consumption on the big screen is absolutely amazing. No longer do I need to pull out a big and clunky tablet (like the Microsoft Surface Go I had before) to watch a movie. Now, I just pull out my phone and unfold it into a screen that is plenty big enough to watch whatever I want. Sometimes, I even watch a live sports match while multi-tasking with stats on a second app.
This kind of functionality will definitely cost you, but given that it can replace two devices, can fit in your pocket, and supports the S-pen, I can absolutely recommend this device for anyone looking to upgrade to a folding phone.
However, if durability is a concern, you may want to stay away. The hinge on my device broke after about two years of normal usage and it cost around $600 to replace the mechanism. Had the device not broken on me unexpectectly, I likely would have traded it in and upgraded to the latest fold. It seems like Samsung has stagnated with the fold series since the Z Fold 3. None of the newer devices in this line are a compelling enough upgrade of my Z Fold 4 to justify dropping another $2K, so I'm going to stick with mine for another few years (if it lasts that long). Hopefully, Google and OnePlus (and possibly others) will improve their offerings by then.

View File

@@ -0,0 +1,13 @@
---
displayOrder: 5
url: "https://www.amazon.com/HIFIMAN-Ananda-Full-Size-Headphones-Comfortable/dp/B07DJ2ZBB3"
logo: "/assets/hardware/hifiman-ananda.jpg"
category: "Open-Back Headphones"
name: "HIFIMAN Ananda"
---
The audiophile hobby intrigued me, but I was put off by the insane prices on some of the higher end headphones (upwards of $1K). I decided to dip my toe in the water so to speak by looking at mid-range offerings and decided on the HIFIMAN Ananda. To my (untrained) ear, they sound fantastic and really enhance the music listening experience (even with imperfect music sources like Spotify).
I opted for the [Topping DX3 Pro+](https://www.toppingaudio.com/product-item/dx3-pro) DAC/AMP because it was relatively affordable, supported multiple I/O options, and looked nice on my desk.
The audio listening experience is an extremely personal one, so I would recommend trying out a couple different audiophile grade headphones at a store if at all possible. It will save you from agonizing over reviews and personal opinions on the internet for weeks (like I did) before making a decision.

View File

@@ -0,0 +1,15 @@
---
displayOrder: 4
url: "https://www.keychron.com/products/keychron-q1-pro-qmk-via-wireless-custom-mechanical-keyboard"
logo: "/assets/hardware/keychron_q1_pro.avif"
category: "Mechanical Keyboard"
name: "Kechron Q1 Pro"
---
I've always been interested in custom mechanical keyboards, but never enough to really dive into the hobby. I eventually decided to look into buying a pre-built base board with solid build quality, an option to connect wirelessly, media controls (e.g., volume knob), hot swappable switches, and keymapping software that works on Linux. After some searching, I came across the Keychron Q1 Pro, which is the wireless version of the much loved Keychron Q1.
I hadn't really tried any mechanical switches before, so I went with [Gateron Cap V2 - Brown](https://www.keychron.com/products/gateron-cap-switch-set?variant=40119285284953) which have a tactile bump, but aren't too loud. These are quiet enough to be used in an office setting or during a call while still being satisfying to type on. The switches definitely aren't as clicky as my old Razer Huntsman Elite, which I see as a plus.
Later, I was interested in linear switches. I started with the [Gateron Ink V2 - Black](https://www.keychron.com/products/gateron-ink-v2-switch-set?variant=40119300882521) which are on the heavier side, but are very satisfying to type on. On the recommendation of [Nathan Edwards at The Verge](https://www.theverge.com/24307425/black-friday-best-deals-tech-staff-picks-cyber-monday-2024), I picked up the [Kailh Deep Sea Silent Pro Box - Linear Islet](https://www.kailh.net/products/kailh-deep-sea-silent-pro-box-switch-set) on a Cyber Monday sale and have been using them ever since. They're smooth, quiet, and not nearly as heavy as the Ink Black switches.
For the keycaps, I started with [Cherry Profile Double-Shot PBT Full Set Keycaps - Player](https://www.keychron.com/products/cherry-profile-double-shot-pbt-full-set-keycaps-player) from Keychron. These look absolutely amazing, but I always wanted to match the [Dracula Themed](https://draculatheme.com) I use for all my software with a set of keycaps. Eventually, I found the [Developer - OEM Dye-Sub PBT](https://www.keychron.com/products/oem-dye-sub-pbt-full-set-keycap-set-developer?variant=40257780088921) keycaps in stock and absolutely love them.

View File

@@ -0,0 +1,13 @@
---
displayOrder: 1
url: "https://system76.com/laptops"
logo: "/assets/hardware/oryx-pro-7.png"
category: "Laptop"
name: "System76 Oryx Pro 7"
---
Around 2020, I was looking for a Linux laptop that I could use for development, general productivity, and gaming over the next couple of years. While I loved my old desktop and ultrabook laptop, I really wanted one device that could fill both roles. After doing some research, I landed on [System76](https://system76.com). They are a U.S. based company that specializes in selling Linux laptops, desktops, and servers. They also make their own Linux distribution in [Pop!_OS](https://pop.system76.com).
Of their available laptops, the Oryx Pro lineup seemed to be the best balance of portability, power, and hybrid graphics. The last point is especially important to me because I wanted to be able to extend battery life by turning off the discrete GPU when I didn't need it. I have seen many reports of poor customer service on [r/System76](https://www.reddit.com/r/System76) as of late, but take this with a grain of salt as the people who tend to be the most vocal about their experiences tend to be those with highly negative experiences.
Since my original purchase back in 2020, my needs have changed. I don't necessarily need or want a singular device to fill every role moving forward. The [Steam Deck](https://store.steampowered.com/steamdeck) and other gaming handhelds have proven that you can still get great gaming experiences on the go. When I eventually decide to upgrade, I'll probably get a less powerful laptop like those offered by [Framework](https://frame.work/) for on-the-go use and build a powerful desktop for home use.

View File

@@ -0,0 +1,11 @@
---
displayOrder: 6
url: "https://truthear.com/products/hexa"
logo: "/assets/hardware/truthear-hexa.jpeg"
category: "In-Ear Monitor"
name: "Truthear Hexa"
---
Like with the HIFIMAN Ananda, I wanted to improve my audio listening experience on the go as well. In-Ear Monitors (IEMs) can also get super expensive if that interests you, but I wanted a relatively cheap set that I wouldn't feel to bothered if I lost or accidentally damaged. In the sub $100 budget range, I chose the Truthear Hexa because they got almost universal praise for "breaking the IEM market" with their stellar performance for the price.
These don't strictly require a DAC/AMP depending on your source, but they certainly benefit from one. That's why I went for the [Qudelix 5K DAC/AMP](https://www.qudelix.com/blogs/5k-dac-amp). It's relatively cheap, powerful enough to drive even my HIFIMAN Anada, and can be used wired or wireless. It also supports Sony LDAC, so you can get extremely good sound quality even over Bluetooth.

View File

@@ -0,0 +1,11 @@
---
displayOrder: 3
url: "https://www.beeper.com"
logo: "/assets/software/logo-beeper.png"
category: "Instant Messaging"
name: "Beeper"
---
If you hate having to switch between messaging services to chat with people, you'll love [Beeper](https://www.beeper.com). It is a universal messaging app that acts as a bridge to your existing services like WhatsApp, Discord, SMS, etc. It works across mobile and desktop and offers a clean unified interface for all your chats.
Checkout their [GitHub](https://github.com/beeper) if you're curious about some of the technical details of how this works. tl;dr it's built on top of the [Matrix protocol](https://matrix.org/). You can even [self-host bridges](https://github.com/beeper/bridge-manager) if you're interested.

View File

@@ -0,0 +1,11 @@
---
displayOrder: 7
url: "https://bitwarden.com/"
logo: "/assets/software/logo-bitwarden.png"
category: "Password Manager"
name: "Bitwarden"
---
The most important feature of password managers is security. Bitwarden is open source, which means the source code, features, and infrastructure security are vetted and improved by a global community of cybersecurity experts. Additionally, all information stored in Bitwarden is end-to-end encrypted, so you can trust it with sensitive data like banking passwords, social security numbers, etc. I especially love that it offers its core features free for personal use, is available on all major platforms (including Linux), and can sync across devices. If you aren't using a password manager and don't want to pay a monthly or yearly subscription, I highly suggest that you give this a look.
I liked it so much that I opted for the [premium plan](https://bitwarden.com/pricing/) which offers an integrated 2-factor authenticator. For only $10 a year, I'm happy to support the project and get a couple extra features.

View File

@@ -0,0 +1,11 @@
---
displayOrder: 1
url: "https://github.com/doomemacs/doomemacs"
logo: "/assets/software/logo-emacs.png"
category: "IDE / Text Editor"
name: "Doom Emacs"
---
I originally tried Emacs because I had heard it is highly configurable and has amazing features like [Org Mode](https://orgmode.org) and [Magit](https://magit.vc). My initial impression was that it was extremely difficult to use due to its unintuitive design and high reliance on keybindings. After watching some videos by [System Crafters](https://www.youtube.com/c/SystemCrafters), I slowly picked up on these keybindings and how to go about configuring Emacs to my liking. I especially liked the [Emacs from Scratch](https://www.youtube.com/playlist?list=PLEoMzSkcN8oPH1au7H6B7bBJ4ZO7BXjSZ) series which helped me build up my [personal configuration](https://github.com/balajsra/emacs). After using this configuration for a couple months, I came to realize that there are just too many missing features and issues that I kept having to find resolutions for.
This is why I decided to switch to [Doom Emacs](https://github.com/hlissner/doom-emacs), which is a distribution of Emacs that comes pre-configured with stability, performance, and vim keybindings in mind. The [DoomCasts](https://www.youtube.com/playlist?list=PLhXZp00uXBk4np17N39WvB80zgxlZfVwj) series by [Zaiste Programming](https://www.youtube.com/c/ZaisteProgramming) provides a good introduction to Doom Emacs in video form. My experience with Doom so far has been great. It works a lot more like what I expected my personal Emacs configuration to be, but is much easier to use and configure. Startup time is significantly faster, editing files is faster, vim-like keybindings are already setup, and it is functional out of the box. You can checkout my Doom Emacs configuration on [GitHub](https://github.com/balajsra/doom-emacs-config). I have been using [Chemacs 2](https://github.com/plexus/chemacs2) to easily switch between my personal and Doom configurations so I can compare and make improvements.

View File

@@ -0,0 +1,17 @@
---
displayOrder: 3
url: "https://www.gentoo.org"
logo: "/assets/software/logo-gentoo.png"
category: "Operating System"
name: "Gentoo Linux"
---
I started my Linux journey with Ubuntu, which I was using for my college CS classes. I eventually got tired of Windows and migrated my personal computers to PopOS! for the better hardware compatibility and better GNOME-esque experience by default.
As with almost everyone who goes down the Linux rabbit hole, I eventually found my way to Arch and stuck with it for a few years until I tried Gentoo (based on a recommendation from someone I met at a [NoVaLUG](https://novalug.org) meeting).
With Gentoo, you get near complete control over your system (e.g., you can use init systems other than systemd if you so desire), a stable package update schedule (with the option to go "unstable" if desired), rolling release, and an amazing package manager (portage).
USE flags are probably its key selling point. You can enable/disable certain features in almost every package since you compile packages yourself (at least the ones that are open source). There are options to download binaries as well if you're limited on compute resources and/or time. It doesn't have the same community as the AUR in terms of package availability, but you can always write your own ebuilds for packages that don't exist in the main repo or community maintained ones like GURU.
I maintain a [personal overlay](https://github.com/balajsra/sravan-overlay) with ebuilds for packages I use.

View File

@@ -0,0 +1,17 @@
---
displayOrder: 2
url: "https://obsidian.md/"
logo: "/assets/software/logo-obsidian.png"
category: "Personal Knowledge Management"
name: "Obsidian"
---
[Notion](https://www.notion.com) was my previous favorite, but I started looking for alternatives due to the lack of an offline mode. The always online model has let me down a few times and I also didn't like the idea of handing over all of my data to a 3rd party company. Security and privacy are extremely important for personal notes.
When looking for alternatives, I was intrigued by the idea of having all my notes in plain-text. [Org mode for GNU Emacs](https://orgmode.org/) is an amazing solution, but it lacks the cross-platform support that I need. If you primarily write and use your notes on desktop, I definitely recommend Org mode.
The other obvious place to look was markdown based editors like [Logseq](https://logseq.com/) and [Obsidian](https://obsidian.md). I preferred Logseq for a time because it is completely open-source, unlike Obsidian. However, it structures all its notes as an outline rather than plain markdown that you can format however you choose. This lack of flexibility in the fundamental design finally led me to switch to Obsidian.
While not open-source, Obsidian is free for personal use. It has an amazing set of community plugins that extend the base functionality to include features like [task management](https://publish.obsidian.md/tasks/Introduction) that I use extensively. If having complete ownership over your notes is important to you, definitely give this a shot.
Obsidian does offer a paid [sync service](https://obsidian.md/sync) if you want to synchronize your notes across any device. However, since the notes are just plain-text, you can just as easily use [Git](https://github.com/Vinzent03/obsidian-git) or [Syncthing](https://syncthing.net) to do it yourself.

View File

@@ -0,0 +1,13 @@
---
displayOrder: 4
url: "https://pocketcasts.com"
logo: "/assets/software/logo-pocket-casts.png"
category: "Podcasts"
name: "Pocket Casts"
---
Pocket Casts is by far my favorite app for listening to podcasts. It has all the features you could ask for like automatically downloading new episodes and adding them to your queue, boosting the volume of dialogue, cutting out silence, and more! They support mobile apps, wearables, and a web player.
Unfortunately, they made the regrettable decision to switch from a one-time purchase to a subscription model. After backlash from the community, Pocket Casts partially reversed course by giving [lifetime Pocket Casts Plus access](https://support.pocketcasts.com/knowledge-base/lifetime-access-to-pocket-casts-plus/) to users who had previously purchased the web app (myself included). At the price of $9 prior to September 2019, this was an absolute steal.
While the base functionality in the mobile app is free, the new [subscription plans](https://pocketcasts.com/plans/#plans) which include access to the desktop and wearable apps (as well as some other nice features) come in at $40 or $80 per year. I can't necessarily recommend these subscription plans unless you listen to podcasts across multiple devices often enough to justify it.

View File

@@ -0,0 +1,13 @@
---
displayOrder: 5
url: "https://spotify.com"
logo: "/assets/software/logo-spotify.png"
category: "Music & Audiobooks"
name: "Spotify"
---
This is my preferred music app. I love having access to streaming music on all devices I use and integration with many smart home devices. Overall an excellent product and very reasonable prices, especially with the [student pricing plan](https://www.spotify.com/us/student).
In 2024, they increased the subscription price to $12 per month, but added 15 hours of audiobook listening time per month. I have been using this to make my way through the excellent [Witcher Audiobook series narrated by Peter Kenny](https://open.spotify.com/show/6vTRzKkZWCbPVQoMaUiDsz?si=8eca930e86854be3).
If you are interested in theming or adding more features to the spotify desktop app, check out [spicetify](https://spicetify.app).

View File

@@ -0,0 +1,9 @@
---
displayOrder: 6
url: "https://vivaldi.com/"
logo: "/assets/software/logo-vivaldi.png"
category: "Web Browser"
name: "Vivaldi"
---
After trying [Google Chrome](https://www.google.com/chrome), [Microsoft Edge](https://www.microsoft.com/en-us/edge), and [Brave](https://brave.com), I finally decided to go with [Vivaldi](https://vivaldi.com). It should be familiar to those coming from Chrome since it is also based on [Chromium](https://www.chromium.org). The main reason I like it is for its customizability. There are so many features available to the user like tab stacking and tiling that I find extremely helpful. If you are a browser power user such as myself, I think you will find it really hard to switch to another browser's tab management system. Vivaldi's is by far the best I have used. Additionally, most if not all Chrome extensions can be used with Vivaldi and it has built-in ad blocking and tracking prevention. Definitely recommend that you give it a try.

File diff suppressed because it is too large Load Diff

4
src/portfolio.md Normal file
View File

@@ -0,0 +1,4 @@
---
title: Portfolio
layout: "layouts/portfolio.html"
---

View File

@@ -0,0 +1,14 @@
---
displayOrder: 1
id: "umich-1"
url: "https://cse.engin.umich.edu"
logo: "/assets/education/logo-computer-science.jpg"
association: "University of Michigan"
entryTitle: "B.S.E. in Computer Science"
location: "Ann Arbor, MI"
startDate: "September 2016"
endDate: "December 2020"
---
**GPA:** 3.776
**Focus:** Intelligent Systems

View File

@@ -0,0 +1,14 @@
---
displayOrder: 2
id: "umich-2"
url: "https://me.engin.umich.edu"
logo: "/assets/education/logo-mechanical-engineering.jpg"
association: "University of Michigan"
entryTitle: "B.S.E. in Mechanical Engineering"
location: "Ann Arbor, MI"
startDate: "September 2016"
endDate: "December 2020"
---
**GPA:** 3.776
**Focus:** Controls

View File

@@ -0,0 +1,14 @@
---
displayOrder: 3
id: "umich-3"
url: "https://robotics.umich.edu"
logo: "/assets/education/logo-robotics.png"
association: "University of Michigan"
entryTitle: "M.S. in Robotics"
location: "Ann Arbor, MI"
startDate: "January 2021"
endDate: "December 2021"
---
**GPA:** 3.982
**Focus:** Acting

View File

@@ -0,0 +1,23 @@
---
associatedEntry: "hughes-1"
name: "Mobile Terminal Configuration Tool"
displayOrder: 1
---
**Problem**
Hughes sells mobile satellite terminals that provide internet and phone service to customers. Some customers who purchased terminals in bulk (~1000) required non-default settings. The configuration process of manually changing settings on each terminal was tedious and error-prone.
**Task**
My job was to develop a Windows 7 / 10 program that would automate the terminal configuration process.
**Result**
I designed and developed a GUI program in C# that detects which terminal model is connected and uses the available interface (<abbr title="REpresentational State Transfer">REST</abbr> <abbr title="Application Programming Interface">API</abbr> or <abbr title="File Transfer Protocol">FTP</abbr>) to copy the configuration of the *master* terminal. This can then be used to automatically configure subsequent terminals.
**Customer Feedback**
> "Btw the tool you sent us is helping a lot. Thank you so much."
>
> &mdash; <cite>Hughes Customer</cite>

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "hughes-1"
name: "Location Based Services"
displayOrder: 2
---
**Problem**
Hughes mobile terminals allow customers to have internet and phone access in remote areas via a satellite connection. Some customers may find value in a GPS feature built into the terminal. In this situation, the terminal would send GPS coordinates to a server at regular intervals of time, distance, and/or velocity as configured by the end-user.
**Task**
My task was to investigate a way to minimize the data packet size of GPS coordinates and to update the terminal's software to send these data packets to a server configured by the end-user.
**Result**
This project was assigned to me after the completion of my previous project, which was intended to last the entire internship. I was able to determine that <abbr title="MQ Telemetry Transport for Sensor Networks">[MQTT-SN](https://www.oasis-open.org/committees/document.php?document_id=66091&wg_abbrev=mqtt)</abbr> was a good option as it simply sends a data packet to a server without checking for acknowledgement and the packet header is sufficiently small. I successfully implemented the packet structure and delivery to the server on the terminal software written in C. However, I was unable to get the server to recognize that it received the packet in my remaining time at Hughes. Using [Wireshark](https://www.wireshark.org), I confirmed the reception of the packet, but none of the open-source <abbr title="MQ Telemetry Transport for Sensor Networks">[MQTT-SN](https://www.oasis-open.org/committees/document.php?document_id=66091&wg_abbrev=mqtt)</abbr> brokers I used worked.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "mitre-1"
name: "PNT Defense & Threat Library"
displayOrder: 1
---
**Problem**
The <abbr title="Positioning, Navigation, and Timing">PNT</abbr> Defense & Threat Library is a framework implemented in [Python](https://www.python.org) for mapping out and visualizing the space of <abbr title="Positioning, Navigation, and Timing">PNT</abbr> threats & defenses. The user specifies defenses (and which threats they mitigate) and threats as well as the relationships between entries.
**Task**
We wanted a way to identify implicit mitigation links without the user having to specify every single relationship.
**Result**
Implemented a function to parse the library, look through the directed acyclic graph structure, and identify which threats are mitigated by a subset of selected threats.

Some files were not shown because too many files have changed in this diff Show More