For the final part of the AICC series, it is time to build something practical.
AICC is a legacy standard, yet you can still create a simple working course with nothing more than a text editor, a web server, and some HTML files.
This prototype will show how the pieces come together: the AICC flat files, the launch process, and the HACP communication flow.
You will not get a full-fledged course, but you will understand exactly how AICC operated behind the scenes.
๐ Step 1. Create the AICC File Set
A simple AICC course needs at least five files:
course.crscourse.descourse.aucourse.cstcourse.cmp
Below is a minimal working example for each one.
- course.crs
This file tells the LMS that this folder contains an AICC course.
[Course] Course_ID=DEMO Course_Title=Minimal AICC Demo Course_Description=This is a simple example AICC course.
- course.des
This file contains metadata about the course.
[Description] Version=1.0 Author=Sami Akkawi Organization=The Inner Developer Keywords=AICC, Demo, Minimal Course
- course.au
This file defines the assignable units.
We will create only one AU.[Assignable Units] 1=AU1 [AU1] AU_ID=AU1 AU_Title=Welcome Lesson File_Name=lesson.html File_Path=. Mastery_Score=70
- course.cst
This file defines the structure.
With one AU, the structure is very simple.[Course Structure] 1=AU1
- course.cmp
This file tells the LMS how completion is evaluated.
[Core] Lesson_Status=completed
Once these files exist, your LMS can read the course structure and present the launch link.
๐งช Step 2. Create a Simple Launchable Lesson
Create a file called
lesson.html
in the same directory.
Here is the simplest possible example that can send data to the LMS through HACP.
<!DOCTYPE html>
<html>
<head>
<title>Minimal AICC Lesson</title>
</head>
<body>
<h1>Welcome to the Minimal AICC Lesson</h1>
<p>This is a very small AICC content example.</p>
<button onclick="sendResults()">Finish Lesson</button>
<script>
function sendResults() {
// The LMS gives these values as URL parameters
const params = new URLSearchParams(window.location.search);
const aiccSid = params.get("AICC_SID");
const aiccUrl = params.get("AICC_URL");
// Build the HACP payload
const payload =
"AICC_SID=" + encodeURIComponent(aiccSid) +
"&AICC_DATA=" + encodeURIComponent("core.lesson_status=completed");
// Send results to the LMS
fetch(aiccUrl, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },,
body: payload
})
.then(response => response.text())
.then(text => {
alert("LMS Response: " + text);
});
}
</script>
</body>
</html>This is simple JavaScript sending a classic HACP request.
There is no SCORM API, no runtime environment, and no iframe requirement.
You can improve the payload. For example:
core.lesson_status=completed
core.score.raw=85
core.session_time=00:20:31
core.total_time=00:20:31
๐ Step 3. Understand the Launch URL
When the LMS launches your AU, it will open something like:
https://yourserver.com/lesson.html?AICC_SID=12345&AICC_URL=https://lms.example.com/hacp
Your content must read the AICC_SID and AICC_URL values.
These allow the lesson to send progress data back to the LMS.
You have already used these values in the example above.
๐จ Step 4. Sending Manual HACP Requests (Optional)
If you want to test without an LMS, you can simulate HACP calls using a tool like
curl
.
Example:
curl -X POST https://lms.example.com/hacp
-H "Content-Type: application/x-www-form-urlencoded"
-d "AICC_SID=12345&AICC_DATA=core.lesson_status=completed"
This will show you exactly how the content communicates with the LMS.
You can also simulate richer data:
core.lesson_status=pased
core.score.raw=92
core.session_time=00:32:10
๐ก๏ธ Step 5. Common Testing Checks
If your AICC course is not working, check the following:
Are the AICC files named with the correct extensions?
Is the
[Section]header spelled correctly?Does
course.aupoint to the right file path?Is the
lesson.htmlfile accessible from the LMS server?Are you receiving valid AICC_SID and AICC_URL parameters?
Are all HACP POST requests using the content type
application/x-www-form-urlencoded?
These small checks catch most issues.
๐ What This Teaches You
With this small prototype you have seen that:
AICC content is self-describing
The LMS uses flat files to understand the course
Launching requires only a normal browser URL
Communication happens through simple HTTP messages
You do not need SCORM, iframes, or JavaScript APIs
AICC is still understandable with modern tools
Legacy systems are often simpler than they appear.
AICC succeeded because its design was clear, readable, and easy to debug.
๐ก Developer Reflection
AICC may look old today, yet the simplicity of this prototype still feels refreshing.
It shows that a system can be powerful when it is transparent, predictable, and easy to reason about.
Modern systems often favor complexity because it feels capable.
AICC reminds us that clarity is a capability of its own.
Ask yourself:
How often do you design tools or models that someone else can understand without explanation?
And how much friction could you remove by making your next design as simple as these five text files?
๐ข 8 of 8 | AICC โ The Origins of E-Learning Standards
Thank you for following the entire series.
We will continue with SCORM 1.2, SCORM 2004, xAPI, cmi5, …








