HackIndia Logo
HackathonsNewsSkillsGrowth
HackIndia LogoContact: +91 9910125804

General

  • Companies
  • Colleges
  • Board of Advisors
  • Brand Ambassadors
  • FAQ
  • Contact
  • Report a Bug

Hackathons

  • Upcoming Hackathons
  • Judges
  • Mentors
  • Partners
  • Participating Colleges
  • Testimonials

Resources

  • About Us
  • Branding
  • Latest News
  • Growth
  • Skills
  • Builders
  • Ecosystem
  • Forum
  • Ideas
  • Prompt Optimizer
  • Games

© 2026 HackIndia. All rights reserved.

Privacy PolicyTerms of ServiceCode of ConductSitemap

Build 2.139 · 05 Nov 2026, 10:27 UTC

    HackIndia
    HackathonsNewsInternshipsSkillsGrowthPro Perks
    ← Build a Java CLI recruiter project

    All the reading

    Java

    8 lessons, about 34 minutes. The check's questions come from these.

    Contents
    Picking scope and data structures
    1. 1. Java project worth showing
    2. 2. Types and collections
    Modeling and validating data
    1. 3. Classes and interfaces
    2. 4. Generics and exceptions
    Processing files and submitting
    1. 5. Streams and lambdas
    2. 6. Files and JSON handling
    3. 7. Maven or Gradle basics
    4. 8. Submit your public repo

    Picking scope and data structures

    1. Java project worth showing

    5 min

    In 30 seconds
    • Pick a Java CLI project that proves one useful skill clearly.
    • Scope a recruiter app small enough to finish during college weeks.
    • Write a README promise before you write the code.

    What counts

    A Java project worth showing is not a large app. It is a finished app that another person can run without asking you questions.

    For this track, you will build a command-line recruiter helper. It reads candidate data, applies simple logic, prints useful results, and handles bad input cleanly.

    Key point

    Remember this

    Your repo should prove one thing clearly: you can turn a small problem into working Java code that someone else can build and run.

    Internship reviewers do not need 20 features. They need evidence of structure, correctness, and care.

    Your to-do

    Choose the promise

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    Example

    Good project scope

    Here is a small promise you can actually ship.

    It is specific enough to guide your classes later, but not so big that it blocks you.

    Project name: recruit-shortlister
    
    What it does:
    Reads candidate records from sample data.
    Filters candidates by role, minimum CGPA, and required skills.
    Prints a ranked shortlist in the terminal.
    Shows clear error messages for missing or invalid data.
    
    Example command idea:
    java -jar recruit-shortlister.jar data/candidates.csv backend 7.5 java,sql

    2. Types and collections

    4 min

    In 30 seconds
    • Pick Java types that match recruiter data without overbuilding.
    • Use List, Set, and Map for jobs, skills, and lookups.
    • Add small collection logic your CLI can show later.
    Key point

    One idea

    Types protect meaning. Collections protect structure. In a recruiter CLI, use simple types for one value and collections for many values.

    Use the right type

    A job title is a String. Years of experience is an int. A salary range can start as two int values in rupees per month. A yes/no field, like remote allowed, is a boolean.

    Avoid storing everything as String just because input comes from the terminal or a CSV file. Convert early, then the rest of your code becomes easier to trust.

    Choose collections

    Use a List when order matters or duplicates are allowed. Job applications in the order they were loaded can be a List.

    Use a Set when duplicates should not exist. A candidate’s skills are a Set because Java should appear once, not five times.

    Use a Map when you need fast lookup by a key. Recruiter name to open job count can be a Map.

    Example

    Modeling and validating data

    3. Classes and interfaces

    5 min

    In 30 seconds
    • Model recruiter data with small Java classes.
    • Use an interface to separate matching logic from data.
    • Keep your CLI easier to test, change, and explain.
    Key point

    One idea

    A class should represent one real thing in your app. An interface should represent one action your app can swap or improve later.

    For a recruiter CLI, Candidate and Job are classes. MatchScorer is an interface because matching can change from simple keywords to a better scoring rule.

    Why this matters

    A project repo looks stronger when your code is not one long Main.java file. Recruiter apps have clear nouns: candidate, job, skill, application, score.

    When each idea has its own class, another builder can open your repo and understand it fast. This also helps later lessons when you add files, JSON, streams, and a build tool.

    Your to-do

    Choose your classes

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    Processing files and submitting

    5. Streams and lambdas

    4 min

    In 30 seconds
    • Use lambdas to pass small bits of behavior into methods.
    • Use streams to filter, map, sort, and collect candidate data.
    • Keep stream code readable so your recruiter CLI stays easy to review.
    Key point

    One idea

    A lambda is a short function value. A stream is a clean way to process a collection step by step without writing manual loops for every task.

    Where this fits

    Your recruiter CLI will have candidate data in lists. You may need to show shortlisted candidates, count skills, sort by score, or print names in a clean format.

    You can do all of that with normal for loops. Streams are useful when the job is a pipeline: filter, transform, sort, collect.

    Example

    Candidate example

    Assume your Candidate class has name, city, skills, and score getters. This code finds Java candidates in Bengaluru or remote-ready candidates, sorts by score, and prints a shortlist.

    10 questions, 7 to pass.

    Sign in to take the test
    Common mistake

    Do not build vague

    A vague idea like “AI recruiter system” or “job portal” becomes hard to finish. You will waste time naming features instead of shipping code.

    Start with a boring, useful CLI. You can still explain it well in your HackIndia submission because it has a real user, real data, and a clear result.

    Tip

    Use AI carefully

    You can ask ChatGPT, Gemini, or Claude to help turn your idea into a project plan. Do not paste the answer blindly into your README.

    Check that the plan stays small, uses Java CLI only, and matches what you can build with your current timetable.

    Prompt:
    I am building a small Java command-line project for an internship portfolio.
    The app helps a college placement volunteer shortlist candidates.
    Keep the scope small: no web app, no database, no login.
    Suggest a 5-line project promise, sample input fields, and terminal output.
    
    Check the answer for:
    - Can I finish this in 2 to 3 weeks?
    - Can it run from a public repo?
    - Does it need only Java and a build tool?
    - Is the output easy to verify?
    Example

    README first draft

    Write this before coding. It becomes your target.

    Later lessons will fill in classes, files, builds, and error handling.

    # Recruit Shortlister
    
    A Java command-line app that helps a placement volunteer shortlist candidates for a role.
    
    It will:
    - Read sample candidate data from the repo
    - Filter by role, minimum CGPA, and required skills
    - Print a ranked shortlist in the terminal
    - Show clear messages when input is missing or invalid
    
    Planned run:
    java -jar recruit-shortlister.jar data/candidates.csv backend 7.5 java,sql
    Your to-do

    Do this now

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    Recruiter data example

    This is not the final class design. That comes in the next lesson. For now, see how types and collections shape the data.

    import java.util.*;
    
    public class RecruiterDataDemo {
        public static void main(String[] args) {
            String candidateName = "Asha Mehta";
            int experienceYears = 1;
            boolean openToRelocation = true;
    
            List<String> jobTitles = new ArrayList<>();
            jobTitles.add("Java Intern");
            jobTitles.add("Backend Intern");
            jobTitles.add("Software Developer Trainee");
    
            Set<String> skills = new HashSet<>();
            skills.add("Java");
            skills.add("SQL");
            skills.add("Java"); // duplicate is ignored
    
            Map<String, Integer> recruiterOpenings = new HashMap<>();
            recruiterOpenings.put("Zoho", 3);
            recruiterOpenings.put("Razorpay", 2);
            recruiterOpenings.put("Local Startup", 1);
    
            System.out.println(candidateName + " has skills: " + skills);
            System.out.println("Jobs loaded: " + jobTitles.size());
            System.out.println("Zoho openings: " + recruiterOpenings.get("Zoho"));
        }
    }
    Common mistake

    Common mistake

    Do not use ArrayList for everything. It works at first, then your code becomes messy when you need uniqueness or lookup.

    If you often ask “does this skill exist?”, use Set. If you often ask “what value belongs to this key?”, use Map.

    Tip

    Let AI help safely

    You can ask an AI tool: “Suggest Java types and collections for a CLI app that stores candidates, skills, jobs, and recruiters.” Then check the answer yourself.

    Reject designs that are too advanced for now, like databases, web APIs, or many patterns. This lesson only needs primitive types, String, List, Set, and Map.

    Your to-do

    Do this now

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    0 of 5 done

    Example

    Candidate class

    Start with a small class. Do not add every profile field from LinkedIn. Add what your CLI will show or use.

    This class stores data and has one useful method: checking if the candidate has a skill.

    import java.util.List;
    
    public class Candidate {
        private final String name;
        private final String email;
        private final List<String> skills;
        private final int experienceMonths;
    
        public Candidate(String name, String email, List<String> skills, int experienceMonths) {
            this.name = name;
            this.email = email;
            this.skills = skills;
            this.experienceMonths = experienceMonths;
        }
    
        public String getName() {
            return name;
        }
    
        public String getEmail() {
            return email;
        }
    
        public List<String> getSkills() {
            return skills;
        }
    
        public int getExperienceMonths() {
            return experienceMonths;
        }
    
        public boolean hasSkill(String skill) {
            return skills.contains(skill);
        }
    }
    Example

    Job class

    A job also has data. Keep it focused on matching candidates in your CLI.

    For an Indian campus project, a stipend or salary field can be useful, but only add it if your app uses it.

    import java.util.List;
    
    public class Job {
        private final String title;
        private final String company;
        private final List<String> requiredSkills;
    
        public Job(String title, String company, List<String> requiredSkills) {
            this.title = title;
            this.company = company;
            this.requiredSkills = requiredSkills;
        }
    
        public String getTitle() {
            return title;
        }
    
        public String getCompany() {
            return company;
        }
    
        public List<String> getRequiredSkills() {
            return requiredSkills;
        }
    }
    Example

    Interface for scoring

    Do not hard-code matching inside Main. Put the matching rule behind an interface.

    Later you can replace keyword scoring without changing the rest of the CLI.

    public interface MatchScorer {
        int score(Candidate candidate, Job job);
    }
    
    public class SkillMatchScorer implements MatchScorer {
        @Override
        public int score(Candidate candidate, Job job) {
            int score = 0;
    
            for (String skill : job.getRequiredSkills()) {
                if (candidate.hasSkill(skill)) {
                    score = score + 10;
                }
            }
    
            return score;
        }
    }
    Common mistake

    Common mistake

    Beginners often put input, printing, data, and matching in one file. It works for a demo, but it becomes hard to change before a hackathon submission.

    Keep Main for running the CLI. Put business ideas in classes. Put changeable rules behind interfaces.

    Your to-do

    Do this now

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    4. Generics and exceptions

    4 min

    In 30 seconds
    • Use generics to keep lists and maps type-safe in your recruiter CLI.
    • Create your own exception for bad candidate or job data.
    • Handle errors without crashing or hiding the real problem.
    Key point

    One idea

    Generics stop wrong data from entering your collections. Exceptions make failure visible and controlled.

    In your recruiter CLI, use both together: typed data in, clear error out.

    Why generics matter

    A recruiter app will hold candidates, jobs, skills, and match scores. If you use raw List or Map, Java cannot protect you from mixing them up.

    Prefer List, Map, and Optional style types. The compiler then catches mistakes before your friend tries to run the repo.

    Example

    Typed collections

    This is better than putting everything into one ArrayList. The method says exactly what it accepts and returns.

    import java.util.ArrayList;
    import java.util.List;
    
    public class CandidateStore {
        private final List<Candidate> candidates = new ArrayList<>();
    
        public void add(Candidate candidate) {
            candidates.add(candidate);
        }
    
        public List<Candidate> findBySkill(String skill) {
            List<Candidate> result = new ArrayList<>();
    
            for (Candidate candidate : candidates) {
                if (candidate.skills().contains(skill)) {
                    result.add(candidate);
                }
            }
    
            return result;
        }
    }

    Use custom exceptions

    A bad email, missing name, or invalid experience should not crash your app with a random NullPointerException. Create a small exception that explains the problem.

    Use checked exceptions when the caller should deal with the error. Use unchecked exceptions for programmer mistakes. For input data from users or files, a checked exception is often clearer.

    Example

    Validate candidate data

    This example rejects bad data early. The calling code must decide what to show to the user.

    public class InvalidCandidateException extends Exception {
        public InvalidCandidateException(String message) {
            super(message);
        }
    }
    
    public record Candidate(String name, String email, int experienceYears, List<String> skills) {
        public Candidate {
            if (name == null || name.isBlank()) {
                throw new IllegalArgumentException("Candidate name is required");
            }
            if (email == null || !email.contains("@")) {
                throw new IllegalArgumentException("Candidate email is invalid");
            }
            if (experienceYears < 0) {
                throw new IllegalArgumentException("Experience cannot be negative");
            }
        }
    }
    Common mistake

    Do not swallow errors

    Beginners often write catch blocks that print nothing or only say "error". That makes debugging painful during a hackathon demo.

    Show a short user-friendly message. Keep the original message useful for fixing the issue.

    try {
        Candidate candidate = parser.parseCandidate(inputLine);
        store.add(candidate);
    } catch (InvalidCandidateException e) {
        System.out.println("Skipped candidate: " + e.getMessage());
    }
    Tip

    Ask AI carefully

    You can ask ChatGPT or Gemini to review your exception design. Paste only the relevant class, not private data.

    Check that the AI does not suggest raw List, broad catch (Exception e), or System.exit inside business classes. Your app should handle errors near the CLI layer.

    Prompt:
    Review this Java CLI class. Suggest better generics and exception handling.
    Do not rewrite the whole app. Point out raw types, broad catches, and unclear error messages.
    Your to-do

    Do this now

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    import java.util.Comparator;
    import java.util.List;
    
    public class ShortlistService {
        public List<Candidate> shortlist(List<Candidate> candidates) {
            return candidates.stream()
                    .filter(candidate -> candidate.getSkills().contains("Java"))
                    .filter(candidate -> candidate.getCity().equalsIgnoreCase("Bengaluru")
                            || candidate.isRemoteReady())
                    .filter(candidate -> candidate.getScore() >= 70)
                    .sorted(Comparator.comparingInt(Candidate::getScore).reversed())
                    .toList();
        }
    
        public void printNames(List<Candidate> candidates) {
            candidates.stream()
                    .map(Candidate::getName)
                    .forEach(System.out::println);
        }
    }

    Read the pipeline

    Read a stream from top to bottom. stream starts the pipeline. filter keeps only matching items. map changes each item into another value. sorted orders the items. toList creates a new list.

    The arrow in candidate -> candidate.getScore() >= 70 is a lambda. It means: for each candidate, return true if their score is at least 70.

    Your to-do

    Use streams safely

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    Common mistake

    Do not over-chain

    A long stream can become harder to read than a loop. If you need many conditions, move them into a method with a clear name.

    This is better for reviews. Another builder should understand your repo without asking you on WhatsApp.

    private boolean isStrongJavaCandidate(Candidate candidate) {
        return candidate.getSkills().contains("Java")
                && candidate.getScore() >= 70
                && (candidate.getCity().equalsIgnoreCase("Bengaluru")
                || candidate.isRemoteReady());
    }
    
    public List<Candidate> shortlist(List<Candidate> candidates) {
        return candidates.stream()
                .filter(this::isStrongJavaCandidate)
                .sorted(Comparator.comparingInt(Candidate::getScore).reversed())
                .toList();
    }
    Tip

    Use AI carefully

    You can ask an AI tool to rewrite a loop as a stream. Then check three things yourself: it keeps the same result, it handles empty lists, and it stays readable.

    Do not accept code that uses unknown libraries or changes your class names. Your final repo should build cleanly on another laptop.

    Prompt:
    Rewrite this Java for loop using streams. Keep the same class names and only use the Java standard library. Explain any behavior change.
    Your to-do

    Do this now

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    6. Files and JSON handling

    4 min

    In 30 seconds
    • Read recruiter data from files instead of hard-coding it.
    • Store candidates or jobs as JSON that is easy to inspect.
    • Handle missing or broken files without crashing blindly.
    Key point

    One rule

    Your CLI should treat files as input, not as your program’s memory. Read data at the edge, convert it into Java objects, then let the rest of your code work with those objects.

    Why JSON here

    For this recruiter project, JSON is a good sample data format. It is readable, common in APIs, and easy for another builder to edit before running your app.

    Use it for things like candidates, jobs, skills, cities, expected salary, or application status. Keep the file small enough to understand in one screen.

    Example

    Sample data file

    Place sample files in a clear folder like data/. Do not hide them inside random package folders.

    Example: data/candidates.json

    [
      {
        "id": 1,
        "name": "Asha Nair",
        "city": "Kochi",
        "skills": ["Java", "SQL", "Git"],
        "expectedSalaryLpa": 6.0
      },
      {
        "id": 2,
        "name": "Rohit Sharma",
        "city": "Pune",
        "skills": ["Java", "Spring", "PostgreSQL"],
        "expectedSalaryLpa": 8.5
      }
    ]

    Reading files safely

    In Java, use Path and Files from java.nio.file for normal file work. They are cleaner than old File code for most CLI apps.

    Start with plain file reading. Then parse the JSON using a library such as Jackson or Gson once your build lesson adds dependencies.

    Example

    Read a JSON file

    This method reads the full file into a String. Your JSON parser can use that string later.

    It also gives a clear error if the file is missing, which is better than a long stack trace during a demo.

    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    
    public class JsonFileReader {
        public static String readJson(String filePath) {
            Path path = Path.of(filePath);
    
            if (!Files.exists(path)) {
                throw new IllegalArgumentException("File not found: " + filePath);
            }
    
            try {
                return Files.readString(path);
            } catch (IOException e) {
                throw new RuntimeException("Could not read file: " + filePath, e);
            }
        }
    }
    
    // Usage:
    // String json = JsonFileReader.readJson("data/candidates.json");
    Common mistake

    Avoid hard-coded data

    A common beginner mistake is creating all candidates inside main(). That makes your project look like a coding exercise, not a usable CLI tool.

    Keep two or three sample records in JSON. Let the user pass the file path later, or keep a sensible default like data/candidates.json.

    Tip

    Check AI output

    If you ask an AI tool to create sample JSON, check three things before committing it: valid JSON syntax, realistic field names, and data that matches your Java class names and types.

    For example, do not let one record use expectedSalary and another use expectedSalaryLpa unless your parser is built for that.

    Your to-do

    Do this now

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    7. Maven or Gradle basics

    4 min

    In 30 seconds
    • Choose Maven or Gradle for your Java CLI project.
    • Add a build file so others can compile and run it.
    • Use one command to test your repo before submitting.
    Key point

    One build command

    A good repo is not just source code. It has a build tool so another builder can clone it and run one clear command.

    Use Maven or Gradle. For this track, Maven is the simpler default because many Java examples and college labs already use it.

    What Maven does

    Maven reads a file named pom.xml. That file tells Maven your Java version, dependencies, and how to compile the app.

    You do not need to install every library by hand. If your project uses a JSON library, Maven downloads it from its central repository during the build.

    Example

    Small Maven file

    Put this pom.xml in the root of your project. Update the groupId, artifactId, and mainClass for your app.

    This example uses Java 17 and creates a runnable CLI jar with dependencies included.

    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>in.hackindia</groupId>
        <artifactId>recruiter-cli</artifactId>
        <version>1.0.0</version>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.17.2</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>3.6.0</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <transformers>
                                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>in.hackindia.recruiter.Main</mainClass>
                                    </transformer>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    Your to-do

    Standard layout

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    Example

    Build and run

    From the project root, run these commands. This is what another builder should be able to do after cloning your repo.

    mvn clean package
    java -jar target/recruiter-cli-1.0.0.jar data/candidates.json
    Common mistake

    Common build mistake

    Do not write instructions that only work in your IDE. HackIndia reviewers and other builders may use VS Code, IntelliJ, Eclipse, or only the terminal.

    Your project should build from a fresh clone. If it needs a manual library download or a local absolute path like C:\Users\name\file.json, fix that.

    Tip

    Use AI carefully

    You can ask ChatGPT, Gemini, or Claude to draft a pom.xml. Paste your package name, main class, Java version, and dependencies.

    Check the result. Make sure the mainClass is real, the dependency versions exist, and the commands work on your machine before you commit.

    Your to-do

    Do this now

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    8. Submit your public repo

    4 min

    In 30 seconds
    • Check your Java repo like another builder will run it.
    • Write a README with build, run, data, and expected output.
    • Submit a public repo that proves your project can be built.
    Key point

    Repo is the proof

    Your project is not finished when it works on your laptop. It is finished when another builder can clone it, build it, run it, and understand what it does.

    For HackIndia submission, your public repo must include the build file, source code, sample data, and clear run instructions.

    What reviewers check

    A recruiter-style Java CLI project should look boring in a good way. The folder names should be normal. The commands should be copy-paste friendly.

    Do not depend on hidden files, local absolute paths, or your IDE. Someone should be able to run it from Terminal, PowerShell, or a college lab machine with Java and Maven or Gradle installed.

    Your to-do

    Final repo checklist

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    Example

    README that works

    Use simple instructions. Mention the Java version you tested with. Show the exact command you expect someone to run.

    This example assumes a Maven app that reads a JSON file from data/candidates.json.

    # Recruiter CLI
    
    A Java command-line app that reads candidate data and prints a shortlist.
    
    ## Requirements
    
    - Java 17
    - Maven 3.9 or later
    
    ## Build
    
    mvn clean package
    
    ## Run
    
    mvn exec:java -Dexec.mainClass="com.hackindia.recruiter.Main" -Dexec.args="data/candidates.json"
    
    ## Sample data
    
    The sample file is included at:
    
    data/candidates.json
    
    ## Expected output
    
    Shortlisted candidates:
    1. Asha Sharma - Java, SQL
    2. Imran Khan - Java, Git
    
    ## Project structure
    
    src/main/java - Java source code
    data - sample input files
    pom.xml - Maven build file
    Common mistake

    Avoid local paths

    Do not write paths like C:\Users\Rahul\Desktop\candidates.json or /home/me/project/data.json in your code or README. They only work on your machine.

    Accept the file path as a command-line argument, or use a relative path like data/candidates.json in examples.

    Tip

    Test like a stranger

    Before submitting, make a fresh clone in a different folder. Run only the README commands. If anything is missing, fix the repo and test again.

    You can ask an AI tool to review your README, but check that it does not invent commands, plugins, folders, or features your project does not have.

    git clone https://github.com/YOUR-USERNAME/recruiter-cli.git test-run
    cd test-run
    mvn clean package
    Your to-do

    Submission flow

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done

    Your to-do

    Do this now

    Do each one yourself, then tap it to tick it off. The ticks are only a checklist for you: they are not marked or scored.

    0 of 5 done