@@ -14,11 +14,11 @@ pub_date: 2025-10-06
1414body:
1515This is part 2 of a three part series.
1616
17- Part 1: History and debt: The historical context that led to the newest
18- refactor and release of the 2025 Chooser.
19- Part 2: Specifics and fixes: Breaking down the specifics of technical debt,
20- issues, complexity, contextual-shift misalignment, and fixes.
21- Part 3: Future Growth: What’s next for the Chooser, and what directions we
17+ - [ Part 1: History and debt: The historical context that led to the newest
18+ refactor and release of the 2025 Chooser] [ chooser-refactor-part1 ] .
19+ - ** Part 2: Specifics and fixes: Breaking down the specifics of technical debt,
20+ issues, complexity, contextual-shift misalignment, and fixes.**
21+ - Part 3: Future Growth: What’s next for the Chooser, and what directions we
2222hope to grow it.
2323
2424The Creative Commons Chooser 2025 refactor offers a number of improvements
@@ -27,7 +27,259 @@ if the footprint or implementation could be more straightforward and simple and
2727then worked from there. The end goal being an application that would be
2828considerably more flexible in its upkeep and advancement.
2929
30+ ## Reevaluating core features and use
31+
32+ This was accomplished by first understanding and reestablishing what the core
33+ set of functionality the Chooser should provide.
34+
35+ We started with the use cases that were present within the 2020 beta Chooser:
36+
37+ 1 . Provide a license recommendation
38+ 2 . Passively educate the user about licenses and their properties/use-cases
39+ 3 . Allow a user, who is an Author, to generate a "mark" in a variety of formats
40+ (which generally meets the requirements of the license)
41+ 4 . Allow a user, who is a reUser/reMixer, to generate an "attribution" mark
42+ when not adequately provided from the original author
43+
44+ From the above four use cases, 1 & 2 were the original core aims of the Chooser.
45+
46+ Use case 3 was added as a mechanism to make applying the choice easier (but if
47+ the Author doesn't adequately provide a mark with Attribution Information then
48+ reUsers/reMixers may not be able to meet the spirit of the terms of the license
49+ (Attribution being required). The Attribution Details being optional is true in
50+ that it doesn't block a license recommendation, nor the passive education (1 &
51+ 2); but if a user is expecting 3 as a main use-case then the Attribution
52+ Details become required, colliding with a contextual expectation.
53+
54+ Use case 4 was not an intention of the Chooser, but something users have ended
55+ up using it regularly for, since Authors will often only use a general marking
56+ statement, such as “This Work is licensed CC-BY”.
57+
58+ Moving forward we would hope to focus on use cases 1-3, with the initial MVP
59+ scope of the Chooser refactor prioritizing 1, and then moving into the other
60+ two as supporting use cases. Use case 4 will not be a primarily supported use
61+ case, but we expect people will continue to use the Chooser for it until a
62+ better tool comes along.
63+
64+ ## Turning scope into technical methods
65+
66+ The Chooser spirals outward from the core decision pathways in the stepper
67+ guiding someone through a series of questions and resulting
68+ recommendations.Those pathways have two main branches that fork at the
69+ beginning (Do you need help? Yes/No), and regardless of what comes after,
70+ eventually provide an appropriate recommendation once all required fields are
71+ met.
72+
73+ From there, the Attribution Fields can be filled out and will populate the
74+ Marking section to allow for easier work marking from all the available user
75+ supplied data.
76+
77+ This means the decision stepper is the core piece of technical functionality
78+ that we would need to stabilize first, and everything else would then build
79+ from that standard setup.
80+
81+ We could employ a method of interwoven if/else and/or switch statements that
82+ moved through a series of logic gates checking against combinations of
83+ question/answer pairings combined together into certain recommendations, but in
84+ the case of the Chooser we already know what all the answers are. We know that
85+ the recommendation can be 1 of 7 possible legal tools, and that there are two
86+ main pathways to get to each of those tools from the “Do you know which
87+ license you need? yes/no” question.
88+
89+ If we work backwards from this premise we can standardize these pathways into a
90+ format which can describe the complete decision tree, and then work backwards.
91+
92+ That then looks generally like this:
93+
94+ `[ step-1-question] /[ answer] /[ step-2-question] /[ answer] /…/&tool=[ tool-req-name]
95+ `
96+
97+ This breaks down into 14 possible correct pathways.
98+
99+ This format lets us describe the pathway state throughout a particular UX, in a
100+ uniform and easily parsable format.
101+
102+ From there we can set up the form to build out a state pathway as questions are
103+ answered, and when a full path matches a possible correct path end state, a
104+ particular recommendation can be accurately made.
105+
106+ Everything else can be assumed to be unknown (non matching).
107+
108+ This gives us a starting point to set up a simple state machine, and check
109+ against routinely at specific events and provide recommendations and/or update
110+ the interface.
111+ Reducing the JavaScript footprint and overhead
112+
113+ Once we no longer needed a complex state management engine because we only have
114+ 14 possible correct “states” we’d like to handle, we could move away from
115+ the need for a larger more complex state management framework like Vue.js.
116+
117+ The 2020 beta Chooser utilized Vue.js and its dependency chain, the newer 2025
118+ Chooser refactor utilizes a single vanilla JavaScript (JS) file. This resulted
119+ in approximately a 98% reduction in the amount of JavaScript!
120+
121+ This also lets us dramatically reduce the dependency chain, which in turn makes
122+ the Chooser more secure, more stable, and more maintainable overall.
123+
124+ Running the project through the [ SCC tool] [ scc-tool ] shows the newer refactor
125+ would be estimated to cost $113,716 to develop, take 6.02 months, and require
126+ 1.68 people to complete.
127+
128+ The refactor planning began in 2024, but the total time from initial refactor
129+ to completion code-wise was approximately 3 months (half the estimated time),
130+ with 1 person working on it part time (due to other obligations and
131+ responsibilities).
132+
133+ The original 2020 beta Chooser run through the SCC tool shows an estimated cost
134+ to develop of 8.88 months, and requiring 3.16 people to complete. This means
135+ not only did the refactor overperform on cost on its own estimations, it
136+ reimplemented the same degree of functionality with 1.8% of the code of the
137+ original, and accomplished what would have taken 3 people to do in 9 months
138+ full-time.
139+
140+ This is good, because the Chooser needs to be more maintainable and stable, but
141+ also flexible enough to build out newer features over time.
142+
143+ The state paths and smaller footprint means that we are left with a minimal
144+ amount of logic required to alter the visual state of the UX, and to allow a
145+ user to move through the stepper, the attribution fields, and the various
146+ marking formats and their individual functionalities.
147+ Embrace native support and semantics
148+
149+ As the decision stepper is the main interaction element, the new markup was
150+ first built from there, setting up a semantic form, grouped into fieldsets, and
151+ labelled accordingly.
152+
153+ The classes in particular let the markup describe each component in a way that
154+ can be more directly tied to the logic the JS will later perform.
155+
156+ There is some measure of dynamic “data + markup” being swapped within the
157+ UX based on user selections. Previously Vue.js packages and their dependencies
158+ would handle holding onto this data.
159+
160+ In the refactor we opted to make use of the ` <template> ` element, which let us
161+ lean on existing HTML and JS functionality, and also established a foundation
162+ from which more robust Web Components could be utilized later if such a need
163+ arose, giving us a stable path of complexity to follow down the line.
164+
165+ We also opted to avoid the use of popup modals and tabs, and instead leaned on
166+ ` <summary>/<details> ` elements instead to accomplish similar behavior without the
167+ need for JS based behavior. Once again keeping our JS footprint much smaller.
168+
169+ ## Improving the UX
170+ ### Reducing friction
171+
172+ We tried to reduce redundancy and better control friction within the UX
173+ wherever possible in the 2025 refactor.
174+
175+ The prior 2020 beta Chooser had “Next” and “Back” buttons within the
176+ interface which largely had no necessary purpose. The Tool Recommendation was
177+ often updated live as fields were filled out, so the only reason to hit the
178+ Next button was to get more of the input interface to appear, rather than to
179+ get more useful output within the Recommendation area.
180+
181+ With the refactor we removed these buttons, giving the user the ability to move
182+ from fieldset to fieldset within the UX without an additional step in the
183+ process of input. Whether they move forwards or backwards the UX responds
184+ accordingly without the added friction. This lets people move through to a
185+ recommendation much more quickly. This change also lets us remove the
186+ “Reset” button as well, since moving backwards through the fieldsets will
187+ reset lower fieldset values automatically. We also get a boost in accessibility
188+ with its removal, since it’s not advised as a solid use case within
189+ accessible interfaces, due to it being too easily clicked.
190+
191+ “The Web would be a happier place if virtually all Reset buttons were
192+ removed. This button almost never helps users, but often hurts them.” (Reset
193+ and Cancel Buttons - NN/G)
194+
195+ We also removed the final Done button and its adjacent shaking behavior. The
196+ “Done” button had an erroneous purpose, since the recommendation was
197+ already available on the right, and it was unclear why the “Done” button
198+ would be necessary to reach a final UX state.
199+
200+ The shaking behavior is also generally a UX convention deployed to indicate
201+ that an error has occurred or that inadequate or incorrect information has been
202+ input within a form. The original aim with the prior chooser was to draw
203+ attention to the Tool Rec and marking areas being “finished”, but instead
204+ communicated that some form of error had occurred. This was reported multiple
205+ times by users, so this behavior was removed entirely to make things less
206+ confusing and more clear.
207+
208+ The shaking behavior was accompanied by a form of “scroll jacking” which
209+ would scroll the user’s viewport back to the top so the shaking behavior
210+ could be visible when it occurred. This was also removed.
211+
212+ Overall, we also tried to remove the number of steps, clicks, or choices a user
213+ might have to move through to get to a usable recommendation where possible.
214+ One clear example of this is prepopulating the first question with the default
215+ of “Yes”. This means returning users who are already familiar with the
216+ choice can proceed more swiftly without adding any additional steps for those
217+ that still need help.
218+
219+ Attribution marking now shows up as soon as a tool recommendation has been
220+ provided, linking the two together better contextually, and not as a later
221+ phase of the form’s state lifecycle.
222+
223+ ### Adding friction
224+
225+ To make the UX more usable we also added friction where it made sense. The
226+ pathway that leads to a CC0 recommendation no longer provides a recommendation
227+ without checking the two acknowledgement checkboxes, to ensure the user is
228+ given the chance to fully understand what they are doing by utilizing CC0.
229+
230+ We also leaned more on the “Need Help?” section to provide deeper
231+ explanations rather than adding more information in other areas. This
232+ section’s newer placement lets it serve as a way to drill down further,
233+ without having to increase the density of information in the fieldsets.
234+ Better related UX element binding and separation
235+
236+ Despite being a rather simple interface the Chooser offers several overlapping
237+ use cases, and as such we tried to find subtle ways to bind distinct areas of
238+ input to related areas of output either with attention focus, or with some
239+ measure of connective mechanisms.
240+
241+ The Attribution fields include descriptive placeholder data, which also shows
242+ up within the various marking formats helping to bind the two areas together as
243+ having an input/output relationship not just generally, but also more
244+ specifically for the individual input fields and output tokens. This allows a
245+ user to start with the Attribution fields and see the results in the Marking
246+ formats, or first encounter the Marking Formats after reaching a Tool
247+ Recommendation, and then make a connection back to the Attribution Fields as
248+ the input source for them. The goal being a bi-directional relationship that is
249+ intuitive.
250+
251+ Another area where this shows up is with the Tool Recommendation itself. When
252+ it appears after a successful set of fieldsets align it is distinctive in its
253+ appearance, but it also has a “waiting for required fields” placeholder
254+ element for the zero state of the UX, so that the shift is more intuitive that
255+ results will appear here once input, and that they are also distinct visually
256+ from the Marking Formats section below.
257+
258+ ## Increasing plasticity
259+
260+ The final result of the refactor is a dramatically smaller and more manageable
261+ codebase, a much narrower pathway of function and logic, better integration
262+ with the Vocabulary Design system, and a robust use of semantic accessible
263+ markup. This radical reduction in the code footprint and complexity overall
264+ means the refactored 2025 Chooser is now much more agile and can more easily
265+ grow or pivot in new directions.
266+
267+ ## Closing
268+
269+ Despite the number of improvements throughout the refactor, one of the key
270+ goals was clearing out enough bitrot and complexity to make room for the
271+ project to grow sensibly and responsibly again. We weren’t just trying to
272+ improve the Chooser for a static launch, but to reposition it so that it could
273+ once again grow more easily in the directions that would benefit its users most.
274+
275+ We already have a bit of a roadmap in mind, and we’ll get into that in the
276+ final installment, ** Part 3: Future Growth: What’s next for the Chooser** , and
277+ what directions we hope to grow it.
278+
279+
30280
31281[ cc-website ] : https://creativecommons.org/share-your-work/
32282[ chooser ] : https://creativecommons.org/choose/
33- [ open-verse ] : https://openverse.org/
283+ [ chooser-refactor-part1 ] : /blog/entries/2025-07-11-refactoring-the-cc-chooser-pt-1/
284+ [ open-verse ] : https://openverse.org/
285+ [ scc-tool ] : https://github.com/boyter/scc
0 commit comments