Skip to main content

project details

details, descriptions, and notes for my projects

Writing Assistant

Tech used

HTML5 icon CSS3 icon JavaScript icon Git icon GitHub icon Netlify icon
Screenshot of the of the alphabet buttons, Proper Nouns accordian and textarea

I built this app for people who have reduced fine motor skills and difficulty in speaking (e.g., brain injuries, cerebral palsy, stroke survivors). My hope is that it will be easier for them to compose emails to family, friends, and former co-workers.

Take a look at the code on GitHub or try out the live version. There are modifications that can be made to tailor the app for each person. Feel free to contact me for help with that.

As for the code, this was originally a Vanilla JS app but I converted it to TypeScript. I plan to add Tailwind CSS, add a language select list defaulted to en-us, and populate the DOM based on the language selected.

How I built this app

WORDS & PHRASES

Instead of having to type every character, I use RegEx to create arrays for 1) common words by letter, and 2) common phrases (in content.js). I then map thru those arrays and output the words into a menu for each letter of the alphabet letter, and an accordian for the phrases.

KEYBOARD

I have functions for alphanumeric characters, navigation, and non-print keys (Spacebar, Enter, Tab). I also have functionality for Caps and Shift keys for changing the characters added to the textarea based on the state of those keys.

A view of the Proper Nouns accordian open showing all the proper nouns used in this app
Example of drop-down list for phrases

TEXTAREA

All words, phrases, and keyboard characters get added to the textarea on click. Further manipulation of the text in the textarea is accomplished using the Delete and Backspace keys, which can be used with the Navigation keys (Home, End, Arrow-Left, Arrow-Right).

CLIPBOARD & MODAL

There is also a button to copy the textarea content to be pasted into a document or email program. Finally, there is a Clear button to empty the textarea with a modal for confirmation to prevent accidental deletion.

Modal confirmation for clearing the textarea
Modal for clearing the text box

Is the app complete?

No. I would like to use the File API so that users can upload a file of proper nouns and sample text so that they can have a custom-built page. I would also like to create keyboards for other languages.

Final thoughts

It is essential to have a clear plan of what you want to accomplish. As I built the app, I added feature after feature which required changes to the CSS and HTML. Planning out the full-featured app would have been better.

Guitar Chord Namer

Tech used

HTML5 icon CSS3 icon JavaScript icon Bootstrap icon Git icon GitHub icon
Screenshot of the input form used to calculate the chord name

This app returns the name of a guitar chord, the chord intervals, the chord tendencies, whether or not it equals another chord by a different name and the scales that build the chord.

You won't find a more accurate and complete guitar chord namer app! If you or someone you know plays guitar then try out the app on my guitar website or check out the code on GitHub.

I started this project after viewing SVG Guitar Chord repos on GitHub and noticed that their names were often wrong.

This is a Vanilla JavaScript app that uses Bootstrap for most of the styles and custom CSS for other elements like the card background gradients.

How I built this app

OVERVIEW

The user has to enter the fret numbers for the chord they need to be named. They also have options to choose one of thirteen tunings (Standard default), and to choose a sharp or flat key (sharp default). The tuning chosen populates the DOM with the notes for each string and the notes are used to build string arrays.

BUILDING ARRAYS AND OBJECTS

Based on the tuning and the sharp/flat checkbox, all 6 strings are built with the correct notes. Duplicate user notes are then filtered out, intervals are created with each unique note as a chord root. The intervals are converted into an object and that object is used to find a match in chord-intervals.js.

Tunings select list options
Option to choose different tunings

SPECIAL CASES

If at least one matching chord was found with the same number of notes, I perform 7 conditionals for what in music is known as enharmonic equivalents. The conditionals are not complex, but without these checks, the output field "Chord notes" would sometimes have the wrong notes.

FINISHING TOUCHES

I have a number of small code blocks to put the Chord Notes in "proper" order, create a slash chord or not, and check to see if the notes are equal to 2 or more chord names. Then I get the chord tendency and chord intervals values from chord-intervals.js and finally write everything to the DOM.

Example of a chord output. The example shows an E7 flat five sharp nine chord
Output shown for a valid chord

Is the app complete?

This app is complete for its purpose but it can be much better. I would like to have an option for ukeleles, banjos & mandolins. I also intend to load the users' tuning and sharp/flat selections into local storage, and finally create an SVG chord shape based on the users' notes.

Final thoughts

A lot of the description above references music theory, so I apologize for that. But music theory had to be incorporated to make this app do what it does, and to handle all the edge cases to return the correnct chord name.

Tarp Configurations

Tech used

HTML5 icon CSS3 icon JavaScript icon React icon Tailwind CSS icon Git icon GitHub icon Netlify icon Inkscape icon
Home page form screenshot

This is a personal project that aligns with my interests in bushcraft and wilderness survival. It calculates the height of the rope(s) used to raise your tarp for 33 different tarp configurations.

It also notes whether the user is able to 1) sit under the tarp, and 2) sit in a chair under the tarp.

This app uses React for the state of the user's input values which are used for the calculations, and Tailwind for the styling. You can try out the app on Netlify or take a look at the code on GitHub.

Why I built this app?

Bushcraft is a hobby of mine and one aspect of it is using and setting up tarps. Each tarp setup/config requires different heights and angles for the setup. So I felt this would make a great personal project. This app would be useful for campers, backpackers, bushcrafters, or anyone who has struggled trying to raise a tarp into the air for protection against the elements.

Challenges encountered

I had to build my first responsive Hamburger menu and back-to-top button in React, and since I did not use create-react-app I had issues loading my images. I did some research for the image issue and found that without Webpack I needed to import the images into my files. Lastly, I had to design the tarp graphics in Inkscape, as close to 3D as my skills allowed.

Screenshot of an example tarp configurations result
Example of results output

Is the app complete?

Almost. The app does what it is supposed but I would like to add some options for the users. The first would be to let the user enter the tarp size in inches or feet. I would also like to have an option to set all the fields to metric that accept centimeter/meter values.

Final thoughts

Using useContext was better than useState but I would like to incorporate useReducer for my state values. I would also prefer to create my own webpack.config file for greater control.

Example of tip points for stakes and the ridgeline
Example of tarp fold(s) and tie points

Client Work

Tech used

HTML5 icon CSS3 icon WordPress icon Elementor icon cpanel icon Cloudflare icon
computer at desk

The details below are not what I would call projects, but are rather the steps I took to help different website owners.

I have done unpaid volunteer work for two WordPress site owners. Another client is from Fiverr who was unfamiliar with how WordPress works and built his website using a block theme.

Another Fiverr client had a simple request involving HTML. Specifically, that client provided me with PDF files with tables that needed to be converted to HTML <table> elements.

As I get other clients for any type of website needs, I will add a short summary of the details for each job. Here are summaries for the 4 clients mentioned above.

#1 Camping Ventures Hub

The client's website Camping Ventures Hub was an affiliate marketing blog. The job had 2 milestones, the first for determining why the domain would not load, and the second for building or "fixing" 5 more pages.

The client chose a Block theme named Yith Wonder but he was unfamiliar with WordPress and so knew nothing about the admin area, Gutenberg blocks, or block themes.

He also configured the WordPress admin area incorrectly and had his host company create a staging area which was totally unnecessary for a brand new website with no pages.

Issues and the Solutions:

1. Issue: The staging area link worked but the domain link was timing out.

Solution: I noticed that the client added the staging area link in the Site Address and WordPress Address URL fields which means his domain had no pages. Bluehost fixed the error.

2. Issue: Home page images were 100's of kilobytes. They were sized to 800px wide but displayed at ~ 300px wide.

Solution: I brought the images into Photoshop, reduced the size, optimized them for the web, and then uploaded the new lightweight images to the media library.

3. Issue: The footer lacked the elements and styling that the client wanted.

Solution: I edited one of the footer template files and added the current elements including the newsletter form that I created.

4. Issue: The header lacked a proper menu with links to the category pages.

Solution: I created the categories since they did not exist and then added them to the header menu.

5. Issue: There were no blog posts to see the styling for the blog page, categories pages, or single post pages.

Solution: I created a single sample post for each category which allowed us to see how the templates displayed on the front-end.

6. Issue: The Home, Archive, and Single templates had limited styling and needed layout changes.

Solution: I edited the templates per the client's requests for the features and styles he wanted.

7. Issue: No favicon.

Solution: I brought his logo into Inkscape, removed the wordmark, and used just the graphic as the favicon.

8. Issue: The client's lack of knowledge of WordPress.

Solution: I created a draft post with notes about the template files, Gutenberg blocks, and theme options so that he would be able to continue building the site on his own.

#2 propMeUp

The client's website propMeUp is a non-profit charity site that was started by a WordPress designer from Fiverr but who abandoned the project.

The owner was on a timeline to obtain funding for the charity and 3 pages needed to be built and the images on the other pages needed to be replaced.

The additional issue for the client is that the site was built using the page-builder Elementor and the original designer installed a dozen plugins in support of Elementor.

This was a volunteer job for a person in my local area who had no knowledge of WordPress let alone Elementor and a host of plugins.

Issues and the Solutions:

1. Issue: The Events and Contact pages had not been created and therefore lacked content.

Solution: I created the pages, copied design elements from the Join page, and then made edits. I also created a contact form with custom CSS.

2. Issue: The Home and About pages had spacing, font size, and many other issues.

Solution: I changed the padding, margin, font size, and changed the layout until the client was happy. I then applied those styles to every other section and page throughout the site. The previous designer used pixels for everything — I replaced px with em and rem.

3. Issue: The sticky header was unreadable due to reduced opacity on scroll.

Solution: I deleted the header and built a simpler header that was not sticky. The site had a back-to-top button so a sticky header was not needed.

4. Issue: The testimonials slider had the text obstructed by the ornamental double-quotes on small screens.

Solution: Elementor had different slider options so I switched to another design that did not have any issues.

5. Issue: The images on the pages needed to either be changed or minimized. The image sizes were in the Megabyte range.

Solution: I downloaded every image and reduced the filesize using Photoshop then uploaded the smaller files and used them on the pages.

6. Issue: There were many plugins that were installed in support of Elementor.

Solution: I migrated the site onto my local machine and then systematically disabled every plugin to see if there was any loss of functionality or styling. I removed all the plugins that were not needed.

7. Issue: No favicon.

Solution: Luckily the client hired a graphic designer who did a great job and had a version of her logo with just the UP and up arrow (see website). I resized that and used it for the favicon.

8. Issue: The client's lack of knowledge of WordPress and Elementor.

Solution: We did a number of Slack Huddles where I shared my screen and explained how to work with Elementor.

#3 Two Average Gamers

This was another volunteer opportunity that I found on a job board named Flexjobs for Two Average Gamers. My job was to improve the page speed and to look at the overall design and page structure. I was not able to do much for the design but I did address the other 2 issues.

The Google Insights Performance score was in the mid to low 40% range. I was able to get it as high as 73% until it settled at 69-70%. The main drag on the page load speed was Mailchimp (free version) loading the enrtire jQuery librrary.

The site also had multiple Contact, About, and other duplicate pages. They site owners were unaware of this. I created the code for 301 redirects and I talked them through how to add it to their cPanel .htaccess file.

#4 Lift Master

This was another Fiverr gig for someone from Lift Master. I had to convert 7 tables in a PDF file to HTML elements.

I did create an excellent responsive table design but this job only required using a number of rowspan and colspan attributes.

I copied the text from the PDF files and pasted it into a markdown file. Then I created the table element with thead and tbody tags, and with no content in the td, tr, and th tags. Then it was just a cut/paste process making sure that my table text matched exactly what was in the PDF files.