41 Commits

Author SHA1 Message Date
Max
924b22f2ca fix: ignore Gitea Actions for now 2025-01-09 15:34:10 -05:00
Max
5fad958cec fix: ignore certain files for jekyll 2025-01-09 15:33:42 -05:00
Max
60f194ac7d fix: no backend here 2025-01-09 15:29:09 -05:00
Max
08b1b8f641 feat: init tf 2025-01-09 15:20:49 -05:00
Max
3fb6801188 feat: portfolio terraform 2025-01-09 15:15:26 -05:00
Max
7003f25566 feat: added back Gemfile 2025-01-09 14:52:44 -05:00
Max
7f76759b03 feat: gitea-ize
Some checks failed
Prepare changes for deployment. / prepare (push) Has been cancelled
2025-01-08 19:59:29 -05:00
MajorDroolz
c1377d50a0 FIX: All large styles/fonts are now preloaded. 2023-01-06 23:42:22 -05:00
MajorDroolz
d2f424a7c9 FIX: Compressed images, removed most content layout shifting. 2023-01-06 23:26:00 -05:00
MajorDroolz
9697866181 FIX: Gemfiles still present 2023-01-06 20:06:31 -05:00
MajorDroolz
a793d7ce4b FIX: Removed unneeded files. 2023-01-06 19:59:36 -05:00
Max Hutz
aa4fdaf435 FEAT: Add meaningful description to README. 2023-01-06 19:53:59 -05:00
MajorDroolz
8f6d45ca53 FEAT: CRISIS, and with that all, project content complete. 2023-01-06 19:34:05 -05:00
MajorDroolz
de2506ad9d FEAT: Added Poll Buddy content. 2023-01-06 17:53:31 -05:00
MajorDroolz
cc4b87d9c5 FIX: Malung link removed, FreshManuals link fixed, all outside links create tab. 2023-01-06 15:51:57 -05:00
MajorDroolz
81f467e16a FEAT: Info for FreshManuals mobile app. 2023-01-06 04:52:52 -05:00
MajorDroolz
9ac21fac1e FIX: images correctly center, and shrink on screen size. 2023-01-06 04:01:55 -05:00
MajorDroolz
662bc0a2ed FEAT: Added Malung info. 2023-01-06 03:57:38 -05:00
MajorDroolz
1452840240 FIX: Removed duplicate jekyll code with include. 2023-01-05 00:22:03 -05:00
MajorDroolz
ec2e17cee1 FIX: Experiences don't have a description. 2023-01-05 00:08:41 -05:00
MajorDroolz
a554ca8fa6 FIX: Not text inside image boxes have inner padding. 2023-01-05 00:00:28 -05:00
MajorDroolz
9611cde594 FIX: Experiences don't have a description. 2023-01-04 23:49:15 -05:00
MajorDroolz
7edafd8677 FIX: Removed incompatible Jekyll plugin. 2023-01-04 23:43:05 -05:00
MajorDroolz
7463c1927a FIX: Remove HTML Minifier 2023-01-04 23:30:37 -05:00
MajorDroolz
fed3479ed1 TEST: prepare.yml 2023-01-04 23:30:24 -05:00
MajorDroolz
810ede3202 FIX: Image not available for project list. 2023-01-04 23:29:35 -05:00
MajorDroolz
a4a4e04ab2 FIX: Workflow to work with jekyll. 2023-01-04 23:16:48 -05:00
MajorDroolz
219a7543de FIX: Description for projects now works. 2023-01-04 22:47:52 -05:00
MajorDroolz
87a3c3d2b4 FIX: Only ready work in documented. Images added, view ubtton optional. 2023-01-04 22:18:53 -05:00
MajorDroolz
34e75a3748 Project pages now auto-generated with jekyll data. 2023-01-04 21:32:02 -05:00
MajorDroolz
f0b2bc0474 FEAT: Created first demo of project page for malung. 2023-01-04 04:26:14 -05:00
MajorDroolz
28e1dcc5d5 Pull from main. 2023-01-04 03:01:06 -05:00
MajorDroolz
e011480ad1 Merge pull request #17 from MajorDroolz/project-list
Project list
2023-01-04 02:36:26 -05:00
MajorDroolz
77991356f4 FIX: added data folders. 2023-01-04 02:35:10 -05:00
MajorDroolz
875a80488c FEAT: New projects page, Jekyllified home page too. 2023-01-04 02:34:29 -05:00
MajorDroolz
86434d5248 Revert "Preparing changes for deployment."
This reverts commit 03c19781e9.
2023-01-03 22:18:13 -05:00
MajorDroolz
128c97900c Merge branch 'build' into main 2023-01-03 22:10:23 -05:00
MajorDroolz
fe013e056b Corrected 404 page description. 2023-01-03 22:08:20 -05:00
github-actions
03c19781e9 Preparing changes for deployment. 2023-01-04 03:04:58 +00:00
MajorDroolz
e264abd558 FEAT: New 404 page, pages now use jekyll for componentalization. 2023-01-03 22:04:28 -05:00
MajorDroolz
c1c1c664a3 Merge pull request #13 from MajorDroolz/homepage
Homepage is operational.
2023-01-03 01:17:41 -05:00
53 changed files with 1139 additions and 265 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1,40 +0,0 @@
name: Prepare changes for deployment.
on:
push:
branches:
- 'main'
jobs:
prepare:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
token: ${{ secrets.SECRET }}
- uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install dependencies.
run: npm i -g terser csso-cli html-minifier
- name: "Copying changes over to build."
run: git checkout -b build
- name: Minify files.
run: |
find . -name "*.js" -type f -exec terser {} -c -o {} \;
find . -name "*.css" -type f -exec csso {} -o {} \;
find . -name "*.html" -type f -exec html-minifier --remove-comments --collapse-whitespace {} -o {} \;
- name: "Commiting changes."
run: |
git config user.name github-actions
git config user.email noreply@github.com
git commit -am "Preparing changes for deployment."
- name: "Pushing changes."
run: git push -uf origin build

51
.gitignore vendored Normal file
View File

@@ -0,0 +1,51 @@
_site
.bundle
.jekyll-cache
vendor
.vscode
.DS_Store
secrets
secret.tfvars
# ---> Terraform
# Local .terraform directories
.terraform
# .tfstate files
*.tfstate
*.tfstate.*
# Crash log files
crash.log
crash.*.log
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
*.tfvars
*.tfvars.json
# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json
# Include override files you do wish to add to version control using negated pattern
# !example_override.tf
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*
# Ignore CLI configuration files
*.terraformrc
terraform.rc
# ---------------------------------------------------------------------------- #
# Custom ignores.
*.tfvars
*.tfbackend

16
404.html Normal file
View File

@@ -0,0 +1,16 @@
---
title: 404
description: Oops! The page you wanted does not exist.
layout: default
---
<link rel="stylesheet" href="/styles/404.css">
<section id="notfound" class="back">
<div id="text-outer">
<i>Looks like your lost!</i>
<h1 id="text-404" class="shadow">404</h1>
</div>
<hr class="lighter">
<button type="button" class="nav-link white button" onclick="history.back(-1)">Go Back.</button>
</section>

33
Gemfile Normal file
View File

@@ -0,0 +1,33 @@
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
# bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
gem "jekyll", "~> 4.3.4"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
gem "minima", "~> 2.5"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
# gem "github-pages", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
gem "jekyll-feed", "~> 0.12"
end
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
# and associated library.
platforms :mingw, :x64_mingw, :mswin, :jruby do
gem "tzinfo", ">= 1", "< 3"
gem "tzinfo-data"
end
# Performance-booster for watching directories on Windows
gem "wdm", "~> 0.1", :platforms => [:mingw, :x64_mingw, :mswin]
# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem
# do not have a Java counterpart.
gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]

169
Gemfile.lock Normal file
View File

@@ -0,0 +1,169 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
bigdecimal (3.1.9)
colorator (1.1.0)
concurrent-ruby (1.3.4)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
eventmachine (1.2.7)
ffi (1.17.1)
ffi (1.17.1-aarch64-linux-gnu)
ffi (1.17.1-aarch64-linux-musl)
ffi (1.17.1-arm-linux-gnu)
ffi (1.17.1-arm-linux-musl)
ffi (1.17.1-arm64-darwin)
ffi (1.17.1-x86-linux-gnu)
ffi (1.17.1-x86-linux-musl)
ffi (1.17.1-x86_64-darwin)
ffi (1.17.1-x86_64-linux-gnu)
ffi (1.17.1-x86_64-linux-musl)
forwardable-extended (2.6.0)
google-protobuf (4.29.3)
bigdecimal
rake (>= 13)
google-protobuf (4.29.3-aarch64-linux)
bigdecimal
rake (>= 13)
google-protobuf (4.29.3-arm64-darwin)
bigdecimal
rake (>= 13)
google-protobuf (4.29.3-x86-linux)
bigdecimal
rake (>= 13)
google-protobuf (4.29.3-x86_64-darwin)
bigdecimal
rake (>= 13)
google-protobuf (4.29.3-x86_64-linux)
bigdecimal
rake (>= 13)
http_parser.rb (0.8.0)
i18n (1.14.6)
concurrent-ruby (~> 1.0)
jekyll (4.3.4)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (>= 2.0, < 4.0)
jekyll-watch (~> 2.0)
kramdown (~> 2.3, >= 2.3.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (>= 0.3.6, < 0.5)
pathutil (~> 0.9)
rouge (>= 3.0, < 5.0)
safe_yaml (~> 1.0)
terminal-table (>= 1.8, < 4.0)
webrick (~> 1.7)
jekyll-feed (0.17.0)
jekyll (>= 3.7, < 5.0)
jekyll-sass-converter (3.0.0)
sass-embedded (~> 1.54)
jekyll-seo-tag (2.8.0)
jekyll (>= 3.8, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.5.1)
rexml (>= 3.3.9)
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.4)
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
minima (2.5.2)
jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (6.0.1)
rake (13.2.1)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
rexml (3.4.0)
rouge (4.5.1)
safe_yaml (1.0.5)
sass-embedded (1.83.1)
google-protobuf (~> 4.29)
rake (>= 13)
sass-embedded (1.83.1-aarch64-linux-android)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-aarch64-linux-gnu)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-aarch64-linux-musl)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-aarch64-mingw-ucrt)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-arm-linux-androideabi)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-arm-linux-gnueabihf)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-arm-linux-musleabihf)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-arm64-darwin)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-riscv64-linux-android)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-riscv64-linux-gnu)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-riscv64-linux-musl)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-x86_64-cygwin)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-x86_64-darwin)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-x86_64-linux-android)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-x86_64-linux-gnu)
google-protobuf (~> 4.29)
sass-embedded (1.83.1-x86_64-linux-musl)
google-protobuf (~> 4.29)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
unicode-display_width (2.6.0)
webrick (1.9.1)
PLATFORMS
aarch64-linux
aarch64-linux-android
aarch64-linux-gnu
aarch64-linux-musl
aarch64-mingw-ucrt
arm-linux-androideabi
arm-linux-gnu
arm-linux-gnueabihf
arm-linux-musl
arm-linux-musleabihf
arm64-darwin
riscv64-linux-android
riscv64-linux-gnu
riscv64-linux-musl
ruby
x86-linux
x86-linux-gnu
x86-linux-musl
x86_64-cygwin
x86_64-darwin
x86_64-linux
x86_64-linux-android
x86_64-linux-gnu
x86_64-linux-musl
DEPENDENCIES
http_parser.rb (~> 0.6.0)
jekyll (~> 4.3.4)
jekyll-feed (~> 0.12)
minima (~> 2.5)
tzinfo (>= 1, < 3)
tzinfo-data
wdm (~> 0.1)
BUNDLED WITH
2.6.2

View File

@@ -1,3 +1,9 @@
# The Personal Website of Maxim Voldman Hutz
This website serves as an exhibit of who I am, what I've done, what I'm doing,
and what I plan to do.
# 🖼️ Max Hutz's Digital Portfolio
Hey!
I'm Max Hutz, and this is my personal website.
It details who I am, what I've done, and were I'm headed in the field of software engineering. (And it looks cool too!)
Check it out now at [www.maximhutz.me](https://www.maximhutz.me)!

16
Taskfile.yml Normal file
View File

@@ -0,0 +1,16 @@
version: 3
env: { TF: terraform -chdir=terraform }
silent: true
tasks:
tf/init: $TF init -backend-config=s3.tfbackend
tf/plan: $TF plan
tf/destroy: $TF destroy
tf/format: $TF fmt -recursive
tf/apply:
- $TF apply
- $TF output -json > terraform.secrets
action: act -W .gitea/workflows --container-architecture linux/amd64
dev: bundle exec jekyll serve

5
_config.yml Normal file
View File

@@ -0,0 +1,5 @@
exclude:
- "*.yml"
- "*.md"
- "LICENSE"
- "terraform/*"

16
_data/home.yml Normal file
View File

@@ -0,0 +1,16 @@
welcome:
Hey! 👋 I'm Max Hutz.
status:
Software developer in New York.
about:
I'm a passionate computer science student skilled in building responsive,
full-stack applications. I love learning from colleagues and teaching future
developers. I thrive where teamwork and creativity are key.
email:
maximhutz@gmail.com
featured:
[ malung, freshmanual, pollbuddy, rpi-crisis ]

79
_data/techs.yml Normal file
View File

@@ -0,0 +1,79 @@
html:
name: HTML
fore: '#FFFFFF'
back: '#E44D26'
link: https://html.spec.whatwg.org/multipage/
css:
name: CSS
fore: '#FFFFFF'
back: '#2965F1'
link: https://www.w3.org/Style/CSS/Overview.en.html
js:
name: JavaScript
fore: '#323330'
back: '#F0DB4F'
link: https://en.wikipedia.org/wiki/JavaScript
php:
name: PHP
fore: '#242434'
back: '#8B93BB'
link: https://www.php.net
docker:
name: Docker
fore: '#2494EC'
back: '#FFFFFF'
link: https://www.docker.com
azure:
name: Azure
fore: '#EEEEEE'
back: 'linear-gradient(-45deg, #2892DF, #3CCBF4)'
link: https://azure.microsoft.com/en-us/
mariadb:
name: MariaDB
fore: '#1C335C'
back: '#C4745C'
link: https://mariadb.org
#*----------------------------------------------------------------------------*#
react:
name: React
fore: '#04D8F8'
back: '#242323'
link: https://reactjs.org
swift:
name: Swift
fore: white
back: 'linear-gradient(-45deg, #FF3527, #FBAB3F)'
link: https://www.swift.org
objective-c:
name: Objective-C
fore: '#000000'
back: '#EEEEEE'
link: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html
firebase:
name: Firebase
fore: '#F57C00'
back: '#EEF3F5'
link: https://firebase.google.com
python:
name: Python
fore: '#FFD94B'
back: '#346C94'
link: https://www.python.org
bs:
name: Beautiful Soup
fore: '#97DACB'
back: '#1C4E63'
link: https://www.crummy.com/software/BeautifulSoup/bs4/doc/

116
_data/work.yml Normal file
View File

@@ -0,0 +1,116 @@
malung:
id: malung
title: Malung
subtitle: COVID-19 Classifier
stack: [ html, css, js, php, docker, mariadb, azure ]
color: malung
image: /res/projects/malung.webp
ready: true
description:
Led a team of 3 to create Malung, an <b>online COVID-19 classifier</b>. With
Malung, you can detect COVID-19 in lung scans using machine learning, and
<b>manage patient data on the cloud</b>. <br><br> Doubled as the <b>backend
/ DevOps lead</b> during development, managing the site and its database.
outcomes:
- Hosted site through Microsoft Azure.
- Managed database with MariaDB; Containerized on Docker instance for local
development.
- Built account system with PHP, which interfaced with frontend through
backend API.
- Collaboratively designed sites UI with Figma, focusing on responsive
design.
#*----------------------------------------------------------------------------*#
freshmanual:
id: freshmanual
title: FreshManual
subtitle: Mobile App
stack: [ react, js, firebase, swift, objective-c ]
link: https://apps.apple.com/us/app/freshmanuals/id1627091250
color: freshmanual
image: /res/projects/freshmanual.webp
ready: false
description:
Lead developer during the initial development of the FreshManuals app.
Worked with <b>team of 5</b> at Tightrope Interactive to design, build, and
test the <b>mobile product manual aggregator</b>.<br><br>FreshManuals is
currently available for download on the <b>iPhone app store</b>.
outcomes:
- User interface built using React/React-Native, for multiplatform
integration.
- Used Firestore/Firebase to store and access user account data.
- Integrated paid yahoo search results into mobile search results.
- Used Fetch API to request user manual data from website API endpoints.
#*----------------------------------------------------------------------------*#
pollbuddy:
id: pollbuddy
title: Poll Buddy
stack: [ react, js, docker ]
link: https://pollbuddy.app
color: pollbuddy
image: /res/projects/pollbuddy.webp
ready: false
description:
React developer for Poll Buddy, an <b>online questionnaire service</b> used by
hundreds of students and teachers on the Rensselaer Polytechnic Institute
campus. Worked on <b>cleaning source code</b>, transitioning from legacy
technology, and <b>improving the sites user experience</b>.
outcomes:
- Cut 30% of the front-end codebase by switching to the modern, functional
style.
- Wrote and refined dozens of front-end tests using Jest for React
components.
- Ran discount usability study on Poll Buddys UI, to isolate and correct
flaws that novel users encountered.
#*----------------------------------------------------------------------------*#
rpi-crisis:
id: rpi-crisis
title: CRISIS
stack: [ python, bs ]
link: https://rpicrisis.org
color: rpi-crisis
image: /res/projects/rpi-crisis.webp
ready: false
description:
<b>Backend developer</b> for Correcting Rensselaers Insufferable Student
Information System (CRISIS), a web-app to help students organize and <b>manage
their curriculum</b> at Rensselaer Polytechnic Institute (RPI). Worked to
<b>expand data collection</b> system, and decipher information from RPIs
legacy SIS.
outcomes:
- Wrote web-scrapers using Beautiful Soup to pull data from QuACS, another
well-known course scheduler, jump-starting the sites backend.
- Wrote web-scrapers to extract course templates from RPIs numerous
major-specific websites.
- Used Lark to parse course requirements from RPIs convoluted course
catalog.
#*----------------------------------------------------------------------------*#

33
_includes/default.html Normal file
View File

@@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="{{ include.description }}">
<meta name="cache-control" content="max-age=31536000">
<link rel="shortcut icon" type="image/png" href="/res/favicon.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link rel="preload stylesheet" as="font" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,500,1,200&display=swap">
<link rel="preload stylesheet" as="font" href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap">
<link rel="preload stylesheet" as="font" href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;900&display=swap">
<link rel="preload stylesheet" as="style" href="/styles/global.css">
<link rel="preload stylesheet" as="style" href="/styles/default.css">
<title>{{ include.title }} ─ Max Hutz</title>
</head>
<body>
{% include header.html %}
{{ include.content }}
<div class="flex dark back npad"></div>
{% include footer.html %}
</body>
</html>

13
_includes/footer.html Normal file
View File

@@ -0,0 +1,13 @@
<link rel="preload stylesheet" as="style" href="/styles/footer.css">
<footer class="dark back">
<h2>&copy; 2022</h2>
<div class="flex"></div>
<a href="https://github.com/MajorDroolz" class="png-icon" target="_blank">
<img src="/res/icons/github.webp" alt="GitHub" width="30" height="30">
</a>
<a href="https://www.linkedin.com/in/maximhutz/" class="png-icon" target="_blank">
<img src="/res/icons/linkedin.webp" alt="LinkedIn" width="30" height="30">
</a>
<a href="mailto:maximhutz@gmail.com" class="nav-link white icon" data-i="mail" aria-label="Contact" target="_blank"></a>
</footer>

30
_includes/header.html Normal file
View File

@@ -0,0 +1,30 @@
<link rel="stylesheet" href="/styles/header.css">
<header class="light back shadow">
<a href="/" class="nav-link dark">MAX HUTZ</a>
<div class="flex"></div>
<a href="/experiences" class="nav-link dark icon nav3" data-i="work">Experience</a>
<a href="/resume" class="nav-link dark icon nav3" data-i="clinical_notes" target="_blank">Resume</a>
<a href="mailto:maximhutz@gmail.com" class="nav-link dark icon nav3" data-i="mail">Contact</a>
<a href="/experiences" class="nav-link dark icon nav2" data-i="work" aria-label="Experience"></a>
<a href="/resume" class="nav-link dark icon nav2" data-i="clinical_notes" aria-label="Resume" target="_blank"></a>
<a href="mailto:maximhutz@gmail.com" class="nav-link dark icon nav2" data-i="mail" aria-label="Contact"></a>
<button class="nav-link dark icon nav1" data-i="menu" aria-label="Menu" onclick="document.getElementById('menu')?.showModal()"></button>
</header>
<dialog id="menu">
<div class="light width-pad shadow">
<div id="menu-inner">
<div id="menu-top">
<a href="/home" class="nav-link dark">MAX HUTZ</a>
<div class="flex"></div>
<form method="dialog">
<button class="nav-link dark icon" data-i="close" aria-label="Close"></button>
</form>
</div>
<a href="/experiences" class="nav-link dark icon" data-i="work">Experience</a>
<a href="/resume" class="nav-link dark icon" data-i="clinical_notes" target="_blank">Resume</a>
<a href="mailto:maximhutz@gmail.com" class="nav-link dark icon" data-i="mail">Contact</a>
</div>
</div>
</dialog>

1
_includes/style.html Normal file
View File

@@ -0,0 +1 @@
<link rel="stylesheet" href="/styles/{{ include.name }}.css">

1
_layouts/default.html Normal file
View File

@@ -0,0 +1 @@
{% include default.html title=page.title content=content description=page.description %}

54
_layouts/experience.html Normal file
View File

@@ -0,0 +1,54 @@
{% capture description %}
A description of work done by Maxim Voldman Hutz for {{page.title}}.
{% endcapture %}
{% capture inner %}
{% assign malung = site.data.work[page.project_id] %}
{% assign techs = site.data.techs %}
<link rel="preload stylesheet" href="/styles/experience.css">
<link rel="preload stylesheet" href="/styles/tech.css">
<section id="experience" class="dark back">
<section id="banner" class="{{malung.color}} back">
<div>
<h1>{{malung.title}}</h1>
<i>{{malung.subtitle}}</i>
</div>
<button id="close-icon" class="nav-link dark icon" data-i="close" aria-label="Exit" type="button" onclick="history.back(-1)"></button>
</section>
<div id="content">
<div id="description">
<p>
{{malung.description}}
</p>
<hr class="lighter">
<ul>
{% for outcome in malung.outcomes %}
<li>{{outcome}}</li>
{% endfor %}
</ul>
{% if malung.link %}
<a href="{{malung.link}}" id="experience-button" class="nav-link white button r-icon" data-i="arrow_right" target="_blank">View {{malung.title}}</a>
{% endif %}
</div>
<div id="image-side">
<div id="image" class="shadow">
{% if malung.image %}
<img id="image-inner" src="{{malung.image}}" alt="Image of {{malung.title}}">
{% else %}
<h1 aria-hidden="true">Image Not Available</h1>
{% endif %}
</div>
<div id="stack">
{% for tech in malung.stack %}
{% assign data = techs[tech] %}
<a class="chip {{tech}} shadow" href="{{data.link}}" target="_blank">{{data.name}}</a>
{% endfor %}
</div>
</div>
</div>
</section>
{% endcapture %}
{% include default.html content=inner description=description title=page.title %}

View File

@@ -0,0 +1,5 @@
---
layout: experience
project_id: freshmanual
title: FreshManual
---

5
experience/malung.html Normal file
View File

@@ -0,0 +1,5 @@
---
layout: experience
project_id: malung
title: Malung
---

View File

@@ -0,0 +1,5 @@
---
layout: experience
project_id: pollbuddy
title: Poll Buddy
---

View File

@@ -0,0 +1,5 @@
---
layout: experience
project_id: rpi-crisis
title: CRISIS
---

36
experiences.html Normal file
View File

@@ -0,0 +1,36 @@
---
title: Experiences
description: A list of work and projects done by Maxim Voldman Hutz.
layout: default
---
{% assign work = site.data.work %}
<section id="projects" class="dark back">
<h2>My experiences.</h2>
<div id="project-list">
{% for item in work %}
{% assign id = item[0] %}
{% assign data = item[1] %}
<a class="{{ data.color }} project-item shadow" href="/experience/{{ id }}">
{% if data.image %}
<div class="space project-image-outer">
<img src="{{data.image}}" alt="{{data.title}}" class="project-image">
</div>
{% else %}
<div class="project-noimage" aria-hidden="true">Image Not Available</div>
{% endif %}
<div class="nav-link project-link r-icon" data-i="arrow_right">
{{ data.title }}
<!-- Add the subtitle, if it exists. -->
{% if data.subtitle %}
<span>:</span>
&nbsp;
<p>{{ data.subtitle }}</p>
{% endif %}
</div>
</a>
{% endfor %}
</div>
</section>

View File

@@ -1,120 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="This is the home page of Maxim Voldman Hutz's personal website.">
<link rel="icon" type="image/x-icon" href="/res/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,500,1,200">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;900&display=swap">
<link rel="stylesheet" href="/styles.css">
<link rel="stylesheet" href="index.css">
<title>Max Hutz</title>
</head>
<body>
<div id="header-outer" class="light width-pad shadow">
<header>
<a href="#" class="nav-link dark">MAX HUTZ</a>
<div class="flex"></div>
<a href="/experience" class="nav-link dark icon nav3" data-i="work">Experience</a>
<a href="/resume" class="nav-link dark icon nav3" data-i="clinical_notes">Resume</a>
<a href="mailto:maximhutz@gmail.com" class="nav-link dark icon nav3" data-i="mail">Contact</a>
<a href="/experience" class="nav-link dark icon nav2" data-i="work" aria-label="Experience"></a>
<a href="/resume" class="nav-link dark icon nav2" data-i="clinical_notes" aria-label="Resume"></a>
<a href="mailto:maximhutz@gmail.com" class="nav-link dark icon nav2" data-i="mail" aria-label="Contact"></a>
<button class="nav-link dark icon nav1" data-i="menu" aria-label="Menu" onclick="document.getElementById('menu')?.showModal()"></button>
</header>
</div>
<div class="light width-pad">
<section id="about">
<div class="flex"></div>
<div class="flex"></div>
<div>
<h1>Hey! 👋 <span class="pre">I'm Max Hutz.</span></h1>
<i>Software engineer in New York.</i>
</div>
<p id="about-me">
Im a passionate computer science student skilled in building
responsive, full-stack applications. I love learning from colleagues
and teaching future developers. I thrive where teamwork and creativity
are key.
</p>
<hr class="darker">
<nav>
<div id="inner-nav">
<a href="mailto:maximhutz@gmail.com" class="nav-link blue button flex">maximhutz@gmail.com</a>
<a href="/resume" class="nav-link red button r-icon flex" data-i="arrow_right" target="_blank">View Resume</a>
</div>
<div class="space"></div>
</nav>
<div class="flex"></div>
</section>
</div>
<div class="dark width-pad">
<section id="projects">
<h2>Worked on:</h2>
<div id="project-list">
<a class="yellow project-item shadow" href="/experience/malung">
<div class="space"></div>
<div class="nav-link project-link r-icon" data-i="arrow_right">Malung: COVID-19 Classifier</div>
</a>
<a class="blue project-item shadow" href="/experience/freshmanual">
<div class="space"></div>
<div class="nav-link project-link r-icon" data-i="arrow_right">Freshmanual: Mobile App</div>
</a>
<a class="green project-item shadow" href="/experience/pollbuddy">
<div class="space"></div>
<div class="nav-link project-link r-icon" data-i="arrow_right">Poll Buddy</div>
</a>
<a class="red project-item shadow" href="/experience/rpi-crisis">
<div class="space"></div>
<div class="nav-link project-link r-icon" data-i="arrow_right">CRISIS</div>
</a>
</div>
<hr class="lighter">
<a href="/experience" id="experience-button" class="nav-link white button">View all experiences.</a>
</section>
</div>
<div id="footer-pad" class="dark width-pad">
<footer>
<h2>&copy; 2022</h2>
<div class="flex"></div>
<a href="https://github.com/MajorDroolz" class="png-icon" target="_blank">
<img src="/res/icons/github.png" alt="GitHub" width="30" height="30">
</a>
<a href="https://www.linkedin.com/in/maximhutz/" class="png-icon" target="_blank">
<img src="/res/icons/linkedin.png" alt="LinkedIn" width="30" height="30">
</a>
<a href="mailto:maximhutz@gmail.com" class="nav-link white icon" data-i="mail" aria-label="Contact" target="_blank"></a>
</footer>
</div>
<dialog id="menu">
<div class="light width-pad shadow">
<div id="menu-inner">
<div id="menu-top">
<a href="/home" class="nav-link dark">MAX HUTZ</a>
<div class="flex"></div>
<form method="dialog">
<button class="nav-link dark icon" data-i="close" aria-label="Close"></button>
</form>
</div>
<a href="/experience" class="nav-link dark icon" data-i="work">Experience</a>
<a href="/resume" class="nav-link dark icon" data-i="clinical_notes">Resume</a>
<a href="mailto:maximhutz@gmail.com" class="nav-link dark icon" data-i="mail">Contact</a>
</div>
</div>
</dialog>
</body>
</html>

View File

@@ -1,7 +1,55 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Refresh" content="0; url=resume">
<link rel="stylesheet" href="/styles.css">
</head>
</html>
---
title: Home
description: This is the home page of Maxim Voldman Hutz's personal website.
layout: default
---
{% assign home = site.data.home %}
{% assign work = site.data.work %}
<section id="about" class="light back">
<div class="flex"></div>
<div class="flex"></div>
<div>
<h1>{{ home.welcome }}</h1>
<i>{{ home.status }}</i>
</div>
<p id="about-me">{{ home.about }}</p>
<hr class="darker">
<nav>
<div id="inner-nav">
<a href="mailto:{{ home.email }}" class="nav-link blue button flex">{{ home.email }}</a>
<a href="/resume" class="nav-link red button r-icon flex" data-i="arrow_right" target="_blank">View Resume</a>
</div>
<div class="space"></div>
</nav>
<div class="flex"></div>
</section>
<section id="projects" class="dark back">
<h2>Worked on:</h2>
<div id="project-list">
{% for project in home.featured %}
<a class="{{ work[project].color }} project-item shadow" href="/experience/{{ project }}">
{% if work[project].image %}
<div class="space project-image-outer">
<img src="{{work[project].image}}" alt="{{work[project].title}}" class="project-image">
</div>
{% else %}
<div class="project-noimage" aria-hidden="true">Image Not Available</div>
{% endif %}
<div class="nav-link project-link r-icon" data-i="arrow_right">
{{ work[project].title }}
<!-- Add the subtitle, if it exists. -->
{% if work[project].subtitle %}
<span>:</span>
&nbsp;
<p>{{ work[project].subtitle }}</p>
{% endif %}
</div>
</a>
{% endfor %}
</div>
<hr class="lighter">
<a href="/experiences" id="experience-button" class="nav-link white button">View all experiences.</a>
</section>

BIN
res/.DS_Store vendored

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

BIN
res/icons/.DS_Store vendored

Binary file not shown.

BIN
res/icons/github.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
res/icons/linkedin.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

BIN
res/projects/malung.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

BIN
res/projects/pollbuddy.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -3,7 +3,7 @@
<head>
<title>Resume of Maxim Voldman Hutz</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="This page holds a preview of the resume of Maxim Voldman Hutz.">
<meta name="description" content="A preview of the resume of Maxim Voldman Hutz.">
<!-- Header metadata. -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
@@ -16,8 +16,8 @@
">
<!-- Resume styling. -->
<link rel="preload stylesheet" as="style" href="/styles.css">
<link rel="preload stylesheet" as="style" href="index.css">
<link rel="preload stylesheet" as="style" href="/styles/global.css">
<link rel="preload stylesheet" as="style" href="/styles/resume.css">
<!-- Site's Icon -->
<link rel="icon" type="image/png" href="/res/favicon.ico">

View File

@@ -1,38 +0,0 @@
* {
padding: 0;
border: 0;
margin: 0;
outline: 0;
}
:root {
--light: #FEFADC;
--dark: #504B43;
--red: #EC1B24;
--yellow: #E19200;
--green: #4CB753;
--blue: #2B9EB3;
--timing: cubic-bezier(0.2, 1, 0, 1);
--start-timing: cubic-bezier(0,.5,0,.9);
--grad: linear-gradient(45deg, #F008, #00F8);
--shadow: 0px 10px 50px 0 #0008;
}
.light { --color: var(--light) }
.dark { --color: var(--dark) }
.red { --color: var(--red) }
.yellow { --color: var(--yellow) }
.green { --color: var(--green) }
.blue { --color: var(--blue) }
.white { --color: white }
.flex-space, .flex { flex-grow: 1 }
.space { flex: 1000 }
/*----------------------------------------------------------------------------*/
html {
background: var(--dark);
}

30
styles/404.css Normal file
View File

@@ -0,0 +1,30 @@
#notfound {
--color: var(--dark) linear-gradient(#0000, #0003);
flex: 99999999999999;
display: flex;
justify-content: center;
align-items: center;
color: white;
flex-direction: column;
gap: 20px;
}
#notfound > * {
max-width: 300px;
}
#text-outer > i {
font-size: 30px;
}
#text-outer {
display: inline-flex;
flex-direction: column;
align-items: center;
font-size: 25px;
}
#text-404 {
font-size: 160px;
line-height: 1;
}

View File

@@ -1,5 +1,23 @@
html {
scroll-behavior: smooth;
background-image: linear-gradient(#0003 0% 50%, #0000 50% 100%),
linear-gradient(var(--dark) 0% 50%, var(--light) 50% 100%);
}
body {
display: flex;
flex-direction: column;
min-height: 100vh;
width: min(100vw, 1024px);
box-sizing: border-box;
margin: auto;
padding: 0 20px;
line-height: 1.2;
}
/*----------------------------------------------------------------------------*/
* {
overflow: hidden;
text-decoration: none;
}
@@ -7,20 +25,6 @@ button {
background-color: transparent;
}
body {
display: flex;
align-items: center;
flex-direction: column;
justify-content: flex-start;
width: 100vw;
overflow-y: scroll;
}
html {
overflow-y: scroll;
scroll-behavior: smooth;
}
.pre {
all: unset;
white-space: pre;
@@ -41,18 +45,21 @@ html {
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.icon::before {
font-family: 'Material Symbols Outlined';
content: attr(data-i);
font-size: 36px;
width: 1em;
margin-right: 5px;
}
.r-icon::after {
font-family: 'Material Symbols Outlined';
content: attr(data-i);
width: 1em;
margin-left: 5px;
}
@@ -70,15 +77,24 @@ h2 {
i {
font-size: 20px;
font-size: "Source Serif Pro";
font-family: "Source Serif Pro";
}
p {
p, section {
font-size: 20px;
font-family: "Open Sans";
font-weight: 100;
}
ul {
list-style-type: "- ";
padding-left: 2ch;
}
li {
padding-bottom: 20px;
}
.lighter {
background: #fff4;
}
@@ -96,6 +112,7 @@ hr {
color: var(--color);
position: relative;
padding: 10px 30px;
font-size: 20px;
}
.button::before {
@@ -123,26 +140,6 @@ hr {
/*----------------------------------------------------------------------------*/
#header-outer {
position: fixed;
top: 0;
left: 0;
z-index: 100;
}
header {
margin: auto;
max-width: 1024px;
display: flex;
gap: 40px;
font-size: 25px;
font-family: "Open Sans";
font-weight: bolder;
color: var(--dark);
align-items: center;
box-sizing: border-box;
}
#about {
position: relative;
margin: auto;
@@ -151,9 +148,8 @@ header {
justify-content: center;
align-items: flex-start;
max-width: 1024px;
min-height: 90vh;
min-height: 85vh;
color: var(--dark);
padding-top: 30px;
box-sizing: border-box;
gap: 30px;
}
@@ -178,7 +174,7 @@ nav {
/*----------------------------------------------------------------------------*/
#projects {
margin: 30px auto;
padding: 30px 0;
position: relative;
display: flex;
flex-direction: column;
@@ -199,7 +195,7 @@ nav {
}
.project-item {
min-width: max(40%, 300px);
min-width: min(max(40%, 400px), 100%);
flex: 1;
height: 300px;
background-color: var(--color);
@@ -220,19 +216,6 @@ nav {
align-self: center;
}
#footer-pad {
background: var(--dark) linear-gradient(#0002, #0002);
}
footer {
display: flex;
align-items: center;
color: white;
max-width: 1024px;
margin: auto;
gap: 10px;
}
/*----------------------------------------------------------------------------*/
#menu {
@@ -282,3 +265,32 @@ footer {
display: none;
}
}
.project-noimage {
color: #0002;
font-size: 40px;
font-family: "Open Sans";
font-weight: 900;
display: flex;
flex: 1000;
justify-content: center;
align-items: center;
text-align: center;
box-sizing: border-box;
padding: 10px;
}
.project-image-outer {
position: relative;
justify-content: center;
align-items: center;
}
.project-image {
position: absolute;
max-height: 100%;
max-width: 100%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

83
styles/experience.css Normal file
View File

@@ -0,0 +1,83 @@
#banner {
margin-top: 10px;
padding: 20px 0;
display: flex;
justify-content: space-between;
align-items: center;
line-height: 1;
}
#experience {
color: white;
gap: 30px;
display: flex;
flex-direction: column;
align-items: flex-start;
}
#content {
display: flex;
flex-wrap: wrap-reverse;
align-items: flex-end;
gap: 30px;
padding-bottom: 30px;
}
#image {
background-color: #ccc;
border-radius: 10px;
height: 300px;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
color: #aaa;
position: relative;
text-align: center;
padding: 10px;
hyphens: manual;
box-sizing: border-box;
}
#description {
flex: 1;
gap: 30px;
display: flex;
flex-direction: column;
align-items: flex-start;
min-width: min(300px, 100%);
}
#image-side {
flex: 1;
gap: 20px;
display: flex;
flex-direction: column;
align-items: flex-start;
min-width: min(500px, 100%);
}
#stack {
display: flex;
gap: 10px;
flex-flow: row wrap;
}
#stack .chip {
flex-grow: 1;
}
#stack::after {
content: "";
flex: 1000000;
}
#image-inner {
max-width: 100%;
max-height: 100%;
}
#close-icon {
font-size: 36px;
line-height: 1;
}

12
styles/footer.css Normal file
View File

@@ -0,0 +1,12 @@
footer {
display: flex;
align-items: center;
color: white;
max-width: 1024px;
margin: auto;
gap: 10px;
}
footer::before {
filter: brightness(0.8);
}

71
styles/global.css Normal file
View File

@@ -0,0 +1,71 @@
* {
padding: 0;
border: 0;
margin: 0;
outline: 0;
}
:root {
--light: #FEFADC;
--dark: #504B43;
--red: #EC1B24;
--yellow: #E19200;
--green: #4CB753;
--blue: #2B9EB3;
--timing: cubic-bezier(0.2, 1, 0, 1);
--start-timing: cubic-bezier(0,.5,0,.9);
--grad: linear-gradient(45deg, #F008, #00F8);
--shadow: 0px 10px 50px 0 #0008;
--width: 1024px;
}
.light { --color: var(--light) }
.dark { --color: var(--dark) }
.red { --color: var(--red) }
.yellow { --color: var(--yellow) }
.green { --color: var(--green) }
.blue { --color: var(--blue) }
.white { --color: white }
.malung { --color: #F76F8E }
.freshmanual { --color: #3b91db }
.pollbuddy { --color: #7f6491 }
.rpi-crisis { --color: #a06ce4 }
.flex-space, .flex, br { flex-grow: 1 }
.flex.dark { background-color: var(--dark) }
.space { flex: 1000 }
.npad { padding: 0 !important }
/*----------------------------------------------------------------------------*/
html {
background-color: var(--dark);
}
/*----------------------------------------------------------------------------*/
.back {
position: relative;
padding: 10px 0;
width: min(100vw, 1024px, 100%);
box-sizing: border-box;
}
.back::before {
background: var(--color);
width: 100vw;
height: 100%;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
content: "";
z-index: -1;
}
.dark-back::before {
filter: brightness(0.8);
}

13
styles/header.css Normal file
View File

@@ -0,0 +1,13 @@
header {
position: sticky !important;
top: 0;
z-index: 10000;
display: flex;
gap: 40px;
font-size: 25px;
font-family: "Open Sans";
font-weight: bolder;
color: var(--dark);
align-items: center;
}

24
styles/tech.scss Normal file
View File

@@ -0,0 +1,24 @@
---
---
.chip {
font-size: 15px;
font-family: "Open Sans";
font-weight: 900;
display: inline-flex;
justify-content: center;
align-items: center;
padding: 5px 20px;
border-radius: 10px;
text-decoration: none;
}
{% for tech in site.data.techs %}
{% assign id = tech[0] %}
{% assign data = tech[1] %}
.chip.{{id}} {
background: {{data.back}};
color: {{data.fore}};
}
{% endfor %}

59
terraform/main.tf Normal file
View File

@@ -0,0 +1,59 @@
# Create the S3 bucket.
resource "aws_s3_bucket" "portfolio_bucket" {
bucket = var.bucket_name
tags = {
Name = "Portfolio Bucket"
Environment = "Production"
}
}
resource "aws_s3_bucket_public_access_block" "portfolio_bucket_access" {
bucket = aws_s3_bucket.portfolio_bucket.id
block_public_acls = false
block_public_policy = false
}
resource "aws_s3_bucket_versioning" "portfolio_bucket_access_versioning" {
bucket = aws_s3_bucket.portfolio_bucket.id
versioning_configuration {
status = "Disabled"
}
}
#------------------------------------------------------------------------------#
# Give a user access.
data "aws_iam_policy_document" "portfolio_bucket_policy_doc" {
statement {
effect = "Allow"
actions = ["s3:*", "s3-object-lambda:*"]
resources = [
"${aws_s3_bucket.portfolio_bucket.arn}/*",
"${aws_s3_bucket.portfolio_bucket.arn}"
]
}
}
resource "aws_iam_policy" "portfolio_bucket_policy" {
name = "${var.role_name}Policy"
description = "The policy that manages the Portfolio Bucket."
policy = data.aws_iam_policy_document.portfolio_bucket_policy_doc.json
}
resource "aws_iam_user" "portfolio_bucket_user" {
name = "${var.role_name}User"
}
resource "aws_iam_user_policy_attachment" "portfolio_bucket_attachment" {
user = aws_iam_user.portfolio_bucket_user.name
policy_arn = aws_iam_policy.portfolio_bucket_policy.arn
}
resource "aws_iam_access_key" "portfolio_bucket_key" {
user = aws_iam_user.portfolio_bucket_user.name
}

16
terraform/outputs.tf Normal file
View File

@@ -0,0 +1,16 @@
output "access_region" {
value = aws_s3_bucket.portfolio_bucket.region
description = "This is the region of the bucket."
}
output "access_id" {
value = aws_iam_access_key.portfolio_bucket_key.id
description = "This is the access ID to modify the bucket."
sensitive = true
}
output "access_secret" {
value = aws_iam_access_key.portfolio_bucket_key.secret
description = "This is the access secret to modify the bucket."
sensitive = true
}

9
terraform/variables.tf Normal file
View File

@@ -0,0 +1,9 @@
variable "bucket_name" {
type = string
description = "The name of the bucket to create."
}
variable "role_name" {
type = string
description = "The base name for the role to modify the bucket."
}