The Santa-CLI Challenge: Build a Colorful Java Holiday App with Quarkus
Use Picocli and Clique to create multifaith greetings, festive ASCII art, and a modern holiday card generator in your terminal.
Most developers work in global teams. The winter season is a moment of celebration for many cultures, each with its own symbols, colors, and traditions.
Tonight, we build a CLI tool that celebrates all of them with Quarkus, Picocli, and Clique.
You will create a command-line app that prints festive greetings for Christmas, Hanukkah, Diwali, Yule, Eid (winter observance varies), and general “Holiday Lights” messages for anyone who doesn’t celebrate.
Each greeting uses a different color palette in the terminal to honor the tradition.
We call it santa-cli, but it’s really a Holiday Lights CLI.
Let’s build something warm and inclusive — in code.
Prerequisites
Java 17 or 21
Maven 3.8+ or Quarkus CLI
An IDE (IntelliJ, VS Code)
A warm drink is recommended
Bootstrap the Project
Grab the code from my Github repository or just follow along:
Using the Quarkus CLI:
quarkus create app org.northpole:santa-cli \
--extension=picocli \
--no-code
cd santa-cliAdd Clique for Colors
Add JitPack:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>Add Clique:
<dependency>
<groupId>com.github.kusoroadeolu</groupId>
<artifactId>Clique</artifactId>
<version>v1.2.1</version>
</dependency>Clique allows you to write expressive color markup like:
[red, bold]Merry Christmas[/]
[blue]Happy Hanukkah[/]
[yellow]🪔 Happy Diwali[/]No ANSI escape codes required.
Create a Multifaith Holiday Command
To keep the command clean, create a dedicated helper class that provides:
Festival-themed greetings
ASCII art for each tradition
Color palettes
Emoji-width detection
A single place to expand (Kwanzaa? Lunar New Year preview? Up to you)
Create:src/main/java/org/northpole/HolidayData.java
package org.northpole;
import com.github.kusoroadeolu.clique.ansi.ColorCode;
/**
* Helper class containing holiday-specific data including greetings, ASCII art, and color themes.
*/
public class HolidayData {
// my christmas surprise for you :-)
}This class gives you:
getHolidayGreeting(name, holiday)
Returns two colored lines for the holiday.getHolidayTheme(holiday)
Defines border color + quote theme for CLI boxes.getHolidayArt(holiday)
Returns a multicolored ASCII symbol (tree, menorah, diya, Yule tree, crescent moon, or sparkles).hasDoubleWidthEmoji(...)
Helps with alignment in terminals that treat certain emojis as double-width.
With this in place, the Santa CLI becomes much cleaner.
Create:
src/main/java/org/northpole/SantaCommand.java
Paste and read the comments — this is where the holiday magic begins.
package org.northpole;
import com.github.kusoroadeolu.clique.Clique;
import com.github.kusoroadeolu.clique.config.BorderStyle;
import com.github.kusoroadeolu.clique.config.CellAlign;
import com.github.kusoroadeolu.clique.config.TableConfiguration;
import com.github.kusoroadeolu.clique.tables.Table;
import com.github.kusoroadeolu.clique.tables.TableType;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
/**
* 🎄 A festive command-line application that spreads holiday cheer across cultures!
* <p>
* This command creates beautiful, colorful holiday cards in your terminal,
* celebrating Christmas, Hanukkah, Diwali, Yule, Eid, and more. Each holiday
* features unique ASCII art, themed colors, and inspirational developer quotes.
* </p>
*
* @author North Pole Development Team
* @version 1.0
*/
@Command(name = “santa”, mixinStandardHelpOptions = true, version = “santa-cli 1.0”, description = “A festive CLI celebrating winter holidays around the world.”)
public class SantaCommand implements Runnable {
@Option(names = { “-n”, “--name” }, defaultValue = “Friend”)
String name;
@Option(names = { “-h”, “--holiday” }, description = “Holiday type: christmas, hanukkah, diwali, yule, eid, lights”)
String holiday;
@Option(names = { “-l”, “--list” }, description = “Show a cheerful multi-faith gift list”)
boolean showList;
/**
* 🎁 Spreads holiday cheer by displaying personalized greetings and festive cards!
* Orchestrates the display of gift lists and holiday quote cards based on user preferences.
*/
@Override
public void run() {
String holidayType = holiday == null ? “lights” : holiday.toLowerCase();
if (showList) {
printGiftListTable();
}
printHolidayQuote(name, holidayType);
}
/**
* 🎁 Displays a beautiful table of community gifts across different holidays.
* Shows how diverse celebrations bring joy to everyone!
*/
private void printGiftListTable() {
Clique.parser().print(”[bold, white]🎁 COMMUNITY GIFT LIST[/]\n”);
Clique.table(TableType.BOX_DRAW)
.addHeaders(”Person”, “Holiday”, “Gift”)
.addRows(
“Amit”, “[yellow]Diwali[/]”, “LED Fairy Lights”,
“Sarah”, “[blue]Hanukkah[/]”, “Chocolate Gelt”,
“Jonas”, “[green]Christmas[/]”, “Java 21 Book”,
“Freya”, “[cyan]Yule[/]”, “Warm Wool Scarf”,
“Layla”, “[cyan]Eid[/]”, “Sweet Treats”)
.render();
System.out.println();
}
/**
* ✨ Creates a stunning holiday card with ASCII art, personalized greetings, and inspirational quotes!
* <p>
* Each card features:
* <ul>
* <li>🎨 Holiday-themed colors and borders</li>
* <li>🎭 Unique ASCII art for each celebration</li>
* <li>💬 Personalized greeting with the recipient’s name</li>
* <li>📜 An inspirational developer quote</li>
* </ul>
* </p>
*
* @param name the name of the person receiving the holiday greeting
* @param holiday the type of holiday to celebrate (christmas, hanukkah, diwali, yule, eid, or lights)
*/
private void printHolidayQuote(String name, String holiday) {
// Create a holiday card design with ASCII art and festive colors
Clique.parser().print(”\n”);
// Get holiday-specific styling
HolidayData.HolidayTheme theme = HolidayData.getHolidayTheme(holiday);
BorderStyle style = BorderStyle.immutableBuilder()
.horizontalBorderStyles(theme.borderColor())
.verticalBorderStyles(theme.borderColor())
.edgeBorderStyles(theme.borderColor())
.build();
TableConfiguration configuration = TableConfiguration
.immutableBuilder()
.borderStyle(style)
.parser(Clique.parser())
.alignment(CellAlign.LEFT)
.padding(2)
.build();
Table card = Clique.table(TableType.BOX_DRAW, configuration);
// Add header with first line of holiday greeting (required before adding rows)
String[] greeting = HolidayData.getHolidayGreeting(name, holiday);
card.addHeaders(greeting[0]);
// Add second line of greeting as first row, with padding to compensate for
// emoji width
// Some emojis are double-width (2 columns) while others like 🕎 are
// single-width (1 column)
String secondLine = greeting[1];
if (HolidayData.hasDoubleWidthEmoji(greeting[0])) {
// Add padding inside the markup to compensate for emoji’s 2-column width
if (secondLine.startsWith(”[”)) {
int endTag = secondLine.indexOf(”]”);
if (endTag > 0) {
String colorTag = secondLine.substring(0, endTag + 1);
String content = secondLine.substring(endTag + 1);
// Add a space character as part of the styled content to pad for emoji width
secondLine = colorTag + “ “ + content;
}
} else {
secondLine = “ “ + secondLine;
}
}
card.addRows(secondLine);
// Add spacing
card.addRows(”“);
// Add ASCII art based on holiday
String[] art = HolidayData.getHolidayArt(holiday);
for (String line : art) {
card.addRows(line);
}
// Add spacing
card.addRows(”“);
// Add quote
card.addRows(”[” + theme.quoteColor() + “, bold]\”In every line of code,[/]”);
card.addRows(”[” + theme.quoteColor() + “, bold]let there be a little more light.\”[/]”);
// Add spacing
card.addRows(”“);
// Add attribution
card.addRows(”[” + theme.attributionColor() + “, italic]— Seasonal Developer Wisdom[/]”);
card.render();
Clique.parser().print(”\n”);
}
}This command does three things:
Prints a color-coded holiday greeting for the selected tradition.
Prints a multi-faith gift list when
--listis used.Prints a final seasonal quote in a rounded terminal box.
Run Your Holiday CLI
Basic Christmas greeting
./mvnw quarkus:dev -Dquarkus.args="--holiday=christmas --name=Markus"Hanukkah greeting
./mvnw quarkus:dev -Dquarkus.args="--holiday=hanukkah --name=Svenja"Diwali greeting + gift list
./mvnw quarkus:dev -Dquarkus.args="--holiday=diwali --list"Default “lights for everyone” greeting
./mvnw quarkus:dev -Dquarkus.args="--name=Developer"Each one prints a different color theme matching the tradition.
Package It as a Native Present 🎁
If you have Mandrel installed, you can also quickly (Total time: 26.142 s on my machine) build a native app:
sdk use java 21.0.2-graal./mvnw package -DnativeRun your executable:
./target/santa-cli-1.0.0-SNAPSHOT-runner -h christmas -n "Coder" --listYour holiday CLI now starts in milliseconds, perfect for sharing with friends, colleagues, and open-source elves everywhere.
Why this makes Christmas evening special
Picocli handles inputs gracefully.
Clique paints the terminal with light and tradition — without wrestling raw ANSI codes.
Quarkus gives instant startup, ideal for CLI gifting.
The holidays are global, and so is your output.
A joyful little project that reminds us how diverse, colorful, and connected our developer community is.
Enjoy your warm coding moment.
As we wrap up this little seasonal build, I want to say thank you. If you’re reading this, you’re part of a community I’m genuinely grateful for. Your time, your curiosity, and your willingness to try new things, especially in a year as intense as this one, mean a lot.
I hope the holidays give you a real break. A bit of quiet. Some warmth. Maybe even a few uninterrupted hours where your laptop stays closed. Stay healthy, recharge properly, and enjoy your downtime. We’ve earned it.
Happy Christmas Evening — and Happy Holidays to all who celebrate in their own traditions.




