User manual for Halcyon Days
How to install
- Download and unzip the software, if the latter isn’t done automatically. The resulting folder contains the main script HalcyonDays.jsx and action sets, ending in .atn.
- Quit Photoshop.
- Copy the script HalcyonDays.jsx to Photoshop’s scripts folder. On Mac it’s in /Applications/Photoshop 202x/Presets/Scripts and on Windows 10 it’s in C:\Program Files\Adobe\Adobe Photoshop 202x\Presets\Scripts. You may have to change the permissions of this folder to copy the script there.
- Start Photoshop and make sure Halcyon Days shows up in the menu File/Automate.
- Install the Photoshop actions by double-clicking on the files ending in .atn, or by loading it in the Actions palette.
How to run
You run the script by running on of the supplied actions, or by making your own actions. If you expand an action and double-click on the settings you can edit the script recipe.
Using and editing the ready-made actions
Halcyon Days actions are built from recipes (script settings), that determine the resulting look. By default, the images won’t be saved after the script runs, leaving them intact. Because of this, the actions won’t work for automation (such as droplets) just yet. If you make a droplet at this stage you’ll be prompted to save the image on every droplet run.
When you’re ready to have an action save the resulting image, or when you want to edit the recipe of an action, expand the action (click on the right bracket) to show the recorded script name, Halcyon Days. When you double-click on this, a dialog will open where you can edit the saved recipe. Click the button labeled Use this recipe to save your changes.
If you check Save and close when done the script will start saving and closing the image after it runs, so leave this unchecked while you’re still trying out different recipes.
Making your own actions
Make your own recipe actions by duplicating an existing action (click on the small hamburger menu in the upper right corner of the Actions palette and choose Duplicate) and change the name (by double-clicking on it) and edit the recipe as outlined above.
You can also record your own actions from scratch by having an image open and then click on the plus icon in the Actions palette, name the action and start recording. Choose Halcyon Days from the File/Automate menu, paste the recipe you want, make sure Save and close when done isn’t checked (otherwise the image will close and you can’t stop the recording) and click Use this recipe to run the script. When it’s finished, open the recipe again as outlined above, check Save and close when done and save the recipe, if you’re ready for the script to start saving your images.
You can make as many actions with different settings as you like.
Recipe settings
The script takes a number of settings, written as a semicolon-separated text string (recipe):
- highlight_cutoff —
autoor0–255. Useautofor the script to find the brightest usable level, or an integer to force a fixed cutoff. - min_highlight_cutoff —
0–255. Whenhighlight_cutoffisautothis is the lower bound the script will use. - highlight_hardness —
0–60. Controls midtone crush / contrast applied to the bright-pass (higher = stronger midCrush; script note: 10 = baseline). - highlight_tonal_range —
0–255. How far down from the absolute brightest pixel the bright-pass includes (larger = wider tonal inclusion for rim generation). - bloom_radius —
0–255. Base blur radius for halation (this value is scaled by document size in the script; larger = wider glow). - bloom_fraction —
1–9. Inner/outer size ratio; the inner blur usesbloom_radius / bloom_fraction, so larger values give a smaller, tighter inner halo. - bloom_brightness —
0–100. Brightness/contrast boost applied to the halation layers to compensate for darkening from blur. - bloom_multiply —
0–5. Number of duplicate+merge passes applied to the outer halation layer to amplify/spread it. - red_inner —
0–255. Red channel for the inner (closest-to-highlights) halation tint. - green_inner —
0–255. Green channel for the inner halation tint. - blue_inner —
0–255. Blue channel for the inner halation tint. - red_outer —
0–255. Red channel for the outermost halation tint. - green_outer —
0–255. Green channel for the outermost halation tint. - blue_outer —
0–255. Blue channel for the outermost halation tint.
Checkbox-controlled (dialog) settings
These are options presented as checkboxes and small inline controls in the script dialog.
- Add Global Halation — toggles the image-wide/global halation layer. The numeric percent field next to this checkbox controls the intensity of the effect.
- Boost Highlight Chroma — enables targeted chroma reinforcement in highlight regions. The numeric percent field next to this checkbox controls the intensity of the effect.
- Smooth Chroma Transitions — enables microscopic Lab-channel softening (Lab
a/bmicro-blurs) for film-like color blending. - Save and close when done — if checked, the script saves and closes the document when finished.
Hard-coded / script-default settings
Some behaviour and defaults are set directly in the .jsx source and are not exposed in the dialog or the recipe string. To change these you must edit Halation.jsx.
- perceptualGamma — applies a gamma curve to the
highlight_tonal_rangevalue to make the slider feel more perceptually linear. The default0.6makes small slider values more responsive (rapid visible change at low values) while larger values taper off gradually. This prevents the slider from feeling “dead” at one end and overly sensitive at the other. Lower gamma values (e.g., 0.4–0.5) make small changes even more dramatic; higher values (0.7–0.9) create a more mathematically linear response. - work_in_16bit —
trueorfalse. Whentrue, the script temporarily converts 8-bit documents to 16-bit for processing, then converts back to 8-bit at the end. This reduces banding and posterization in gradients, especially in the halation layers. Set tofalseto keep documents in their original bit depth (faster but may show banding with aggressive settings). Default:true. - halation_grain —
trueorfalse. Whentrue, adds a film grain layer to the local halation effect, creating more authentic film-like texture. The grain helps the halation blend naturally with the image instead of appearing as a purely digital glow. Default:true.
Global halation
Global halation is a broad, image-wide glow effect that recreates an atmospheric quality seen in certain film stocks and exposure conditions. In analog film, global halation occurs when light scatters through the entire film base and emulsion layers, creating a subtle veil that affects the entire image rather than just individual highlights. This is particularly visible in high-contrast scenes or when shooting toward bright light sources—the overall image takes on a softer, more ethereal quality as if wrapped in a gentle haze.
The script emulates this by creating a heavily blurred duplicate of the image, analyzing its highlight energy to determine appropriate opacity, and applying halation color tints (primarily the outer color, with inner color applied to the brightest areas). Unlike local halation (which creates distinct glows around individual bright sources), global halation responds to the overall luminosity and tonal character of the entire image, becoming more pronounced in bright, high-key scenes and more subtle in darker images. This adaptive behavior mimics how film base scatter varies with exposure intensity.
Enable global halation from the dialog with the “Add Global Halation” checkbox. Use the numeric percent field next to the checkbox to control the strength (global_amount, 0–100). Lower values (20–40%) give a subtle atmospheric veil suitable for adding dimension without obvious glow. Medium values (50–70%) produce classic film-like diffusion. Higher values (80–100%) create pronounced, dreamy halation for high-key or backlit scenes. The effect combines with your halation color settings, allowing warm golden veils or cooler tones depending on your recipe.
Boost Highlight Chroma
The Boost Highlight Chroma option selectively reinforces color saturation in highlight regions, mimicking how film emulsions often retain and even intensify chroma in bright areas rather than washing out to white. This is a key characteristic of analog film that digital sensors typically don’t reproduce.
The script builds a highlight mask from the image’s luminance channel focused on the brightest tonal regions, then applies targeted chroma smoothing and selective color curve adjustments in Lab color space to both the a and b channels. The result is blended back using Color blend mode, which preserves luminance while enriching chroma—ensuring that highlights become more colorful without changing their brightness.
The percentage control (1–100) determines the strength of the chroma boost. Lower values (20–40%) provide subtle, naturalistic enhancement suitable for most images. Higher values (50–80%) create more pronounced film-like color intensity in highlights, useful for high-key scenes or when emulating specific film stocks with strong chroma retention. The effect automatically scales based on your highlight_tonal_range setting to maintain coherent results.
This feature is particularly effective when combined with warm inner halation colors, as it helps preserve the golden/amber glow that characterizes many classic film stocks in backlit scenes.
Smooth Chroma Transitions
The Smooth Chroma Transitions option applies microscopic Lab-channel softening to recreate the organic color blending characteristic of film grain and dye clouds. Film emulsions don’t render perfectly sharp color transitions—the physical structure of grain clumps and dye layers creates subtle color diffusion that softens chroma boundaries while preserving luminance detail.
The script applies tiny, carefully calibrated micro-blurs primarily to the perceptual Lab a and b color channels, with minimal impact on the lightness channel. This removes the harsh, “digital” feel of pixel-perfect color edges and introduces the gentle chroma roll-off you see in film scans. The effect is subtle but crucial for authenticity—it’s the difference between a clinically sharp digital render and the softer, more painterly quality of analog film.
Highlight and bloom — how they work and how they interact
highlight_tonal_range controls how far down from the absolute brightest pixels the script includes data for the bright-pass (0–255). Small values restrict the bright-pass to the very tips of highlights, producing thin rim details; larger values include more of the nearby tonal ramp and create a wider base for rim and bloom effects.
highlight_hardness controls how sharply the bright-pass is shaped before rim and bloom are generated (0–60). Higher values steepen the tonal slope around highlights so that brightness is concentrated into a thin, bright edge with a darker falloff immediately outside — producing a narrow, high-contrast rim. Lower values keep the slope gentle, spreading brightness over a wider area and creating a softer, more gradual halo.
bloom_radius is the base blur radius used to create the halation glow (scaled by document size). Larger radii produce a broader, softer glow that extends further from highlight sources; smaller radii keep the glow compact.
These three settings form a chain: highlight_tonal_range selects which pixels are considered highlight sources; highlight_hardness sculpts those sources by modulating midtone compression; bloom_radius then blurs the sculpted sources into the visible glow. For example, a large tonal range with high hardness yields a rim that originates from a wide band but appears narrow and contrasted; increasing bloom radius in that case spreads the rim into a softer halo.
Additional related controls: bloom_fraction sets the inner-to-outer blur ratio (inner blur = bloom_radius / bloom_fraction), and bloom_brightness adjusts post-blur brightness/contrast to compensate for darkening from large radii. The script’s perceptualGamma remaps the tonal-range slider for perceptual responsiveness, so slider steps may have non-linear visual impact.
Tips and tricks
- If you want to change the color values in actions, darker colors results in a weaker effekt and brighter colors in a stronger effect. If you set the red, green and blue color to the same value you get a grayscale color, useful for monochrome halation.
- Setting #1 to
automeans the script will determine the brightest level in your image and calculate where to place halation from there. #2 then puts a lower cap on that value.