This page documents the development process of the "Photoshop Shortcuts" application, highlighting the interactions between the developer and GitHub Copilot. All Copilot responses are generated by the AI based on the developer's prompts.
In this showcase, we explore how Copilot assists in creating an educational app for high school students learning Photoshop 2025. The app features a collection of keyboard shortcuts organized by topic, enhancing the learning experience.
Throughout the development, Copilot provides suggestions for organizing shortcuts, creating Bootstrap cards, and implementing responsive design. The chat log captures each interaction, showcasing the collaborative nature of AI-assisted development.
We used GPT-4.1 in this collaboration.
Current Prompt Count:
User:
I am a high school computer science teacher and I'm teaching a week-long introductory course in Photoshop 2025. I want to create an app to help students learn the most important shortcuts within that platform. I also want to teach future students about the use of AI, so I'll want to document our conversation extensively in a chatlog that shows our interaction. The file I've attached is a format I'd like to use for our documentation. How do you suggest we get started? Let's create our first log entry!
GitHub Copilot:
Great idea! To get started, define your project’s goal and audience. Next, outline the core features (e.g., searchable shortcut list, quiz mode, visual cues). Use this chat log to document each step, including your prompts and Copilot’s responses. For your first entry, record this planning discussion. As you build, log each design or coding decision here for future students to review.
User:
Let's organize the shortcuts using Bootstrap5 'cards' that have a particular topic. When clicked, let's load a modal that shows shortcuts related to that topic in a Bootstrap5 table. Let's begin with a topic: 'Top 20 Photoshop 2025 Shortcuts' Include a thematic Bootstrap decorative icon and a short description. In a database, setup what you think are the top 20 shortcuts in Photoshop and load them into a multi-purpose modal.
GitHub Copilot:
Added a Bootstrap5 card for the "Top 20 Photoshop 2025 Shortcuts" with a lightning icon and description. When clicked, it opens a modal displaying a table of the top 20 shortcuts, loaded from a JavaScript "database" object. The modal and card are reusable for future topics. The JavaScript dynamically fills the table based on the selected topic.
HTML:
<div class="col-md-6">
<div class="card shadow-sm border-primary mb-3" style="cursor:pointer;" onclick="showShortcutsModal('top20')">
<div class="card-body d-flex align-items-center">
<div class="me-3">
<svg ...></svg>
</div>
<div>
<h5 class="card-title mb-1">Top 20 Photoshop 2025 Shortcuts</h5>
<p class="card-text small text-muted">Quickly access the most essential and time-saving keyboard shortcuts every Photoshop user should know.</p>
</div>
</div>
</div>
</div>
JavaScript:
const shortcutsDB = {
top20: [
{ shortcut: "Ctrl + N", action: "New Document", description: "Create a new Photoshop document." },
... // 19 more
]
};
function showShortcutsModal(topic) {
const shortcuts = shortcutsDB[topic] || [];
const tbody = document.getElementById('shortcutsTableBody');
tbody.innerHTML = '';
shortcuts.forEach(item => {
const tr = document.createElement('tr');
tr.innerHTML = `
<td><kbd>${item.shortcut}</kbd></td>
<td>${item.action}</td>
<td>${item.description}</td>
`;
tbody.appendChild(tr);
});
const modal = new bootstrap.Modal(document.getElementById('shortcutsModal'));
modal.show();
}
User:
For our next card, let's create one with the topic: 'Single Letter Shortcuts' where each shortcut is a single key that loads up a particular tool. It's ok to add modifiers like: Ctrl, Shift, or Alt when appropriate. Can you create this card and add to our battery of shortcuts? What icon will you use for the card?
GitHub Copilot:
I added a new Bootstrap card for "Single Letter Shortcuts" using the Bootstrap bi-keyboard-fill icon to represent keyboard-based tool access. When clicked, this card loads a modal displaying a table of shortcuts where each is a single letter (with occasional modifiers like Ctrl, Shift, or Alt).
In JavaScript, I created a new array property shortcutsDB.singleLetter to store these shortcuts. Each entry is an object with shortcut, action, and description fields, similar to the "top20" structure. This allows the modal to dynamically display the relevant shortcuts when the card is clicked.
shortcutsDB.singleLetter = [
{ shortcut: "V", action: "Move Tool", description: "Select the Move tool." },
{ shortcut: "M", action: "Marquee Tool", description: "Select the Marquee selection tool." },
// ...more single-key shortcuts...
];
User:
Tell me more about what's happening with the .singleLetter syntax. Does this add to the shortcutsDB you established earlier? That's new to me.
GitHub Copilot:
Yes, the shortcutsDB.singleLetter = [...] syntax adds a new property called singleLetter to the existing shortcutsDB object. In JavaScript, objects can have properties added at any time, even after their initial creation. This means you can start with shortcutsDB containing only top20, and later add singleLetter (or any other topic) as needed.
This approach makes shortcutsDB act like a simple database, where each property (like top20 or singleLetter) is an array of shortcut objects for a specific topic. When you call showShortcutsModal('singleLetter'), the code looks up shortcutsDB.singleLetter and displays those shortcuts in the modal.
const shortcutsDB = {
top20: [ /* ... */ ]
};
// Later in the code:
shortcutsDB.singleLetter = [ /* ... */ ];
This is a flexible way to organize related sets of data under a single object, making it easy to add more categories in the future.
User:
I notice that when I click either the first or second card, the modal populates with the correct shortcuts, but the title of the modal is always: Photoshop 2025: Top 20 Shortcuts. Can you refactor the code such that the title of the modal is the topic of the card that launched it?
GitHub Copilot:
I updated the showShortcutsModal function to set the modal's title dynamically based on the topic selected. I created a shortcutTitles object that maps each topic key (like top20 or singleLetter) to a descriptive title string. When a card is clicked, the function now looks up the appropriate title and updates the modal's heading before displaying the shortcuts table. This ensures the modal always shows the correct topic title for the shortcuts being viewed.
const shortcutTitles = {
top20: "Photoshop 2025: Top 20 Shortcuts",
singleLetter: "Photoshop 2025: Single Letter Shortcuts"
// Add more topics here as needed
};
function showShortcutsModal(topic) {
// ...populate table...
const modalTitle = document.getElementById('shortcutsModalLabel');
if (modalTitle) {
modalTitle.textContent = shortcutTitles[topic] || "Photoshop 2025: Shortcuts";
}
// ...show modal...
}
Now, each time you open the modal from a different card, the title matches the topic you selected.
User:
When the browser size is less than 500px, let's hide the #introDiv. It looks tacky at smaller window sizes.
GitHub Copilot:
I added a CSS media query to hide the #introDiv when the browser width is less than 500 pixels. This improves the appearance of the app on small screens by removing the introductory message that can look awkward or take up too much space.
@media (max-width: 500px) {
#introDiv {
display: none !important;
}
}
This CSS ensures that #introDiv is only visible on larger screens, making the layout cleaner and more user-friendly on mobile devices.
User:
What font recommendation do you have for our app, and do you think we could come up with a better name?
GitHub Copilot:
For your app, I recommend pairing a clean, modern sans-serif font for readability with a creative accent font for headings. You’re already using Dosis (a friendly sans-serif) and Dancing Script (a casual script) from Google Fonts, which is a strong start. You might also consider:
- Montserrat or Roboto for body text (very readable, modern, and professional)
- Dosis or Poppins for headings (rounded, approachable)
- Keep Dancing Script for fun accent headings or taglines
Example pairing:
Headings: Montserrat
Body: Dosis
Accents: Dancing Script
App Name Ideas:
- Shortcut Studio
- Photoshop PowerKeys
- QuickKey Coach
- PS Shortcut Lab
- Shortcut Sensei
- Photoshop KeyMaster
- SnapKeys for Photoshop
- Shortcut Explorer
Choose a name that feels fun and approachable for students, but also clearly communicates the app’s purpose!
User:
Do you have a suggestion for a punchy 'tag line' for the app?
GitHub Copilot:
Here are a few punchy tag line ideas for your Photoshop shortcuts app:
- Master Photoshop Faster—One Shortcut at a Time!
- Unlock Your Creative Speed
- Level Up Your Workflow
- From Clicks to Keys: Create Like a Pro
- Shortcut Your Way to Photoshop Mastery
- Work Smarter. Create Faster.
- The Fast Track to Photoshop Skills
You can use any of these as your tag line under the app title for a motivating and student-friendly vibe!
User:
Incidentally, I found another font I chose: "Faster One" that worked well, but I liked your other suggestions. Let's add these chats to our log
GitHub Copilot:
"Faster One" is a great choice for a bold, energetic accent or headline font—perfect for grabbing attention in an educational app! You can continue to use it for your main title or key headings, and pair it with one of the recommended sans-serif fonts (like Dosis, Montserrat, or Roboto) for body text and supporting headings. This combination will keep your app visually engaging and easy to read for students.
All font and tag line suggestions are now documented in this chat log for future reference.
User:
Wonderful! We are behind in our chatlog. The last entry was about font 'Faster One' You've done a lot of work since then! Can we update the chatlog?
GitHub Copilot:
Absolutely! Here’s a summary of the recent updates and improvements made since the last chatlog entry:
- Added More Shortcut Topics: New cards and shortcut data were created for File Menu Shortcuts, Edit Menu Shortcuts, Image Menu Shortcuts (with adjustments), and Layer Menu Shortcuts. Each topic is now represented by a Bootstrap card with a relevant icon and description.
-
Dynamic Modal Titles: The modal title now updates based on the card/topic selected, using a
shortcutTitlesobject for easy mapping. -
Uniform Card Heights: All cards in the shortcut grid use
h-100and the row usesd-flex align-items-stretchto ensure a consistent, professional appearance. -
Improved Card Spacing: A bottom margin was added to each column in the grid using the CSS selector
.row > [class^="col-"]to give cards more breathing room, especially on stacked layouts. -
Responsive Design: The
#introDivis hidden on screens smaller than 500px for a cleaner mobile experience. -
Clarified JavaScript Syntax: Explained the difference between
]and}for arrays and objects, and howshortcutsDB.topicName = [...]dynamically adds new shortcut categories.
These changes make the app more organized, visually appealing, and easier for students to use and explore Photoshop shortcuts by topic.
User:
Magnificent! Let's add this recent interaction and see if the count updates!
GitHub Copilot:
This entry documents our work to display and update the prompt count in the chatlog. The updatePromptCount() function counts all .dialog-turn elements and updates the h4 with id="promptCountH4" each time the page loads or new entries are added. Now, each new dialog turn will increment the count, making it easy to track our collaboration progress!
User:
Let's show how we finished the cards and data sets for the remaining menus
GitHub Copilot:
We completed the shortcut cards and data sets for the remaining Photoshop menu topics: Select Menu Shortcuts and View Menu Shortcuts.
-
Select Menu Shortcuts: Added a card with a cursor icon and a new
shortcutsDB.selectMenuarray in JavaScript. This set includes shortcuts for selecting all, deselecting, inverting selection, feathering, reselecting, and creating new layers from selections. -
View Menu Shortcuts: Added a card with an eye icon and a
shortcutsDB.viewMenuarray. This set covers zooming, fitting to screen, toggling panels, screen modes, and showing/hiding guides and grids.
Each card uses h-100 for equal height and a Bootstrap icon for visual clarity. Clicking a card loads the relevant shortcuts into the modal, with the modal title updating to match the selected topic. All menu topics are now represented in both the UI and the underlying data structure, making the app comprehensive and easy to expand.