├── img ├── api_logo.webp ├── aws_logo.webp ├── favicon.webp ├── java_logo.webp ├── python_logo.webp ├── steven_platt.webp ├── twilio_logo.webp ├── twitter_logo.webp └── screenshots │ ├── blog_page.png │ ├── about_page.png │ ├── page_speed.png │ ├── resume_page.png │ ├── blog_post_page.png │ ├── mobile_layout.png │ ├── portfolio_page.png │ ├── research_page.png │ ├── mobile_about_page.png │ └── mobile_blog_page.png ├── examples └── telecomsteve │ ├── img │ ├── gemeni.jpg │ ├── gemini.webp │ ├── yoptio.png │ ├── api_logo.webp │ ├── aws_logo.webp │ ├── favicon.webp │ ├── gcp_logo.jpg │ ├── stackdyno.png │ ├── java_logo.webp │ ├── python_logo.webp │ ├── twilio_logo.webp │ ├── telecomsteve.webp │ └── twitter_logo.webp │ ├── sidenav.html │ ├── 404.html │ ├── index.html │ ├── portfolio.html │ ├── resume.html │ └── publications.html ├── sidenav.html ├── LICENSE ├── 404.html ├── .devcontainer ├── devcontainer.json └── Dockerfile ├── index.html ├── blog.html ├── blog-posts └── post-04-27-2021.html ├── .github └── workflows │ └── ci.yml ├── js └── nav-loader.js ├── .gitignore ├── Makefile ├── resume.html ├── portfolio.html ├── README.md ├── css └── stylesheet.css └── research.html /img/api_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/api_logo.webp -------------------------------------------------------------------------------- /img/aws_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/aws_logo.webp -------------------------------------------------------------------------------- /img/favicon.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/favicon.webp -------------------------------------------------------------------------------- /img/java_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/java_logo.webp -------------------------------------------------------------------------------- /img/python_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/python_logo.webp -------------------------------------------------------------------------------- /img/steven_platt.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/steven_platt.webp -------------------------------------------------------------------------------- /img/twilio_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/twilio_logo.webp -------------------------------------------------------------------------------- /img/twitter_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/twitter_logo.webp -------------------------------------------------------------------------------- /img/screenshots/blog_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/blog_page.png -------------------------------------------------------------------------------- /img/screenshots/about_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/about_page.png -------------------------------------------------------------------------------- /img/screenshots/page_speed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/page_speed.png -------------------------------------------------------------------------------- /img/screenshots/resume_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/resume_page.png -------------------------------------------------------------------------------- /img/screenshots/blog_post_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/blog_post_page.png -------------------------------------------------------------------------------- /img/screenshots/mobile_layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/mobile_layout.png -------------------------------------------------------------------------------- /img/screenshots/portfolio_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/portfolio_page.png -------------------------------------------------------------------------------- /img/screenshots/research_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/research_page.png -------------------------------------------------------------------------------- /examples/telecomsteve/img/gemeni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/gemeni.jpg -------------------------------------------------------------------------------- /examples/telecomsteve/img/gemini.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/gemini.webp -------------------------------------------------------------------------------- /examples/telecomsteve/img/yoptio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/yoptio.png -------------------------------------------------------------------------------- /img/screenshots/mobile_about_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/mobile_about_page.png -------------------------------------------------------------------------------- /img/screenshots/mobile_blog_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/img/screenshots/mobile_blog_page.png -------------------------------------------------------------------------------- /examples/telecomsteve/img/api_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/api_logo.webp -------------------------------------------------------------------------------- /examples/telecomsteve/img/aws_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/aws_logo.webp -------------------------------------------------------------------------------- /examples/telecomsteve/img/favicon.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/favicon.webp -------------------------------------------------------------------------------- /examples/telecomsteve/img/gcp_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/gcp_logo.jpg -------------------------------------------------------------------------------- /examples/telecomsteve/img/stackdyno.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/stackdyno.png -------------------------------------------------------------------------------- /examples/telecomsteve/img/java_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/java_logo.webp -------------------------------------------------------------------------------- /examples/telecomsteve/img/python_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/python_logo.webp -------------------------------------------------------------------------------- /examples/telecomsteve/img/twilio_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/twilio_logo.webp -------------------------------------------------------------------------------- /examples/telecomsteve/img/telecomsteve.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/telecomsteve.webp -------------------------------------------------------------------------------- /examples/telecomsteve/img/twitter_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenplatt/ResearchEng-Portfolio/HEAD/examples/telecomsteve/img/twitter_logo.webp -------------------------------------------------------------------------------- /examples/telecomsteve/sidenav.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |
7 | 8 |
9 | 17 | 22 |
-------------------------------------------------------------------------------- /sidenav.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |
7 | 8 |
9 | 18 | 23 |
-------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Steven Platt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 404 - telecomsteve 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 |

404 - Page Not Found

20 | 21 |

Oops! Looks like you've wandered into uncharted territory.

22 |

The page you're looking for doesn't exist or has been moved.

23 | 24 | 29 |
30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ResearchEng Portfolio Dev Environment", 3 | "image": "mcr.microsoft.com/devcontainers/base:debian-12", 4 | "mounts": [ 5 | "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig,type=bind,readonly", 6 | "source=${localEnv:HOME}/.ssh,target=/home/vscode/.ssh,type=bind,readonly" 7 | ], 8 | "features": { 9 | "ghcr.io/devcontainers/features/node:1": { 10 | "version": "18" 11 | }, 12 | "ghcr.io/devcontainers/features/python:1": { 13 | "version": "3.11" 14 | } 15 | }, 16 | "customizations": { 17 | "vscode": { 18 | "extensions": [ 19 | "ritwickdey.LiveServer", 20 | "esbenp.prettier-vscode", 21 | "vscode-icons-team.vscode-icons", 22 | "formulahendry.auto-close-tag", 23 | "formulahendry.auto-rename-tag" 24 | ], 25 | "settings": { 26 | "editor.formatOnSave": true 27 | } 28 | } 29 | }, 30 | "postCreateCommand": "npm install -g http-server", 31 | "forwardPorts": [8080, 8081], 32 | "remoteUser": "vscode" 33 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | Steven Platt 19 |
20 | 21 |
22 |

Steven Platt

23 | 24 |

Hi, I'm Steven, but you can call me telecomsteve.

25 |

I am a backend research engineer and developer. Welcome to my website.

26 | 30 |
31 |
32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /examples/telecomsteve/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 404 - telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 |

404 - Page Not Found

19 | 20 |

Oops! Looks like you've wandered into uncharted territory.

21 |

The page you're looking for doesn't exist or has been moved.

22 | 23 | 28 |
29 |
30 | 31 | 32 | -------------------------------------------------------------------------------- /blog.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |

Research Blog

18 |

The occasional technology musing as well as research in progress.


19 | 20 |
21 |
22 |

Apr 27 2021

23 | How to deploy a static website to Amazon S3 24 |
25 |
26 |

Jun 7 2020

27 | Placeholder 28 |
29 |
30 |

Jan 2 2020

31 | Placeholder 32 |
33 |
34 | 35 |
36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /examples/telecomsteve/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | Steven Platt 19 |
20 | 21 |
22 |

Steven Platt, PhD

23 | 24 |

Hi, I'm Steven, but you can call me telecomsteve.

25 |

I am a staff infrastructure engineer and creator of the Yoptio AI RSS Reader.

26 | 30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/devcontainers/base:debian-12 2 | 3 | # Install essential development tools 4 | RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 5 | && apt-get -y install --no-install-recommends \ 6 | make \ 7 | curl \ 8 | git \ 9 | build-essential \ 10 | ca-certificates \ 11 | gnupg \ 12 | && apt-get clean \ 13 | && rm -rf /var/lib/apt/lists/* 14 | 15 | # Install Node.js 16 | RUN mkdir -p /etc/apt/keyrings \ 17 | && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ 18 | && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ 19 | && apt-get update \ 20 | && apt-get -y install --no-install-recommends nodejs \ 21 | && apt-get clean \ 22 | && rm -rf /var/lib/apt/lists/* 23 | 24 | # Install Python and pip 25 | RUN apt-get update \ 26 | && apt-get -y install --no-install-recommends \ 27 | python3 \ 28 | python3-pip \ 29 | python3-venv \ 30 | && apt-get clean \ 31 | && rm -rf /var/lib/apt/lists/* 32 | 33 | # Install dependencies 34 | RUN npm install -g http-server 35 | 36 | # Set the default shell to bash with pipefail option 37 | SHELL ["/bin/bash", "-o", "pipefail", "-c"] -------------------------------------------------------------------------------- /blog-posts/post-04-27-2021.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |

How to deploy a static website to Amazon S3

18 |

These instructions also cover enabling SSL and redirecting the apex domain


19 | 20 |

Dec 30 2021: Steven Platt


21 | 22 |

Using Amazon S3 storage is cost effective and reliable way to serve a static website without having to worry web server software. 23 | Unfortunately, navigating the many AWS services and corresponding tutorials means that the required information is often not all in one place. 24 | This article will walk through the steps required to launch an S3-based static website end-to-end and is split into four parts: 25 |

26 |

27 |

    28 |
  1. Deploying the base website using Amazon S3
  2. 29 |
  3. Configuring DNS using AWS Route53
  4. 30 |
  5. Enable SSL for the website using AWS CloudFront
  6. 31 |
  7. Adding a DNS redirect to allow name resolution without including "www"
  8. 32 |
33 |


34 |

35 |

Deploying the base website using Amazon S3

36 |

37 | 38 | To be continued... 39 | 40 |
41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI/CD Suite 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | # Ensure only one workflow runs at a time 10 | concurrency: 11 | group: ${{ github.workflow }}-${{ github.ref }} 12 | cancel-in-progress: true 13 | 14 | jobs: 15 | deploy: 16 | runs-on: ubuntu-24.04 17 | steps: 18 | - name: Checkout code 19 | uses: actions/checkout@v4 20 | 21 | - name: Google Auth 22 | id: auth 23 | uses: 'google-github-actions/auth@v2' 24 | with: 25 | credentials_json: '${{ secrets.GOOGLE_CREDENTIALS }}' 26 | 27 | - name: Setup Cloud SDK 28 | uses: 'google-github-actions/setup-gcloud@v2' 29 | 30 | - name: Upload Demo Website 31 | run: | 32 | gcloud components install gsutil 33 | gsutil -m cp 404.html gs://demo.telecomsteve.com/ 34 | gsutil -m cp index.html gs://demo.telecomsteve.com/ 35 | gsutil -m cp portfolio.html gs://demo.telecomsteve.com/ 36 | gsutil -m cp research.html gs://demo.telecomsteve.com/ 37 | gsutil -m cp resume.html gs://demo.telecomsteve.com/ 38 | gsutil -m cp sidenav.html gs://demo.telecomsteve.com/ 39 | gsutil -m cp blog.html gs://demo.telecomsteve.com/ 40 | gsutil -m cp -r blog-posts gs://demo.telecomsteve.com/ 41 | gsutil -m cp -r css gs://demo.telecomsteve.com/ 42 | gsutil -m cp -r img gs://demo.telecomsteve.com/ 43 | gsutil -m cp -r js gs://demo.telecomsteve.com/ 44 | gsutil -m cp LICENSE gs://demo.telecomsteve.com/ 45 | gsutil -m cp README.md gs://demo.telecomsteve.com/ 46 | gsutil web set -m index.html -e 404.html gs://demo.telecomsteve.com/ 47 | 48 | - name: Upload Production Website 49 | run: | 50 | gsutil -m cp -r examples/telecomsteve/* gs://telecomsteve.com/ 51 | gsutil web set -m index.html -e 404.html gs://telecomsteve.com/ -------------------------------------------------------------------------------- /js/nav-loader.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', () => { 2 | const pathParts = window.location.pathname.split('/').filter(part => part.length > 0); 3 | const depth = Math.max(0, pathParts.length - 1); 4 | const pathToRoot = depth === 0 ? './' : '../'.repeat(depth); 5 | 6 | fetch(`${pathToRoot}sidenav.html`) 7 | .then(response => response.text()) 8 | .then(data => { 9 | document.getElementById('nav-placeholder').innerHTML = data; 10 | 11 | const currentPage = pathParts[pathParts.length - 1] || 'index.html'; 12 | 13 | const navLinks = document.querySelectorAll('.navblock_text a'); 14 | navLinks.forEach(link => { 15 | link.href = `${pathToRoot}${link.getAttribute('href').replace('./', '')}`; 16 | if (link.getAttribute('href').endsWith(currentPage)) { 17 | link.style.color = '#3498DB'; 18 | } 19 | }); 20 | 21 | // Add hamburger menu functionality 22 | const hamburger = document.querySelector('.hamburger-menu'); 23 | const sidenav = document.querySelector('.sidenav'); 24 | 25 | function toggleMenu() { 26 | hamburger.classList.toggle('change'); 27 | sidenav.classList.toggle('active'); 28 | // Toggle body scroll 29 | document.body.classList.toggle('no-scroll'); 30 | } 31 | 32 | hamburger.addEventListener('click', toggleMenu); 33 | 34 | const allNavLinks = document.querySelectorAll('.sidenav a'); 35 | allNavLinks.forEach(link => { 36 | link.addEventListener('click', () => { 37 | if (window.innerWidth <= 1100) { 38 | toggleMenu(); 39 | } 40 | }); 41 | }); 42 | 43 | window.addEventListener('resize', () => { 44 | if (window.innerWidth > 1100 && sidenav.classList.contains('active')) { 45 | toggleMenu(); 46 | } 47 | }); 48 | }) 49 | .catch(error => console.error('Error loading navigation:', error)); 50 | }); -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | *DS_store* -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for ResearchEng-Portfolio 2 | 3 | .PHONY: help install demo telecomsteve clean validate deploy-demo deploy-telecomsteve 4 | 5 | # Default target 6 | help: 7 | @echo "Available commands:" 8 | @echo " make install - Install dependencies (http-server)" 9 | @echo " make demo - Run local development server" 10 | @echo " make telecomsteve - Run local development server" 11 | @echo " make clean - Clean any temporary files" 12 | @echo " make validate - Validate HTML files" 13 | @echo " make deploy-demo - Deploy to demo environment (requires GCP credentials)" 14 | @echo " make deploy-prod - Deploy to production environment (requires GCP credentials)" 15 | 16 | # Install dependencies 17 | install: 18 | @echo "Installing dependencies..." 19 | sudo npm install http-server -g 20 | 21 | # Run local development server 22 | demo: 23 | @echo "Starting local server on http://localhost:8080" 24 | npx http-server -p 8080 -o 25 | 26 | # Run local development server using telecomsteve example code 27 | telecomsteve: 28 | @echo "Starting telecomsteve example site on http://localhost:8081" 29 | npx http-server examples/telecomsteve -p 8081 -o 30 | 31 | # Clean any temporary files 32 | clean: 33 | @echo "Cleaning temporary files..." 34 | find . -name '*DS_Store*' -type f -delete 35 | find . -name '*.log' -type f -delete 36 | 37 | # Deploy to demo environment (Google Cloud Storage) 38 | deploy-demo: 39 | @echo "Deploying to demo environment..." 40 | gsutil -m cp 404.html gs://demo.telecomsteve.com/ 41 | gsutil -m cp index.html gs://demo.telecomsteve.com/ 42 | gsutil -m cp portfolio.html gs://demo.telecomsteve.com/ 43 | gsutil -m cp research.html gs://demo.telecomsteve.com/ 44 | gsutil -m cp resume.html gs://demo.telecomsteve.com/ 45 | gsutil -m cp sidenav.html gs://demo.telecomsteve.com/ 46 | gsutil -m cp blog.html gs://demo.telecomsteve.com/ 47 | gsutil -m cp -r blog-posts gs://demo.telecomsteve.com/ 48 | gsutil -m cp -r css gs://demo.telecomsteve.com/ 49 | gsutil -m cp -r img gs://demo.telecomsteve.com/ 50 | gsutil -m cp -r js gs://demo.telecomsteve.com/ 51 | gsutil -m cp LICENSE gs://demo.telecomsteve.com/ 52 | gsutil -m cp README.md gs://demo.telecomsteve.com/ 53 | gsutil web set -m index.html -e 404.html gs://demo.telecomsteve.com/ 54 | @echo "Demo deployment complete: https://demo.telecomsteve.com" 55 | 56 | # Deploy to production environment (Google Cloud Storage) 57 | deploy-telecomsteve: 58 | @echo "Deploying to production environment..." 59 | gsutil -m cp -r examples/telecomsteve/* gs://telecomsteve.com/ 60 | gsutil web set -m index.html -e 404.html gs://telecomsteve.com/ 61 | @echo "Production deployment complete: https://telecomsteve.com" -------------------------------------------------------------------------------- /resume.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |

Steven Platt

18 |

Backend research engineer and developer. Member IEEE.

19 |

Email: steven@ieee.org, San Francisco, California, US

20 |
21 | 22 |

Technical Skills

23 | 28 |
29 | 30 |

Education

31 | 37 |
38 | 39 |

Experience

40 | 41 |

Pompeu Fabra University

42 |

Doctoral Researcher, Barcelona, Spain, 2018-current

43 | 48 | 49 |

Twitter.com

50 |

Systems Engineer II - Global Office Expansion, San Francisco, US, 2014-2017

51 | 57 | 58 |

Salesforce.com

59 |

Network Engineer - Infrastructure Operations, San Francisco, US, 2012-2014

60 | 64 | 65 |

Caterpillar Inc

66 |

Information Technology Analyst II, Peoria, US, 2007-2012

67 | 71 |
72 | 73 |

Open Source Contributions

74 | 77 |
78 | 79 |

Languages

80 | 84 |
85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /portfolio.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |

Backend Portfolio

18 |

A selection of my cloud native and backend systems programming.

19 | 20 |
21 |
22 |

telecomsteve.com

23 | 24 |

Telecomsteve is a flat file portfolio website template designed to be lightweight, easy to maintain, and run directly from within Amazon S3. 25 | Amazon Route53 is used for domain routing combined with Amazon Cloudfront for CDN compression and caching. 26 | With no scripting, external fonts or libraries, the site receives a score of 100/100 from Google Page Speed Index for both desktop and mobile.

27 | 28 |

Gitub Source

29 |
30 |
31 | Amazon Web Services 32 |
33 |
34 | 35 |
36 |
37 |

Blockchain for OpenWRT

38 | 39 |

A compact and resource-light blockchain designed to run on the OpenWRT WiFi router platform. 40 | Written in the Python, the blockchain uses Python Flask to deliver its API interface which includes functions for managing network peers, issuing blocks, and running network consesus.

41 | 42 |

Gitub Source

43 |
44 |
45 | Python API 46 |
47 |
48 | 49 |
50 |
51 |

5G Mobility Simulator

52 | 53 |

A simulator to recreate the mobility and tower association of a device in a 5G network. 54 | The system uses random walk behavior and monte carlo sampling to show connection behavior across 10,000 simulations.

55 |

Gitub Source

56 |
57 |
58 | Python Programming 59 |
60 |
61 | 62 |
63 |
64 |

SIP Trunking at Twitter

65 | 66 |

During periods of early growth, Twitter deployed a number of isolated and non-standard phone systems that had become expensive and difficult to support. 67 | To manage the complexity, Twitter hired me to unify its networks and migrate them to cloud deployment. 68 | 69 | The result was a fully virtualized phone network, combined with a Twilio Cloud SIP trunking. 70 | This new design reduced recurring carrier costs 72%. 71 |

72 | 73 |

Watch Invited Talk

74 |
75 |
76 | Twilio 77 |
78 |
79 | 80 |
81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /examples/telecomsteve/portfolio.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |

Platform Portfolio

18 |

A selection of my infrastructure and full-stack projects.

19 | 20 | 35 | 36 |
37 |
38 |

Yoptio AI RSS Reader

39 | 40 |

Yoptio is an RSS reader with additional AI features baked-in. Beyond basic feed parsing, Yoptio uses AI to support article narration, article summaries, as well as a personalized daily podcast built from users' personal Yoptio activity and feeds. 41 | I build Yoptio from the ground up; UI, back-end, as well as testing and deployment-chain automations. 42 | Yoptio runs within Google Cloud and uses Google Vertex and Gemini AI to power it's AI features. 43 |

44 | 45 |

Try Yoptio

46 |
47 |
48 | Google Gemini Logo 49 |
50 |
51 | 52 |
53 |
54 |

SIP Trunking at Twitter

55 | 56 |

During periods of early growth, Twitter deployed a number of isolated and non-standard phone systems that had become expensive and difficult to support. 57 | To manage the complexity, Twitter hired me to unify its networks and migrate them to cloud deployment. 58 | 59 | The result was fully virtualized VoIP infrastructure, combined with a Twilio Cloud SIP trunking. 60 | This new design reduced Twitter's carrier costs 72%. 61 |

62 | 63 |

Watch Conference Talk

64 |
65 |
66 | Twitter 67 |
68 |
69 | 70 |
71 |
72 |

5G Mobility Simulator

73 | 74 |

A simulator to recreate the mobility and tower association of a device in a 5G network. 75 | The system uses random walk behavior and monte carlo sampling to show connection behavior across 10,000 simulations.

76 |

Gitub Source

77 |
78 |
79 | Python Programming 80 |
81 |
82 |
83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ResearchEng Portfolio 2 | 3 | An html portfolio website template for Research Engineers. 4 | 5 | [![CI/CD Suite](https://github.com/stevenplatt/ResearchEng-Portfolio/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/stevenplatt/ResearchEng-Portfolio/actions/workflows/ci.yml) 6 | 7 | **Demo Link**: 8 | 9 | ResearchEng Portfolio is a portfolio template designed to be fast and easy to maintain. It includes a section for research, which is often not included in standard developer portfolio templates. 10 | 11 | ## Table of Contents 12 | 13 | - [Features](#features) 14 | - [Demo](#demo) 15 | - [Development Environment](#development-environment) 16 | - [Using Dev Container](#using-dev-container) 17 | - [Manual Setup](#manual-setup) 18 | - [Using the Makefile](#using-the-makefile) 19 | - [Page Layouts](#page-layouts) 20 | - [Desktop Pages](#desktop-page-layouts) 21 | - [Mobile Pages](#mobile-page-layouts) 22 | - [Performance](#performance) 23 | - [Deployment](#deployment) 24 | - [Contributing](#contributing) 25 | - [License](#license) 26 | 27 | ## Features 28 | 29 | - Lightweight, responsive design 30 | - Research section for publications and academic work 31 | - Portfolio section for showcasing projects 32 | - Mobile-friendly with hamburger menu 33 | - Fast load times with minimal external dependencies 34 | - Easy to deploy on cloud storage 35 | 36 | ## Demo 37 | 38 | Check out the live demo at 39 | 40 | ## Development Environment 41 | 42 | ### Using Dev Container 43 | 44 | This project includes a dev container configuration that provides a consistent development environment with all necessary dependencies pre-installed. 45 | 46 | To use the dev container: 47 | 48 | 1. Ensure you have Docker and VS Code with the Remote - Containers extension installed 49 | 2. Open the project in VS Code 50 | 3. When prompted, click "Reopen in Container" or use the command palette (F1) and select "Remote-Containers: Reopen in Container" 51 | 4. The container will build and install all dependencies automatically 52 | 53 | The dev container includes: 54 | 55 | - Node.js 18 56 | - Python 3.11 57 | - http-server for local development 58 | - Useful VS Code extensions for web development 59 | 60 | ### Manual Setup 61 | 62 | If you prefer not to use the dev container, you can set up manually: 63 | 64 | ```bash 65 | # Install http-server globally 66 | npm install http-server -g 67 | 68 | # Clone the repository 69 | git clone https://github.com/stevenplatt/ResearchEng-portfolio.git 70 | 71 | # Navigate to project directory 72 | cd ResearchEng-portfolio/ 73 | ``` 74 | 75 | ## Using the Makefile 76 | 77 | The project includes a Makefile to simplify common development tasks: 78 | 79 | ```bash 80 | # View all available commands 81 | make help 82 | 83 | # Install dependencies 84 | make install 85 | 86 | # Start local development server for the main template 87 | make demo 88 | 89 | # Start local development server for the telecomsteve example 90 | make telecomsteve 91 | 92 | # Clean temporary files 93 | make clean 94 | 95 | # Deploy to demo environment (requires GCP credentials) 96 | make deploy-demo 97 | 98 | # Deploy to production environment (requires GCP credentials) 99 | make deploy-telecomsteve 100 | ``` 101 | 102 | ## Page Layouts 103 | 104 | ### Desktop Page Layouts 105 | 106 | #### About Page 107 | 108 | ![ResearchEng preview](img/screenshots/about_page.png) 109 | 110 | #### Resume Page 111 | 112 | ![ResearchEng preview](img/screenshots/resume_page.png) 113 | 114 | #### Research Page 115 | 116 | ![ResearchEng preview](img/screenshots/research_page.png) 117 | 118 | #### Portfolio Page 119 | 120 | ![ResearchEng preview](img/screenshots/portfolio_page.png) 121 | 122 | #### Blog Page 123 | 124 | ![ResearchEng preview](img/screenshots/blog_page.png) 125 | 126 | #### Blog Post Page 127 | 128 | ![ResearchEng preview](img/screenshots/blog_post_page.png) 129 | 130 | ### Mobile Page Layouts 131 | 132 | All pages of the ResearchEng website template are also optimized for mobile. 133 | 134 | ![ResearchEng preview](img/screenshots/mobile_layout.png) 135 | 136 | ## Performance 137 | 138 | ### Google Page Speed Index: 100/100 139 | 140 | For both desktop and mobile. 141 | 142 | ![ResearchEng preview](img/screenshots/page_speed.png) 143 | 144 | ## Deployment 145 | 146 | The site is designed to be served directly from object storage such as Amazon S3 but can also be deployed using Apache, Nginx, or other web servers. Example instructions for serving a website from Amazon S3 can be found [here](https://medium.com/@kyle.galbraith/how-to-host-a-website-on-s3-without-getting-lost-in-the-sea-e2b82aa6cd38). 147 | 148 | The project includes a GitHub Actions workflow for automated deployment to Google Cloud Storage. 149 | 150 | ## Contributing 151 | 152 | Bug reports and pull requests are welcome on GitHub at . This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. 153 | 154 | ## License 155 | 156 | The theme is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). 157 | -------------------------------------------------------------------------------- /examples/telecomsteve/resume.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |

Steven Platt, PhD

18 |

Email: steven@telecomsteve.com, San Francisco, California, USA

19 |
20 | 21 |

Experience

22 | 23 | 34 | 35 |

o1Labs

36 |

Lead Platform Engineer, Remote, USA, 2021-2024

37 |
    38 |
  • Technical Lead, managing 3 QA and 2 Platform Engineers responsible for the Mina blockchain protocol (OCaml, Rust, Go) and client SDK (Typescript).
  • 39 |
  • Managed RPC node operations across testnet, mainnet, and hard fork networks using Terraform, Helm, and GKE.
  • 40 |
  • Reduced Google Cloud costs 52% by re-configuring existing Kubernetes clusters and retiring underutilized infrastructure.
  • 41 |
  • Discovered and resolved two critical network halting bugs through proactive testing.
  • 42 |
43 | 44 |

Pompeu Fabra University

45 |

Doctoral Researcher, Barcelona, Spain, 2018-2021

46 |
    47 |
  • Wrote network simulations and algorithms in the Python programming language using the NumPy and Pandas libraries for data visualisation.
  • 48 |
  • Published research at top ranked journals and conferences including MDPI Journal Sensors (SJR Q1) and IEEE GlobeCom.
  • 49 |
  • Led lecture and/or lab sections for the following undergraduate courses: Radio Communications, Networks, Blockchain Technologies.
  • 50 |
51 | 52 |

Twitter.com

53 |

Systems Engineer II - Global Office Expansion, San Francisco, US, 2014-2017

54 |
    55 |
  • Deployed automated infrastructre tests and testbed services using Amazon AWS.
  • 56 |
  • Service owner for global telephony architecture and IT infrastructure global office expansion.
  • 57 |
  • Migrated monolith VoIP infrastructure to a microservice design reducing voice carrier costs globally 72%.
  • 58 |
  • Enabled full remote site deployment in 41 countries while reducing site delivery time from 12 weeks to 2.
  • 59 |
60 | 61 |

Salesforce.com

62 |

Network Engineer - Infrastructure Operations, San Francisco, US, 2012-2014

63 |
    64 |
  • Principle network deployment engineer; completed network deployment for facilities in the United States, United Kingdom and Australia.
  • 65 |
  • Global support for Cisco LAN, WAN, Wireless and VPN, Juniper firewall, and F5 Load Balancer systems.
  • 66 |
67 | 68 |

Caterpillar Inc

69 |

Information Technology Analyst II, Peoria, US, 2007-2012

70 |
    71 |
  • Completed platform design of new satellite connected "field view" industrial camera product with pilot deployments in Canada, Czech Republic, and the United States.
  • 72 |
  • Deployed Cisco IP Phone and HD Telepresence video conference networks to facilities in Australia, China, Singapore, Thailand, and the United States.
  • 73 |
74 |
75 | 76 |

Open Source Contributions

77 | 81 |
82 | 83 |

Technical Skills

84 |
    85 |
  • DevOps, Artificial Intelligence (AI), Python, Go, Rust, Linux, Kubernetes, Docker, Continuous Integration and Delivery (CI/CD), Amazon Web Services (AWS), Google Cloud Platform (GCP)
  • 86 |
87 |
88 | 89 |

Education

90 |
    91 |
  • PhD. Blockchain Technologies, Pompeu Fabra University, Barcelona, Spain, 2018-2021
  • 92 |
  • M.S. Wireless Communications, Barcelona School of Telecommunications and Engineering, Polytechnic University of Catalonia, Barcelona, Spain, 2017-2018
  • 93 |
  • MBA. Business Administration, Illinois State University, Normal, US, 2009-2012
  • 94 |
  • B.S. Electronic Systems Technology, Southern Illinois University at Carbondale, Carbondale, US, 2004-2007
  • 95 |
96 |
97 |
98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /css/stylesheet.css: -------------------------------------------------------------------------------- 1 | @import "https://fonts.googleapis.com/css2?family=Permanent+Marker&display=swap"; 2 | 3 | body { 4 | font-family: "Lato", sans-serif; 5 | } 6 | 7 | /* Style page content */ 8 | .main { 9 | margin-left: 20%; /* Same as the width of the sidenav */ 10 | font-size: 22px; /* Increased text to enable scrolling */ 11 | line-height: 35px; 12 | padding: 10%; 13 | } 14 | 15 | .sidenav { 16 | height: 100%; 17 | width: 20%; 18 | position: fixed; 19 | z-index: 1001; 20 | top: 0; 21 | left: 0; 22 | box-shadow: 2px 2px 20px #F0F3F4; 23 | overflow-x: hidden; 24 | 25 | } 26 | 27 | .navblock { 28 | margin:auto; 29 | width: 100%; 30 | height: 90%; 31 | display: flex; 32 | } 33 | 34 | .navblock_text { 35 | margin: auto; 36 | width: 100%; 37 | padding-top: 15%; 38 | padding-bottom: 15%; 39 | } 40 | 41 | .navblock_text a { 42 | padding: 26px 16px 26px 16px; 43 | text-decoration: none; 44 | text-align: center; 45 | font-size: 25px; 46 | color: #818181; 47 | display: block; 48 | } 49 | 50 | .navblock_text a:hover { 51 | color: #CFD8DC; 52 | } 53 | 54 | .footer { 55 | position: relative; 56 | left: 0; 57 | bottom: 0; 58 | width: 100%; 59 | color: #818181; 60 | text-align: center; 61 | } 62 | 63 | .about_accent { 64 | color: green; 65 | } 66 | 67 | .resume_accent { 68 | color: green; 69 | } 70 | 71 | .research_accent { 72 | color: #E74C3C; 73 | } 74 | 75 | .blog_accent { 76 | color: #8E44AD; 77 | } 78 | 79 | a { 80 | color: #3498DB; 81 | text-decoration: none; 82 | } 83 | 84 | .about_photo{ 85 | display: block; 86 | margin-top: 5%; 87 | width: 250px; 88 | height:250px; 89 | object-fit:cover; 90 | border-radius:50%; 91 | margin-left: auto; 92 | margin-right: auto; 93 | } 94 | 95 | .about_logo{ 96 | display: block; 97 | width: 40%; 98 | margin-left: auto; 99 | margin-right: auto; 100 | } 101 | 102 | .about_text { 103 | text-align: center; 104 | } 105 | 106 | .about_header { 107 | /* font-family: 'Permanent Marker', cursive; */ 108 | color: #f1c40f; 109 | } 110 | 111 | .about_links { 112 | text-align: center; 113 | padding: 5% 5% 5% 5%; 114 | } 115 | 116 | .portfolio_accent { 117 | color: #F1C40F; 118 | } 119 | 120 | .portfolio_image { 121 | max-width: 300px; 122 | max-height:300px; 123 | position: absolute; 124 | top: 55%; 125 | left: 50%; 126 | transform: translate(-50%, -50%); 127 | } 128 | 129 | .portfolio-container { 130 | display: flex; 131 | flex-flow: row wrap; 132 | justify-content: space-between; 133 | } 134 | 135 | .portfolio-container > div { 136 | background-color: white; 137 | width: 50%; 138 | margin: 4% 0% 4% 0%; 139 | min-height: 20vh; 140 | justify-content: center; 141 | position: relative; 142 | } 143 | 144 | .portfolio-container_text { 145 | width: 90%; 146 | position: absolute; 147 | text-align: left; 148 | } 149 | 150 | .portfolio-container_image { 151 | width: 90%; 152 | position: absolute; 153 | text-align: center; 154 | color: #8E44AD; 155 | } 156 | 157 | .blog-container { 158 | display: flex; 159 | flex-wrap: wrap; 160 | justify-content: space-between; 161 | } 162 | 163 | .blog-container > div { 164 | background-color: white; 165 | box-shadow: 2px 2px 20px #EAECEE; 166 | width: 45%; 167 | margin: 5% 0% 5% 0%; 168 | min-height: 25vh; 169 | line-height: 60px; 170 | font-size: 25px; 171 | align-items: center; 172 | justify-content: center; 173 | position: relative; 174 | } 175 | 176 | .blog_text { 177 | width: 90%; 178 | position: absolute; 179 | top: 55%; 180 | left: 50%; 181 | transform: translate(-50%, -50%); 182 | text-align: center; 183 | } 184 | 185 | .blog_date { 186 | width: 95%; 187 | padding-right: 5%; 188 | font-size: 20px; 189 | color: #CFD8DC; 190 | text-align: end; 191 | margin-block-start: 0em; 192 | margin-block-end: 0em; 193 | } 194 | 195 | .hamburger-menu { 196 | display: none; 197 | cursor: pointer; 198 | position: fixed; 199 | top: 0; 200 | left: 0; 201 | z-index: 1002; 202 | background: white; 203 | width: 100%; /* Full width */ 204 | padding: 20px 25px; 205 | height: 40px; /* Fixed height for header */ 206 | } 207 | 208 | .bar1, .bar2, .bar3 { 209 | width: 35px; 210 | height: 5px; 211 | background-color: #818181; 212 | margin: 6px 0; 213 | transition: 0.3s; 214 | } 215 | 216 | /* Hamburger animation classes */ 217 | .change .bar1 { 218 | transform: translate(0, 11px) rotate(-45deg); 219 | } 220 | 221 | .change .bar2 { 222 | opacity: 0; 223 | } 224 | 225 | .change .bar3 { 226 | transform: translate(0, -11px) rotate(45deg); 227 | } 228 | 229 | .sidenav.active { 230 | left: 0 !important; 231 | } 232 | 233 | .no-scroll { 234 | overflow: hidden; 235 | position: fixed; 236 | } 237 | 238 | .portfolio_iframe { 239 | max-width: 100%; 240 | width: 560px; 241 | height: 315px; 242 | border-radius: 15px; /* This rounds the corners */ 243 | position: absolute; 244 | top: 50%; 245 | left: 50%; 246 | transform: translate(-50%, -50%); 247 | border: none; 248 | } 249 | 250 | .portfolio_hero { 251 | padding-right: 20%; 252 | } 253 | 254 | /* Update your media query */ 255 | @media screen and (max-width: 1100px) { 256 | .hamburger-menu { 257 | display: block; 258 | } 259 | 260 | .sidenav { 261 | width: 100%; 262 | height: 100%; 263 | position: fixed; 264 | top: 50px; /* Start below the header */ 265 | left: -100%; 266 | transition: left 0.2s ease-in-out; 267 | background: white; 268 | } 269 | 270 | .sidenav.active { 271 | left: 0; /* Slide in */ 272 | } 273 | 274 | .sidenav a { 275 | text-align: center; 276 | padding: 15px 25px; 277 | } 278 | 279 | .main { 280 | margin-left: 0; 281 | padding: 20% 6% 20% 6%; 282 | font-size: 18px; 283 | } 284 | 285 | .portfolio_image { 286 | display: block; 287 | max-width: 80%; 288 | } 289 | 290 | .navblock_text a { 291 | padding: 16px; 292 | } 293 | 294 | .footer { 295 | display: none; 296 | } 297 | 298 | .blog-container > div { 299 | width: 100%; 300 | min-height: 30vh; 301 | margin: 10% 0% 10% 0%; 302 | } 303 | .portfolio-container > div { 304 | width: 100%; 305 | } 306 | } 307 | 308 | @media screen and (max-width: 500px) { 309 | .portfolio_hero { 310 | padding-right: 0%; 311 | } 312 | } -------------------------------------------------------------------------------- /research.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |

Research Activity

18 |

My research focuses are blockchain protocols and decentralized coordination (Web3).

19 | 20 |
21 | 22 |

Standards Development

23 |

IEEE P2677.11™ - Standard for Blockchain-based Omnidirectional Pandemic/epidemic Surveillance: Access to Telecommunications Data, Project Lead, 2020-2022.

24 |

IEEE P2872™ - Standard for Interoperable and Secure Wireless Local Area Network (WLAN) Infrastructure and Architecture, Voting Member, 2020-2022.

25 |
26 | 27 |

Publications

28 | 29 |

"Using Transition Learning to Enhance Mobile-Controlled Handover In Decentralized Future Networks"

30 |

S Platt, B Demirel, M Oliver. IEEE 4th 5G World Forum (5GWF), 424-429, 2021.

31 |

Traditionally, resource management and capacity allocation has been controlled network-side in cellular deployment. 32 | As autonomicity has been added to network design, machine learning technologies have largely followed this paradigm, 33 | benefiting from the higher compute capacity and informational context available at the network core. 34 | However, when these network services are disaggregated or decentralized, models that rely on assumed levels of network or information availability may no longer function reliably. 35 | This paper presents an inverted view of the resource management paradigm; 36 | one in which the client device executes a learning algorithm and manages its own mobility under a scenario where the networks and their corresponding data underneath are not being centrally managed.

37 |

Download

38 |
39 | 40 |

"CoNTe: A Core Network Temporal Blockchain for 5G"

41 |

S Platt, L Sanabria-Russo, M Oliver. Sensors 2020, 20, 5281.

42 |

Virtual Network Functions allow the effective separation between hardware and network functionality, a strong paradigm shift from previously tightly integrated monolithic, vendor, and technology dependent deployments. 43 | In this virtualized paradigm, all aspects of network operations can be made to deploy on demand, dynamically scale, as well as be shared and interworked in ways that mirror behaviors of general cloud computing. 44 | To date, although seeing rising demand, distributed ledger technology remains largely incompatible in such elastic deployments, by its nature as functioning as an immutable record store. 45 | This work focuses on the structural incompatibility of current blockchain designs and proposes a novel, temporal blockchain design built atop federated byzantine agreement, which has the ability to dynamically scale and be packaged as a Virtual Network Function (VNF) for the 5G Core.

46 |

Download

47 |
48 | 49 |

"Towards Blockchain for Decentralized Self-Organizing Wireless Networks"

50 |

S Platt, M Oliver. IEEE Globecom Workshops (GC Wkshps), 1-5, 2019.

51 |

Distributed consensus mechanisms have been widely researched and made popular with a number of blockchain-based token applications, such as Bitcoin, and Ethereum. 52 | Although these general-purpose platforms have matured for scale and security, they are designed for human incentive and continue to require currency reward and contract functions that are not requisite in machine communications. 53 | Redes Chain is a custom designed blockchain, built to support fully decentralized self-organization in wireless networks - without a cryptocurrency or contract dependency.

54 |

Download

55 |
56 | 57 |

"A Distributed Ledger-Enabled Interworking Model for the Wireless Air Interface"

58 |

S Platt, M Oliver. IEEE 5th World Forum on Internet of Things (WF-IoT), 402-407, 2019.

59 |

While direct allocation of spectrum and evolved medium access protocols provide a base for ubiquitous wireless connectivity, the existing TCP/IP and OSI models were designed for wired networks and do not address open interconnection of air interfaces. 60 | Without an interconnection model for the air interface, existing network designs continue to tie wireless medium access to that of the backhaul provider for ownership of access and identity trust, resulting in limitations on functionality and coverage. 61 | In this paper, we propose a novel solution to access ownership and identity trust by extending the TCP network standard, under a new model we propose, named TCP-Air which integrates distributed ledger technologies directly at the air interface. 62 | Further, we present two use cases of the TCP-Air model, demonstrating applications not feasible under existing permissioned-access network designs.

63 |

Download

64 |
65 | 66 |

"Application Layer Modeling in Vehicle Networks"

67 |

S Platt. M.Sc. Thesis, Barcelona School of Telecommunications and Engineering, Polytechnic University of Catalonia, Barcelona, Spain, 2018.

68 |

In recent years, network function virtualization and a software defined focus has allowed networks to become flexible and extensible in ways not possible previously. 69 | Although network modeling tools such as NS-2, NS-3, and OMNet++ have been extended with modules and code to support the absolute latest wireless protocols and medium access standards - there has been a growing gap in simulation of the layers above medium access which recent 5G use cases are designed to support. 70 | In this thesis, I measure the qualitative performance of application layer modeling in vehicle networks, taking the cooperative maneuver use case presented under "Project 5GCar" to design and simulate an autonomous merge algorithm using the VSimRTI network simulation stack.

71 |

Download

72 |
73 | 74 |

Invited Talks

75 | 76 |

"Blockchain for Decentralized 5G Public Utility Overlay Networks", 77 | 3rd Workshop on 5G Technologies for First Responder and Tactical Networks, New York, US, December 2020.

78 | 79 |

"Towards Blockchain for Decentralized Self-Organizing Wireless Networks", 80 | IEEE Globecom, Workshop on Blockchain in Telecommunications, Hawaii, US, December 2019.

81 | 82 |

"A Distributed Ledger-Enabled Interworking Model for the Wireless Air Interface", 83 | IEEE 5th World Forum on the Internet of Things, Limerick, Ireland, April 2019.

84 | 85 |

"Enterprise SIP Trunking, Lessons Learned", 86 | Enterprise Connect Conference, Orlando, US, March 2017.

87 | 88 |

"Enterprise SIP Trunking", 89 | Twilio Signal Conference, San Francisco, US, May 2016.

90 | 91 |
92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /examples/telecomsteve/publications.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | telecomsteve 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |

Publications

18 |

My research focuses are blockchain protocols and decentralized coordination (Web3).

19 | 20 |
21 | 22 |

Books

23 |

"Peer-to-Peer Web Applications" - [Discontinued]

24 |

S Platt. Manning Publications Co. 2024.

25 |

Peer-to-Peer Web Applications takes you beyond toy examples and basic tutorials to build a complete peer-to-peer web app from start to finish. 26 | Chapter-by-chapter, you'll iterate and improve on "Code Radio", a music streaming service that runs entirely on user's machines. 27 | As you go, you'll learn how to create web client applications that connect directly to other clients without the need for a central server. 28 | Add new features like client-side storage and compute, peer-to-peer connections, and use PublicKey and Zero-Knowledge cryptography to set up authentication and certify updates. 29 | Once your app is built and upgraded, you'll begin to explore the blockchain. 30 | You'll implement a payment feature using different blockchain offerings, comparing and contrasting their ecosystems and workflows. 31 | By the time you're done tinkering, your Code Radio app will be a complex, commercial grade application with a polished user experience and absolutely no centralized server!

32 |

Publisher Page

33 |
34 | 35 |

Theses

36 | 37 |

"Decentralized cellular networks: Towards blockchain enabled cellular overlays"

38 |

S Platt. PhD Thesis, Universitat Pompeu Fabra, Barcelona, Spain, 2021.

39 |

This thesis undertakes an investigation into the fit and utility of blockchain technologies within cellular networks. 40 | The core of this writing is a new 5G core network blockchain designed to be compatible with, and paired as storage for 3GPP-compliant virtual network functions. 41 | Compatibility of the blockchain design is delivered by inheriting a number of behaviors from wireless network operation, including a CSMA/CD mechanism of congestion control; a first for a blockchain design. 42 | At the carrier level, a deployment model compatible with ETSI General Autonomous Network Architecture is presented to enable decentralized service overlays. 43 | At the network edge, a novel model of transition learning allows fluid roaming of user-equipment across network boundaries. 44 | At the conclusion, the theory is combined, to reveal a model of decentralized overlays, which at the user equipment, functions in a manner similar to FM radio. 45 | A network channel radio of sorts for decentralized cellular access.

46 |

Download

47 |
48 | 49 |

"Application Layer Modeling in Vehicle Networks"

50 |

S Platt. M.Sc. Thesis, Barcelona School of Telecommunications and Engineering, Polytechnic University of Catalonia, Barcelona, Spain, 2018.

51 |

In recent years, network function virtualization and a software defined focus has allowed networks to become flexible and extensible in ways not possible previously. 52 | Although network modeling tools such as NS-2, NS-3, and OMNet++ have been extended with modules and code to support the absolute latest wireless protocols and medium access standards - there has been a growing gap in simulation of the layers above medium access which recent 5G use cases are designed to support. 53 | In this thesis, I measure the qualitative performance of application layer modeling in vehicle networks, taking the cooperative maneuver use case presented under "Project 5GCar" to design and simulate an autonomous merge algorithm using the VSimRTI network simulation stack.

54 |

Download

55 |
56 | 57 |

Published Research

58 | 59 |

"Using Transition Learning to Enhance Mobile-Controlled Handover In Decentralized Future Networks"

60 |

S Platt, B Demirel, M Oliver. IEEE 4th 5G World Forum (5GWF), 424-429, 2021.

61 |

Traditionally, resource management and capacity allocation has been controlled network-side in cellular deployment. 62 | As autonomicity has been added to network design, machine learning technologies have largely followed this paradigm, 63 | benefiting from the higher compute capacity and informational context available at the network core. 64 | However, when these network services are disaggregated or decentralized, models that rely on assumed levels of network or information availability may no longer function reliably. 65 | This paper presents an inverted view of the resource management paradigm; 66 | one in which the client device executes a learning algorithm and manages its own mobility under a scenario where the networks and their corresponding data underneath are not being centrally managed.

67 |

Download

68 |
69 | 70 |

"CoNTe: A Core Network Temporal Blockchain for 5G"

71 |

S Platt, L Sanabria-Russo, M Oliver. Sensors 2020, 20, 5281.

72 |

Virtual Network Functions allow the effective separation between hardware and network functionality, a strong paradigm shift from previously tightly integrated monolithic, vendor, and technology dependent deployments. 73 | In this virtualized paradigm, all aspects of network operations can be made to deploy on demand, dynamically scale, as well as be shared and interworked in ways that mirror behaviors of general cloud computing. 74 | To date, although seeing rising demand, distributed ledger technology remains largely incompatible in such elastic deployments, by its nature as functioning as an immutable record store. 75 | This work focuses on the structural incompatibility of current blockchain designs and proposes a novel, temporal blockchain design built atop federated byzantine agreement, which has the ability to dynamically scale and be packaged as a Virtual Network Function (VNF) for the 5G Core.

76 |

Download

77 |
78 | 79 |

"Towards Blockchain for Decentralized Self-Organizing Wireless Networks"

80 |

S Platt, M Oliver. IEEE Globecom Workshops (GC Wkshps), 1-5, 2019.

81 |

Distributed consensus mechanisms have been widely researched and made popular with a number of blockchain-based token applications, such as Bitcoin, and Ethereum. 82 | Although these general-purpose platforms have matured for scale and security, they are designed for human incentive and continue to require currency reward and contract functions that are not requisite in machine communications. 83 | Redes Chain is a custom designed blockchain, built to support fully decentralized self-organization in wireless networks - without a cryptocurrency or contract dependency.

84 |

Download

85 |
86 | 87 |

"A Distributed Ledger-Enabled Interworking Model for the Wireless Air Interface"

88 |

S Platt, M Oliver. IEEE 5th World Forum on Internet of Things (WF-IoT), 402-407, 2019.

89 |

While direct allocation of spectrum and evolved medium access protocols provide a base for ubiquitous wireless connectivity, the existing TCP/IP and OSI models were designed for wired networks and do not address open interconnection of air interfaces. 90 | Without an interconnection model for the air interface, existing network designs continue to tie wireless medium access to that of the backhaul provider for ownership of access and identity trust, resulting in limitations on functionality and coverage. 91 | In this paper, we propose a novel solution to access ownership and identity trust by extending the TCP network standard, under a new model we propose, named TCP-Air which integrates distributed ledger technologies directly at the air interface. 92 | Further, we present two use cases of the TCP-Air model, demonstrating applications not feasible under existing permissioned-access network designs.

93 |

Download

94 |
95 | 96 |

Standards Development

97 |

IEEE P2677.11™ - Standard for Blockchain-based Omnidirectional Pandemic/epidemic Surveillance: Access to Telecommunications Data, Project Lead, 2020-2022.

98 |

IEEE P2872™ - Standard for Interoperable and Secure Wireless Local Area Network (WLAN) Infrastructure and Architecture, Voting Member, 2020-2022.

99 |
100 | 101 |

Invited Talks

102 | 103 |

"Blockchain for Decentralized 5G Public Utility Overlay Networks", 104 | 3rd Workshop on 5G Technologies for First Responder and Tactical Networks, New York, US, December 2020.

105 | 106 |

"Towards Blockchain for Decentralized Self-Organizing Wireless Networks", 107 | IEEE Globecom, Workshop on Blockchain in Telecommunications, Hawaii, US, December 2019.

108 | 109 |

"A Distributed Ledger-Enabled Interworking Model for the Wireless Air Interface", 110 | IEEE 5th World Forum on the Internet of Things, Limerick, Ireland, April 2019.

111 | 112 |

"Enterprise SIP Trunking, Lessons Learned", 113 | Enterprise Connect Conference, Orlando, US, March 2017.

114 | 115 |

"Enterprise SIP Trunking", 116 | Twilio Signal Conference, San Francisco, US, May 2016. (Watch on Youtube)

117 | 118 |
119 | 120 | 121 | 122 | --------------------------------------------------------------------------------