From b4d4559c155df1b90bd6ae1a6a15530ec66a6832 Mon Sep 17 00:00:00 2001 From: nbriz Date: Mon, 4 Aug 2025 17:51:08 -0500 Subject: [PATCH 1/6] re-organizing and adding content for new initial structure --- docs/README.md | 50 ++++++++++++--- docs/build-docs.js | 2 +- docs/contributors/README.md | 52 ++++++++++++++++ .../contributor-workflow.html | 2 +- .../contributor-workflow.md | 0 docs/contributors/index.html | 58 ++++++++++++++++++ .../manual-setup.html | 2 +- .../manual-setup.md | 0 .../index.html => contributors/support.html} | 10 +-- .../README.md => contributors/support.md} | 5 +- docs/developers/README.md | 17 ----- docs/developers/index.html | 54 ---------------- docs/educators/README.md | 12 ++++ docs/educators/index.html | 39 ++++++++++++ docs/{advocates => images}/cosa.png | Bin docs/{ => images}/readme-banner.png | Bin docs/{advocates => images}/saic.png | Bin docs/{advocates => images}/uchicago.png | Bin docs/index.html | 37 ++++++++--- docs/students/README.md | 12 ++++ docs/students/index.html | 41 +++++++++++++ 21 files changed, 292 insertions(+), 101 deletions(-) create mode 100644 docs/contributors/README.md rename docs/{developers => contributors}/contributor-workflow.html (91%) rename docs/{developers => contributors}/contributor-workflow.md (100%) create mode 100644 docs/contributors/index.html rename docs/{developers => contributors}/manual-setup.html (89%) rename docs/{developers => contributors}/manual-setup.md (100%) rename docs/{advocates/index.html => contributors/support.html} (82%) rename docs/{advocates/README.md => contributors/support.md} (87%) delete mode 100644 docs/developers/README.md delete mode 100644 docs/developers/index.html create mode 100644 docs/educators/README.md create mode 100644 docs/educators/index.html rename docs/{advocates => images}/cosa.png (100%) rename docs/{ => images}/readme-banner.png (100%) rename docs/{advocates => images}/saic.png (100%) rename docs/{advocates => images}/uchicago.png (100%) create mode 100644 docs/students/README.md create mode 100644 docs/students/index.html diff --git a/docs/README.md b/docs/README.md index 290ffe1..8b6bdaa 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,13 +1,45 @@ -# ⚠️ under construction ⚠️ -(we're still in the process of updating all the old docs && migrating them from the [old wiki](https://github.com/netizenorg/netnet.studio/wiki) if you can't find what you're looking for here, it might still be over there.) +### netnet.studio is an open-source hypermedia cyberspace for fully realizing the Web’s creative potential. +Our goal is to help artists, designers and other DIY makers reclaim the Internet as a hand-crafted space for self-expression and connection. Through interactive learning and experimental play with the medium itself, netnet aims to guide you in your journey from absolute beginner to creative code virtuoso! -![banner](readme-banner.png) +- [Dear Students](students/README.md) +- [Dear Educators](educators/README.md) +- [Dear Contributors](contributors/README.md) -## Welcome netizens to the netnet.studio docs! -Here you'll find general info on what netnet is and how it works, as well as guides for how to help support and contribute to the netnet.studio repo! -- [I'm a student and want to learn how to use netnet.studio!]() -- [I'm a teacher and want to learn how to use netnet in my class!]() -- [I'm a developer and want to help contribute to this repo!](developers/README.md) -- [I'm an advocate and want to help support this project!](advocates/README.md) +# Help [Support Us](contributors/support.md)! + + + +# What is netnet.studio? + +### Your Guide + +When you visit netnet.studio you'll be greeted by a friendly artificial intelligence teaching assistant (AI-TA) named netnet! ( ◕ ◞ ◕ ) As an AI-TA, netnet supports students of the Web by explaining code fragments, encouraging best practices, and correcting common mistakes. However, in these AI-times it's worth clarifying that netnet is not a "large language model" or any other kind of "machine learning", *it* (preferred pronoun) is a human-authored *classical AI* system, less like a corporate chat bot and more like the AI in a retro video game. Every word has been carefully considered and written by humans (that's us), therefore netnet will never "hallucinate" nor will it write all your code for you (though it will help with a snippet here or there). + +We're not entirely opposed to LLMs, we believe there's lots of unexplored possibilities in the ethical and artistic application of "artificial neural networks" (we're currently working on creative AI/LLM literacy tools and lessons). However, we do feel that the way they're currently being integrated into coding tools is designed more for "people who think to make" and less for those who "make to think", meaning those of us who discover, learn and grow our creative ideas through the process of making and writing code ourselves. + +If you're an aspiring student of the creative web, [start here](students/README.md)! + +### The Platform + +The [first web browser](https://www.youtube.com/watch?v=3c3Rt6QbHDw) was both a tool for exploring the web and creating it. The first browsers were all research projects created in labs and universities, but enterprising engineers saw it's commercial potential they removed the "editor" part and left only the "browser" part. netnet brings the "editor" back into the "browser", where it was always meant to be. + +Unlike most web-based products of surveillance capitalism (the dominant business model of big tech today) netnet.studio is not here to record and profit off your data. The studio is carefully designed to be a privacy-focused safe space for creative experimentation (You can read our [privacy policy](https://dev.netnet.studio/?w=privacy-policy) at the studio). While netnet is modeled on modern code editors and does integrate with other third party tools like GitHub (for the purpose of teaching others the conventions and tooling of the day) we go to great lengths not make this all secure and extremely transparent while remaining accessible. + +**TODO** *update privacy-policy dev link to main link before pushing to main* + +If you're an educator interested in leveraging the platform in your classroom, [start here](educators/README.md)! + +### Our Mission + +What begun as a research project in computer networking in the late 1960s slowly grew into a globally distributed network of networks called the the *Inter*net. For the first couple of decades, using the Internet meant reading and typing into text-only displays. That is until the early 1990s, when a small group of scientists, taking inspiration from an experimental media art tech scene, added a "hypertext" and "multi-media" interface called the World Wide Web. Like the physical infrastructure it was built on (the Internet) the Web reflected a set of values which enabled it to grow far beyond its inventors wildest dreams! + +Today, the Web's core values of openness, transparency, decentralization, accessibility, extensibility and interoperability have been slowly eroded by the profit-motives of greedy tech corporations which have colonized and privatized what was once an entirely a public commons. This industry and its "[merchants of complexity](https://world.hey.com/dhh/merchants-of-complexity-4851301b)" will have you think that creating web sites and apps requires advanced skills and expensive infrastructure and that the only way to have a presence online is to either become an expert (the industry has always been guarded by a sort of "[priesthood](https://www.newmediareader.com/book_samples/nmr-21-nelson.pdf)") or succumb to "posting" on *their* websites. + +But this re-writing of history could not be farther from [the truth](https://coolguy.website/introduction/). The Web was designed to be [hand-crafted](https://luckysoap.com/statements/handmadeweb.html) by anyone interested enough to take the time to learn a few basics and indeed, [in the early days it was](https://netart.rocks/files/digital-folklore.pdf). While we're inspired by the hand made web of the 1990s, this project is not about nostalgia, netnet.studio encourages others to explore, and is itself created with, modern web technologies. The Web has never had more creative potential and netnet.studio is a platform to help you decide [what the web of tomorrow should be](https://laurelschwulst.com/e/my-website-is-a-shifting-house/). + +If you believe in our mission and what to help contribute time to the project, [start here](contributors/README.md)! diff --git a/docs/build-docs.js b/docs/build-docs.js index c819f5c..7857be9 100644 --- a/docs/build-docs.js +++ b/docs/build-docs.js @@ -117,7 +117,7 @@ const homeTemplate = path.join(baseDir, 'template.html') convertMarkdownToHtml(homeInput, homeOutput, homeTemplate, nav) // Create sub-pages -const folders = ['advocates', 'developers'] +const folders = ['students', 'educators', 'contributors'] folders.forEach(folder => { const folderPath = path.join(baseDir, folder) fs.readdir(folderPath, (err, files) => { diff --git a/docs/contributors/README.md b/docs/contributors/README.md new file mode 100644 index 0000000..b5f2763 --- /dev/null +++ b/docs/contributors/README.md @@ -0,0 +1,52 @@ +# Dear Contributors, + +If you want to donate some time to helping improve netnet.studio, whether that be something small like editing a type-o in these docs or something "low-level" like modifying netnet's core functionality, then these are the docs for you! + +Contributing to open source can feel intimidating, even for experienced developers. netnet.studio’s docs break it down into manageable steps, starting with small changes (like correcting a spelling error in one of netnet's conversation passages) and gradually moving into more complex contributions (like creating your own widget). Each stage guides you through our codebase and the wider open source contribution process on GitHub. + +If this is your first time contributing to an open source project you'll need to start by [creating a GitHub account](https://github.com/signup), if you've already got one make sure you're [logged in](https://github.com/login) before staring section 1 below. If you're a seasoned open source contributor and want to dive right in check out our [contributor workflow doc](contributor-workflow.md). + +### 1. The Docs + +netnet is constantly changing, which means our docs always need lots of editing to keep up! Making an edit to these docs is something you can do entirely on GitHub and is a great way to get familiar with the basics of contributing to an open source project. + +### 2. [Convos and Passages](editing-convo) + +Central to netnet's "hypermedia" navigation system are the conversation passages that appear in netnet's speech bubbles. In these docs we'll explain how this system works as well as how to use netnet's "Convo Widget" to either edit a passage in an existing conversation file or create your own. + +### 3. [Code Demos](code-demos) + +Anyone can create and share "sketches" (single file web sites) in netnet by writing some code in netnet's editor and then saving it (either as a sharable URL or downloadable html file). These sketches can also become "demos", with annotations explaining how different parts of the code works, and added to netnet's "Code Demos" widget. + +### 4. Interactive Tutorials + +One of netnet.studio's most dynamic educational components are the interactive tutorials, like this one made by Nick Briz for example. You can create your own interactive tutorials using our "Tutorial Maker" widget. + +### 5. Widgets + +The vast majority of netnet's features exist in "widgets", these are the moveable windows that pop up to do all the various things artists can do in netnet beyond coding. + +### 6. Core Components + +Underneath all the convos, demos, tutorials and widgets are netnet's "core" components, the foundational code controlling how netnet looks and how it functions. This part of our system doesn't change often, but if you notice any bugs or have ideas for some fundamental improvements, these are the docs for you. These are the most complex contributions, so it would be wise to have gone through some of the steps above before diving into the depths of netnet's codebase. + +# Sub-Modules + +netnet.studio contains a few "sub-modules", these are other repositories which make up part of netnet's code base but can also be used independently on other projects (which is why they're separated into their own repos), below you'll find docs for working on these. + +### the netitor + +The [netitor](https://github.com/netizenorg/netitor) is the core code editor used in netnet.studio. What makes the netitor unique to other code editors is that it's made specifically for beginners learning/experimenting with web code (HTML, SVG, CSS and JavaScript). For this reason (in addition to the usual code editor features like syntax highlighting and code hinting) it has some extra features designed to help beginners like friendly error messages and built-in edu info (you can double click on any piece of code in the editor to learn more about it). As an online + realtime editor it's purpose is not so much to replace professional code editors used to create larger projects, but rather quickly experiment, demonstrate concepts and share ideas. + +1. introduction +2. color schemes +3. friendly error system +4. edu system (code explainers) +5. hinting system (auto-complete snippets) + +### the netnet-standard-library + +The `nn` object spinkled throughout netnet's code base, also known as the [netnet-standard-library](https://github.com/netizenorg/netnet-standard-library), or `nn.min.js` for short, is a browser based JavaScript library designed to aid creative coders (artists, designers, etc). It's a core utility library used within netnet.studio; both in the sense that it can be used to create projects and sketches in netnet, but also that it's used to create netet.studio itself. + +1. introduction +3. adding new methods diff --git a/docs/developers/contributor-workflow.html b/docs/contributors/contributor-workflow.html similarity index 91% rename from docs/developers/contributor-workflow.html rename to docs/contributors/contributor-workflow.html index 1d11edc..68ba75b 100644 --- a/docs/developers/contributor-workflow.html +++ b/docs/contributors/contributor-workflow.html @@ -11,7 +11,7 @@
( ◕ ◞ ◕ ) - +
diff --git a/docs/developers/contributor-workflow.md b/docs/contributors/contributor-workflow.md similarity index 100% rename from docs/developers/contributor-workflow.md rename to docs/contributors/contributor-workflow.md diff --git a/docs/contributors/index.html b/docs/contributors/index.html new file mode 100644 index 0000000..de55ac9 --- /dev/null +++ b/docs/contributors/index.html @@ -0,0 +1,58 @@ + + + + + + docs.netnet.studio + + + + + + + +
+
+

Dear Contributors,

+

If you want to donate some time to helping improve netnet.studio, whether that be something small like editing a type-o in these docs or something "low-level" like modifying netnet's core functionality, then these are the docs for you!

+

Contributing to open source can feel intimidating, even for experienced developers. netnet.studio’s docs break it down into manageable steps, starting with small changes (like correcting a spelling error in one of netnet's conversation passages) and gradually moving into more complex contributions (like creating your own widget). Each stage guides you through our codebase and the wider open source contribution process on GitHub.

+

If this is your first time contributing to an open source project you'll need to start by creating a GitHub account, if you've already got one make sure you're logged in before staring section 1 below. If you're a seasoned open source contributor and want to dive right in check out our contributor workflow doc.

+

1. The Docs

+

netnet is constantly changing, which means our docs always need lots of editing to keep up! Making an edit to these docs is something you can do entirely on GitHub and is a great way to get familiar with the basics of contributing to an open source project.

+

2. Convos and Passages

+

Central to netnet's "hypermedia" navigation system are the conversation passages that appear in netnet's speech bubbles. In these docs we'll explain how this system works as well as how to use netnet's "Convo Widget" to either edit a passage in an existing conversation file or create your own.

+

3. Code Demos

+

Anyone can create and share "sketches" (single file web sites) in netnet by writing some code in netnet's editor and then saving it (either as a sharable URL or downloadable html file). These sketches can also become "demos", with annotations explaining how different parts of the code works, and added to netnet's "Code Demos" widget.

+

4. Interactive Tutorials

+

One of netnet.studio's most dynamic educational components are the interactive tutorials, like this one made by Nick Briz for example. You can create your own interactive tutorials using our "Tutorial Maker" widget.

+

5. Widgets

+

The vast majority of netnet's features exist in "widgets", these are the moveable windows that pop up to do all the various things artists can do in netnet beyond coding.

+

6. Core Components

+

Underneath all the convos, demos, tutorials and widgets are netnet's "core" components, the foundational code controlling how netnet looks and how it functions. This part of our system doesn't change often, but if you notice any bugs or have ideas for some fundamental improvements, these are the docs for you. These are the most complex contributions, so it would be wise to have gone through some of the steps above before diving into the depths of netnet's codebase.

+

Sub-Modules

+

netnet.studio contains a few "sub-modules", these are other repositories which make up part of netnet's code base but can also be used independently on other projects (which is why they're separated into their own repos), below you'll find docs for working on these.

+

the netitor

+

The netitor is the core code editor used in netnet.studio. What makes the netitor unique to other code editors is that it's made specifically for beginners learning/experimenting with web code (HTML, SVG, CSS and JavaScript). For this reason (in addition to the usual code editor features like syntax highlighting and code hinting) it has some extra features designed to help beginners like friendly error messages and built-in edu info (you can double click on any piece of code in the editor to learn more about it). As an online + realtime editor it's purpose is not so much to replace professional code editors used to create larger projects, but rather quickly experiment, demonstrate concepts and share ideas.

+
    +
  1. introduction
  2. +
  3. color schemes
  4. +
  5. friendly error system
  6. +
  7. edu system (code explainers)
  8. +
  9. hinting system (auto-complete snippets)
  10. +
+

the netnet-standard-library

+

The nn object spinkled throughout netnet's code base, also known as the netnet-standard-library, or nn.min.js for short, is a browser based JavaScript library designed to aid creative coders (artists, designers, etc). It's a core utility library used within netnet.studio; both in the sense that it can be used to create projects and sketches in netnet, but also that it's used to create netet.studio itself.

+
    +
  1. introduction
  2. +
  3. adding new methods
  4. +
+ +
+
+ + + + diff --git a/docs/developers/manual-setup.html b/docs/contributors/manual-setup.html similarity index 89% rename from docs/developers/manual-setup.html rename to docs/contributors/manual-setup.html index ec1fd2e..03583ac 100644 --- a/docs/developers/manual-setup.html +++ b/docs/contributors/manual-setup.html @@ -11,7 +11,7 @@
diff --git a/docs/developers/manual-setup.md b/docs/contributors/manual-setup.md similarity index 100% rename from docs/developers/manual-setup.md rename to docs/contributors/manual-setup.md diff --git a/docs/advocates/index.html b/docs/contributors/support.html similarity index 82% rename from docs/advocates/index.html rename to docs/contributors/support.html index 0ac08b1..ed0d632 100644 --- a/docs/advocates/index.html +++ b/docs/contributors/support.html @@ -11,7 +11,7 @@
@@ -21,9 +21,9 @@

Support netnet.studio

- - - + + +
cosasaicuchicagocosasaicuchicago
@@ -43,7 +43,7 @@

How can individuals support?

Testimonials

-

For almost 5 years, netnet.studio has been in beta, meaning we’ve been developing it iteratively alongside creative coding educators and students using it in the classroom. It’s been used by hundreds of students across multiple universities including, The School of the Art Institute of Chicago, the University of Chicago and the University of Waterloo among others. Professors like Greg Smith (University of Waterloo) have noted the difference using netnet in their classroom’s have made.

+

For the past 5 years (2020-2025), netnet.studio has been in beta, meaning we’ve been developing it iteratively alongside creative coding educators and students using it in the classroom. It’s been used by hundreds of students across multiple universities including, The School of the Art Institute of Chicago, the University of Chicago and the University of Waterloo among others. Professors like Greg Smith (University of Waterloo) have noted the difference using netnet in their classroom’s have made.

I'm once again using netnet in my web design class! I've had 120 Uwaterloo students happily working with it this semester and 60 more slated for the winter. It's going really well, and I can't stress enough how netnet makes my life a little easier! 🙂 [...] THANK YOU AGAIN FOR MAKING THIS GREAT TOOL! Please pass my gratitude on to your team.

diff --git a/docs/advocates/README.md b/docs/contributors/support.md similarity index 87% rename from docs/advocates/README.md rename to docs/contributors/support.md index 5cf2877..b7f3baf 100644 --- a/docs/advocates/README.md +++ b/docs/contributors/support.md @@ -2,7 +2,7 @@ netnet.studio is a netizen.org project being designed and developed by Nick Briz and Sarah Rooney with help from a handful of [other contributors](https://github.com/netizenorg/netnet.studio/graphs/contributors). The current version of netnet was made possible thanks to financial support from the Clinic for Open Source Arts, the Contemporary Practices Department at the School of the Art Institute of Chicago and Media Arts and Design at the University of Chicago. -| [![cosa](cosa.png)](http://clinicopensourcearts.com/) | [![saic](saic.png)](https://www.saic.edu/academics/departments/contemporary-practices) | [![uchicago](uchicago.png)](https://cms.uchicago.edu/undergraduate/major-minor/minor-media-arts-and-design) | +| [![cosa](images/cosa.png)](http://clinicopensourcearts.com/) | [![saic](images/saic.png)](https://www.saic.edu/academics/departments/contemporary-practices) | [![uchicago](images/uchicago.png)](https://cms.uchicago.edu/undergraduate/major-minor/minor-media-arts-and-design) | |:---:|:---:|:---:| netnet.studio is constantly evolving and is currently seeking financial support from individuals and institutions who benefit from open access to this platform and who support our mission to reclaim creative agency on the Internet and to nurture and grow the hand-crafted expressive parts of the World Wide Web. @@ -23,10 +23,9 @@ netnet.studio is a non-profit open-source project and needs all the help it can - netizen.org is a 501(c)3 tax deductible organization, so you might consider making a donation! We're working on setting up multiple avenues for financial contributions alongside our official launch this summer 2025, but for now you can make donations to the org using our [donorbox](https://donorbox.org/netizen) account or get in touch if you'd like to help support netnet.studio directly: hi@netizen.org - ### Testimonials -For almost 5 years, netnet.studio has been in beta, meaning we’ve been developing it iteratively alongside creative coding educators and students using it in the classroom. It’s been used by hundreds of students across multiple universities including, The School of the Art Institute of Chicago, the University of Chicago and the University of Waterloo among others. Professors like Greg Smith (University of Waterloo) have noted the difference using netnet in their classroom’s have made. +For the past 5 years (2020-2025), netnet.studio has been in beta, meaning we’ve been developing it iteratively alongside creative coding educators and students using it in the classroom. It’s been used by hundreds of students across multiple universities including, The School of the Art Institute of Chicago, the University of Chicago and the University of Waterloo among others. Professors like Greg Smith (University of Waterloo) have noted the difference using netnet in their classroom’s have made. > I'm once again using netnet in my web design class! I've had 120 Uwaterloo students happily working with it this semester and 60 more slated for the winter. It's going really well, and I can't stress enough how netnet makes my life a little easier! 🙂 [...] THANK YOU AGAIN FOR MAKING THIS GREAT TOOL! Please pass my gratitude on to your team. diff --git a/docs/developers/README.md b/docs/developers/README.md deleted file mode 100644 index 36a1962..0000000 --- a/docs/developers/README.md +++ /dev/null @@ -1,17 +0,0 @@ -We're so glad you want to help improve netnet.studio! If you're a seasoned open source contributor check out our [contributor workflow doc](contributor-workflow.md), if this is your first time contributing to an open source project you'll need to [create a GitHub account](https://github.com/signup), if you've already got one make sure you're [logged in](https://github.com/login). - -Getting started contributing to an open source project can be tricky and intimidating even for experienced coders. The netnet.sudio project is all about teaching creative coders about the craft and open source development is definitely a part of that! For that reason our docs are also meant to serve as a gradual introduction to open source contribution for those new to GitHub. It starts with easier contributions (like editing mistakes you found in netnet's dialogue) and eventually gets into to more complex contributions (like editing netnet's core functionality). Each step not only slowly introduces you to our code base, but also to the process of open source contribution more generally, staring with how to... - -1. ### [edit some of netnet's dialogue](editing-dialogue) -2. ### [edit/create a code example/demo](code-examples) -3. ### edit/create a netnet widget -4. ### create a new interactive tutorial -5. ### working on core functionality -

-**contributing to netnet dependencies/submodules** -1. ### create a new netitor color scheme -2. ### working on the netitor's friendly errors -3. ### working on the netitor's edu info -4. ### working on the netitor's hinter (auto-complete snippets) -5. ### working on the netnet-standard-library (nn.min.js) -

diff --git a/docs/developers/index.html b/docs/developers/index.html deleted file mode 100644 index 4715621..0000000 --- a/docs/developers/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - docs.netnet.studio - - - - - - - -
-
-

We're so glad you want to help improve netnet.studio! If you're a seasoned open source contributor check out our contributor workflow doc, if this is your first time contributing to an open source project you'll need to create a GitHub account, if you've already got one make sure you're logged in.

-

Getting started contributing to an open source project can be tricky and intimidating even for experienced coders. The netnet.sudio project is all about teaching creative coders about the craft and open source development is definitely a part of that! For that reason our docs are also meant to serve as a gradual introduction to open source contribution for those new to GitHub. It starts with easier contributions (like editing mistakes you found in netnet's dialogue) and eventually gets into to more complex contributions (like editing netnet's core functionality). Each step not only slowly introduces you to our code base, but also to the process of open source contribution more generally, staring with how to...

-
    -
  1. edit some of netnet's dialogue

    -
  2. -
  3. edit/create a code example/demo

    -
  4. -
  5. edit/create a netnet widget

    -
  6. -
  7. create a new interactive tutorial

    -
  8. -
  9. working on core functionality

    -
  10. -
-



-contributing to netnet dependencies/submodules

-
    -
  1. create a new netitor color scheme

    -
  2. -
  3. working on the netitor's friendly errors

    -
  4. -
  5. working on the netitor's edu info

    -
  6. -
  7. working on the netitor's hinter (auto-complete snippets)

    -
  8. -
  9. working on the netnet-standard-library (nn.min.js)

    -
  10. -
-



- -
-
- - - - diff --git a/docs/educators/README.md b/docs/educators/README.md new file mode 100644 index 0000000..3643cf1 --- /dev/null +++ b/docs/educators/README.md @@ -0,0 +1,12 @@ +# Dear Educators, + +netnet.studio has been developed iteratively for the last 5 years (in beta from 2020-2025), alongside creative coding educators and students. It has been successfully used by hundreds of students across universities including the School of the Art Institute of Chicago, the University of Chicago, and the University of Waterloo. By removing many of the technical hurdles beginners face, netnet.studio offers a smoother ramp into creative coding, saving instructors hours in the classroom and reducing student frustration. Its self-revealing interface design also enables educators to introduce complex topics, like version control with Git, earlier than traditional tools allow. The platform also provides tooling for instructors to create their own annotated demos, project templates, interactive tutorials and so much more! + +**TODO** +- sketches + - what's unique about the editor (edu info, friendly errors, etc) + - shareable sketches (for quick back/fourth with students) + - Demo Maker (for annotated demos) + - Projects (Git integration && literacy) + - Tutorial Maker (for interactive tutorials) + - how to contribute back (from edu license fees to PRs) diff --git a/docs/educators/index.html b/docs/educators/index.html new file mode 100644 index 0000000..41d28b4 --- /dev/null +++ b/docs/educators/index.html @@ -0,0 +1,39 @@ + + + + + + docs.netnet.studio + + + + + + + +
+
+

Dear Educators,

+

netnet.studio has been developed iteratively for the last 5 years (in beta from 2020-2025), alongside creative coding educators and students. It has been successfully used by hundreds of students across universities including the School of the Art Institute of Chicago, the University of Chicago, and the University of Waterloo. By removing many of the technical hurdles beginners face, netnet.studio offers a smoother ramp into creative coding, saving instructors hours in the classroom and reducing student frustration. Its self-revealing interface design also enables educators to introduce complex topics, like version control with Git, earlier than traditional tools allow. The platform also provides tooling for instructors to create their own annotated demos, project templates, interactive tutorials and so much more!

+

TODO

+
    +
  • sketches
      +
    • what's unique about the editor (edu info, friendly errors, etc)
    • +
    • shareable sketches (for quick back/fourth with students)
    • +
    • Demo Maker (for annotated demos)
    • +
    • Projects (Git integration && literacy)
    • +
    • Tutorial Maker (for interactive tutorials)
    • +
    • how to contribute back (from edu license fees to PRs)
    • +
    +
  • +
+ +
+
+ + + + diff --git a/docs/advocates/cosa.png b/docs/images/cosa.png similarity index 100% rename from docs/advocates/cosa.png rename to docs/images/cosa.png diff --git a/docs/readme-banner.png b/docs/images/readme-banner.png similarity index 100% rename from docs/readme-banner.png rename to docs/images/readme-banner.png diff --git a/docs/advocates/saic.png b/docs/images/saic.png similarity index 100% rename from docs/advocates/saic.png rename to docs/images/saic.png diff --git a/docs/advocates/uchicago.png b/docs/images/uchicago.png similarity index 100% rename from docs/advocates/uchicago.png rename to docs/images/uchicago.png diff --git a/docs/index.html b/docs/index.html index a8facde..eb6f923 100644 --- a/docs/index.html +++ b/docs/index.html @@ -11,22 +11,39 @@
-

⚠️ under construction ⚠️

-

(we're still in the process of updating all the old docs && migrating them from the old wiki if you can't find what you're looking for here, it might still be over there.)

-

banner

-

Welcome netizens to the netnet.studio docs!

-

Here you'll find general info on what netnet is and how it works, as well as guides for how to help support and contribute to the netnet.studio repo!

+

netnet.studio is an open-source hypermedia cyberspace for fully realizing the Web’s creative potential.

+

Our goal is to help artists, designers and other DIY makers reclaim the Internet as a hand-crafted space for self-expression and connection. Through interactive learning and experimental play with the medium itself, netnet aims to guide you in your journey from absolute beginner to creative code virtuoso!

+

Help Support Us!

+ + +

What is netnet.studio?

+

Your Guide

+

When you visit netnet.studio you'll be greeted by a friendly artificial intelligence teaching assistant (AI-TA) named netnet! ( ◕ ◞ ◕ ) As an AI-TA, netnet supports students of the Web by explaining code fragments, encouraging best practices, and correcting common mistakes. However, in these AI-times it's worth clarifying that netnet is not a "large language model" or any other kind of "machine learning", it (preferred pronoun) is a human-authored classical AI system, less like a corporate chat bot and more like the AI in a retro video game. Every word has been carefully considered and written by humans (that' us), therefore netnet will never "hallucinate" nor will it write all your code for you (though it will help with a snippet here or there).

+

We're not entirely opposed to LLMs, we believe there's lots of unexplored possibilities in the ethical and artistic application of "artificial neural networks" (we're currently working on creative AI/LLM literacy tools and lessons). However, we do feel that the way they're currently being integrated into coding tools is designed more for "people who think to make" and less for those who "make to think", meaning those of us who discover, learn and grow our creative ideas through the process of making and writing code ourselves.

+

If you're an aspiring student of the creative web, start here!

+

The Platform

+

The first web browser was both a tool for exploring the web and creating it. The first browsers were all research projects created in labs and universities, but enterprising engineers saw it's commercial potential they removed the "editor" part and left only the "browser" part. netnet brings the "editor" back into the "browser", where it was always meant to be.

+

Unlike most web-based products of surveillance capitalism (the dominant business model of big tech today) netnet.studio is not here to record and profit off your data. The studio is carefully designed to be a privacy-focused safe space for creative experimentation (You can read our privacy policy at the studio). While netnet is modeled on modern code editors and does integrate with other third party tools like GitHub (for the purpose of teaching others the conventions and tooling of the day) we go to great lengths not make this all secure and extremely transparent while remaining accessible.

+

TODO update privacy-policy dev link to main link before pushing to main

+

If you're an educator interested in leveraging the platform in your classroom, start here!

+

Our Mission

+

What begun as a research project in computer networking in the late 1960s slowly grew into a globally distributed network of networks called the the Internet. For the first couple of decades, using the Internet meant reading and typing into text-only displays. That is until the early 1990s, when a small group of scientists, taking inspiration from an experimental media art tech scene, added a "hypertext" and "multi-media" interface called the World Wide Web. Like the physical infrastructure it was built on (the Internet) the Web reflected a set of values which enabled it to grow far beyond its inventors wildest dreams!

+

Today, the Web's core values of openness, transparency, decentralization, accessibility, extensibility and interoperability have been slowly eroded by the profit-motives of greedy tech corporations which have colonized and privatized what was once an entirely a public commons. This industry and its "merchants of complexity" will have you think that creating web sites and apps requires advanced skills and expensive infrastructure and that the only way to have a presence online is to either become an expert (the industry has always been guarded by a sort of "priesthood") or succumb to "posting" on their websites.

+

But this re-writing of history could not be farther from the truth. The Web was designed to be hand-crafted by anyone interested enough to take the time to learn a few basics and indeed, in the early days it was. While we're inspired by the hand made web of the 1990s, this project is not about nostalgia, netnet.studio encourages others to explore, and is itself created with, modern web technologies. The Web has never had more creative potential and netnet.studio is a platform to help you decide what the web of tomorrow should be.

+

If you believe in our mission and what to help contribute time to the project, start here!

diff --git a/docs/students/README.md b/docs/students/README.md new file mode 100644 index 0000000..6aaac3d --- /dev/null +++ b/docs/students/README.md @@ -0,0 +1,12 @@ +# Dear Students, + + +**TODO** +introductory text, should cover the main menu features: +- "Hi" (and how netnet convos work) +- Search Bar +- Learning Guide + - should cover diff modes of learning (remixing/experimenting with demos, following tutorials, exploring guides, etc) +- Coding Menu + - how to create + save a sketch + - how to create + publish a project diff --git a/docs/students/index.html b/docs/students/index.html new file mode 100644 index 0000000..9c06661 --- /dev/null +++ b/docs/students/index.html @@ -0,0 +1,41 @@ + + + + + + docs.netnet.studio + + + + + + + +
+
+

Dear Students,

+

TODO +introductory text, should cover the main menu features:

+
    +
  • "Hi" (and how netnet convos work)
  • +
  • Search Bar
  • +
  • Learning Guide
      +
    • should cover diff modes of learning (remixing/experimenting with demos, following tutorials, exploring guides, etc)
    • +
    +
  • +
  • Coding Menu
      +
    • how to create + save a sketch
    • +
    • how to create + publish a project
    • +
    +
  • +
+ +
+
+ + + + From c49cfc9ec7eaacacffad6e461611e1df8ec60b88 Mon Sep 17 00:00:00 2001 From: nbriz Date: Tue, 5 Aug 2025 15:49:28 -0500 Subject: [PATCH 2/6] fixed link bugs, changed nav order/naming logic, formatting code blocks --- docs/build-docs.js | 112 +++++++++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 40 deletions(-) diff --git a/docs/build-docs.js b/docs/build-docs.js index 7857be9..95d32e4 100644 --- a/docs/build-docs.js +++ b/docs/build-docs.js @@ -2,69 +2,101 @@ const fs = require('fs') const path = require('path') const { marked } = require('marked') +const fldrDict = { + students: 'Dear Students', + educators: 'Dear Educators', + contributors: 'Dear Contributors' +} +const skipFldrs = ['images'] + // update some of the "marked" library's rendering behavior // ........................................................ const renderer = new marked.Renderer() renderer.link = function (obj) { let { href, text } = obj - + // format links if (typeof href !== 'string') href = '#' - - // Replace .md with .html for local links - if (href.endsWith('.md')) { - href = href.replace(/\.md$/, '.html') - } - - // Add target="_blank" for external links + if (href.endsWith('.md')) href = href.replace(/\.md$/, '.html') + if (href.includes('README')) href = href.replace('README', 'index') + // add target="_blank" for external links const isExternal = href.startsWith('http') || href.startsWith('//') const targetAttr = isExternal ? ' target="_blank"' : '' - - // Check if the text contains an image using basic Markdown syntax for images + // check for linked images const imageRegex = /!\[([^\]]*)\]\(([^)]+)\)/ const match = text.match(imageRegex) - if (match) { - // Extract the alt text and image source const alt = match[1] const src = match[2] - - // Construct the tag with the nested tag return `${alt}` } - // Return a standard tag for regular links return `${text}` } +renderer.code = function (token) { + // add custom class to js, html && css blocks so that we can nn.getAll + // in scripts.js && style correctly when converted into a Netitor instance + const lang = token.lang || '' + const cls = lang === 'js' ? 'javascript' : lang + const classAttr = cls ? ` class="${cls}"` : '' + const content = this.options.highlight + ? this.options.highlight(token.text, lang) + : token.text + .replace(/&/g, '&') + .replace(//g, '>') + return `
${content}
\n` +} marked.setOptions({ renderer }) // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// ~~~~~~~~~~~ MD to HTML function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ~~~~~~~~~~~ create side-panel navigation
    ~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function generateNav (directory, basePath = '') { - const items = fs.readdirSync(directory, { withFileTypes: true }) + const folders = Object.keys(fldrDict) + let items = fs.readdirSync(directory, { withFileTypes: true }) + // sort by order in folder array (rather than alphabetically) + items = items.sort((a, b) => { + if (a.isDirectory() && b.isDirectory()) { + const ai = folders.indexOf(a.name) + const bi = folders.indexOf(b.name) + if (ai !== -1 || bi !== -1) { + if (ai === -1) return 1 + if (bi === -1) return -1 + return ai - bi + } + return a.name.localeCompare(b.name) + } + return 0 + }) + // create nav's
      element let nav = '
        ' - if (/\/docs\/?$/.test(directory) && /\/docs\/?$/.test(directory)) { - nav += '
      • introduction
      • ' + if (/\/docs\/?$/.test(directory)) { + nav += '
      • README
      • ' } items.forEach(item => { const itemPath = path.join(directory, item.name) - const relativePath = path.join(basePath, item.name) - if (item.isDirectory()) { - // Check if the directory contains a README.md - const readmePath = path.join(itemPath, 'README.md') - const hasReadme = fs.existsSync(readmePath) - const link = hasReadme ? path.join(relativePath, 'index.html').replace(/\\/g, '/') : '#' - const text = item.name - nav += `
      • ${text}${generateNav(itemPath, relativePath)}
      • ` - } else if (path.extname(item.name) === '.md') { - if (path.basename(item.name).toLowerCase() !== 'readme.md') { - const outputFileName = `${path.basename(item.name, '.md')}.html` - const link = path.join(basePath, outputFileName).replace(/\\/g, '/') - const text = path.basename(item.name, '.md').replace(/-/g, ' ') - nav += `
      • ${text}
      • ` + const relative = path.join(basePath, item.name) + if (item.isDirectory() && !skipFldrs.includes(item.name)) { // Folder Links + const readme = path.join(itemPath, 'README.md') + const hasReadme = fs.existsSync(readme) + const link = hasReadme + ? path.join(relative, 'index.html').replace(/\\/g, '/') + : '#' + nav += `
      • + ${fldrDict[item.name]} + ${generateNav(itemPath, relative)} +
      • ` + } else if (path.extname(item.name) === '.md') { // Markdown File Links + if (item.name.toLowerCase() !== 'readme.md') { + const name = path.basename(item.name, '.md') + const link = path.join(basePath, `${name}.html`).replace(/\\/g, '/') + nav += `
      • + + ${name.replace(/-/g, ' ')} +
      • ` } } }) @@ -72,6 +104,9 @@ function generateNav (directory, basePath = '') { return nav } +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ~~~~~~~~~~~ MD to HTML function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function convertMarkdownToHtml (inputFile, outputFile, templatePath, nav) { fs.readFile(inputFile, 'utf8', (err, markdown) => { if (err) { @@ -117,18 +152,15 @@ const homeTemplate = path.join(baseDir, 'template.html') convertMarkdownToHtml(homeInput, homeOutput, homeTemplate, nav) // Create sub-pages -const folders = ['students', 'educators', 'contributors'] -folders.forEach(folder => { +Object.keys(fldrDict).forEach(folder => { const folderPath = path.join(baseDir, folder) fs.readdir(folderPath, (err, files) => { - if (err) { - console.error(` ✖ ᴖ ✖ ) Error reading folder ${folder}:`, err) - return - } + if (err) return console.error(` ✖ ᴖ ✖ ) Error reading folder ${folder}:`, err) files.forEach(file => { const filePath = path.join(folderPath, file) if (path.extname(file) === '.md') { - const outputFileName = path.basename(file).toLowerCase() === 'readme.md' ? 'index.html' : `${path.basename(file, '.md')}.html` + const outputFileName = path.basename(file).toLowerCase() === 'readme.md' + ? 'index.html' : `${path.basename(file, '.md')}.html` const outputFilePath = path.join(folderPath, outputFileName) const templatePath = path.join(baseDir, 'template.html') convertMarkdownToHtml(filePath, outputFilePath, templatePath, nav) From 4fa3150e2a62ca9bb259cddefe42d3efdab8b715 Mon Sep 17 00:00:00 2001 From: nbriz Date: Tue, 5 Aug 2025 15:50:15 -0500 Subject: [PATCH 3/6] added styles for donate links, added styles/logic for code blocks --- docs/scripts.js | 61 ++++++++++++++++++++++++++++++++++---------- docs/styles.css | 63 ++++++++++++++++++++++++++++++++++++++++++++++ docs/template.html | 2 ++ 3 files changed, 113 insertions(+), 13 deletions(-) diff --git a/docs/scripts.js b/docs/scripts.js index aed2502..84f3d8b 100644 --- a/docs/scripts.js +++ b/docs/scripts.js @@ -1,16 +1,51 @@ -const findActive = () => { - let currentPage = location.pathname; - console.log(currentPage); +/* global nn, Netitor */ - let navLinks = document.querySelectorAll('.docs__panel__list-item > a') - navLinks.forEach((link) => { - console.log(link.pathname == currentPage); - if (link.pathname == currentPage) { - link.classList.add('active'); - } - }) +const netitors = [] // netitor instances + +const copySvg = ` + +` + +function findActive () { + const currentPage = window.location.pathname + nn.getAll('.docs__panel__list-item > a') + .forEach(link => { + if (link.pathname === currentPage) link.classList.add('active') + }) +} + +function setupNetitors () { + nn.getAll('pre > code') + .forEach((ele, i) => { + // create code editor block + const lang = ele.className || 'markdown' + const code = ele.textContent + ele.classList.add(`code-${i}`) + ele.innerHTML = '' + const ne = new Netitor({ + ele: `.code-${i}`, + code: code, + language: lang, + hint: false, + lint: false, + autoUpdate: false, + readOnly: true, + wrap: true + }) + if (lang === 'markdown') ne.cm.setOption('lineNumbers', false) + netitors.push(ne) + + // create copy symbol element + const cp = nn.create('div') + .set('class', 'copy-code') + .content(copySvg) + .on('click', () => navigator.clipboard.writeText(ne.code)) + const pn = ele.parentNode + pn.insertBefore(cp, ele) + }) } -window.addEventListener('load', () => { - findActive(); -}); +nn.on('load', () => { + findActive() + setupNetitors() +}) diff --git a/docs/styles.css b/docs/styles.css index 0ac2409..2ce2049 100644 --- a/docs/styles.css +++ b/docs/styles.css @@ -284,3 +284,66 @@ div > a:not(.pill-btn):not(.highlight):hover, .docs__viewer-inner ul li a:hover { color: var(--netizen-comment); } + +/* + @Sarah, feel free to edit these or move them around + (only put it down here to avoid merge conflicts) +*/ + +.center { + text-align: center; +} + +.italic { + font-style: italic; +} + +.docs__viewer-inner pre { + position: relative; +} + +.docs__viewer-inner pre .copy-code { + position: absolute; + right: -22px; +} + +.docs__viewer-inner pre .copy-code svg { + cursor: pointer; + opacity: 0.5; +} + +.docs__viewer-inner pre .copy-code svg:hover { + opacity: 1; +} + +/* + We can totally style these buttons differently, + i just really want them to POP! on the homepage + important for these to stand out! +*/ +#donate-links { + display: flex; + justify-content: center; + align-items: center; + margin-top: 40px; +} + +#donate-links a { + margin: 10px; + border: 3px solid var(--bg-color); + border-radius: 68px; + padding: 20px 40px; + background: rgba(255,255,255,0.3); + + text-decoration: none; + font-size: 24px; + font-weight: bold; + color: var(--bg-color); + cursor: pointer; +} + +#donate-links a:hover { + background: var(--fg-color); + color: #fff; + border-color: #fff; +} diff --git a/docs/template.html b/docs/template.html index a86cbf3..357de11 100644 --- a/docs/template.html +++ b/docs/template.html @@ -20,6 +20,8 @@
+ + From 86a172eeccfb4a676a1a5f00cd4f31ac9f3c432e Mon Sep 17 00:00:00 2001 From: nbriz Date: Tue, 5 Aug 2025 15:50:24 -0500 Subject: [PATCH 4/6] updated content --- docs/README.md | 37 +++++------ docs/contributors/README.md | 11 ++-- docs/contributors/contributor-workflow.html | 61 ++++++++++------- docs/contributors/editing-convos.html | 69 ++++++++++++++++++++ docs/contributors/editing-convos.md | 33 ++++++++++ docs/contributors/index.html | 38 +++++++++-- docs/contributors/manual-setup.html | 60 ++++++++++------- docs/contributors/support.html | 64 +++++++++++------- docs/contributors/support.md | 29 ++++---- docs/educators/index.html | 25 ++++++- docs/images/convo-ex1.png | Bin 0 -> 44235 bytes docs/index.html | 63 ++++++++++++------ docs/students/index.html | 25 ++++++- 13 files changed, 370 insertions(+), 145 deletions(-) create mode 100644 docs/contributors/editing-convos.html create mode 100644 docs/contributors/editing-convos.md create mode 100644 docs/images/convo-ex1.png diff --git a/docs/README.md b/docs/README.md index 8b6bdaa..4f7ee1e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,45 +1,42 @@ ### netnet.studio is an open-source hypermedia cyberspace for fully realizing the Web’s creative potential. -Our goal is to help artists, designers and other DIY makers reclaim the Internet as a hand-crafted space for self-expression and connection. Through interactive learning and experimental play with the medium itself, netnet aims to guide you in your journey from absolute beginner to creative code virtuoso! +netnet's goal is to guide creatives in their journey, from curious beginners to creative code virtuosos, through interactive learning and experimental play with the medium itself. Our mission is to help artists, designers and other DIY makers reclaim the Internet as a hand-crafted space for self-expression. -- [Dear Students](students/README.md) -- [Dear Educators](educators/README.md) -- [Dear Contributors](contributors/README.md) - - -# Help [Support Us](contributors/support.md)! - - + + diff --git a/docs/contributors/editing-convos.html b/docs/contributors/editing-convos.html new file mode 100644 index 0000000..d0a9223 --- /dev/null +++ b/docs/contributors/editing-convos.html @@ -0,0 +1,69 @@ + + + + + + docs.netnet.studio + + + + + + + +
+
+

Convos and Passages

+

In these docs we'll explain how to edit "passages" (netnet's speech bubbles) as well as how to create new "convos" (a collection of passages associated with a specific widget). These docs assume you've already done the following steps covered in the prior section of The Docs:

+
    +
  1. You have created a GitHub account and you're currently logged in to your account.
  2. +
  3. You've created a "fork" of the netnet.studio repo
  4. +
+

If you're an experienced open source developer and have already setup a local development environment, you can alternatively create and/or edit these files in your code editor, refer instead to the Convo System docs.

+

Finding a passage in the code

+

Maybe you noticed a type-o in one of netnet's passage, or maybe you just think there's something that could be worded in a clearer way. In any case, the first step is finding that passage in the code base. All of netnet's passage's are part of of a convo.js file associated with one of netnet's widgets, which can all be found in the `www/widgets` folder. With a couple of exceptions:

+
    +
  • any passage where netent explains a piece of code that you double-clicked on, these are part of the netitor sub-module.
  • +
  • any passage where netnet explains an issue or error that appear when you click on an error marker in the line-number gutters, these are also part of the netitor sub-module
  • +
+

It might be immediately obvious which widget the passage you want to edit is a part of, but if not you can always use GitHub's repo search bar to find the file that contains the line of dialogue you're trying to edit. We recommend placing your search withing quote marks " " to limit the search results to match the exact phrase. However, If you type the entire quoted passage into the GitHub search bar you might not be able to find it, this is because the way the passage appears in the code may not exactly match what you see in netnet, consider this example:

+

example netnet passage with markup in it

+

This passage contains a couple of pink code blocks, this is because the passage contains markup, in this case <code> tags around the words "run" and "git status". Additionally, because most of the passage's text are stored as JavaScript strings in the code, often when a word has an apostraphe like the first word in this passage, "Let's" it needs to be escaped in the code, which means it acctually looks like this: Let\'s. Here is how that passage actually appears in netnet's code:

+
content: 'Let\'s version our changes by creating a new "commit"! Click the <code>run</code> button in the Terminal of the Version Control widget to run <code>git status</code>. This will list all the files which have changed since your last commit.',
+

For this reason it's best to search for small snippets of text from a passage and avoid including any of the markuped text (like code blocks and links) as well as any text with apostraphes in it.

+

⚠️ NOTE: if you have trouble searching your fork of the repo, because GitHub hasn't yet indexed your code for example, you can always search our main repo instead. Your fork should be more or less an exact copy of ours (until you start to make changes) so the convo file should be in the same place.

+

Editing a passage

+

...

+ +
+
+ + + + + + diff --git a/docs/contributors/editing-convos.md b/docs/contributors/editing-convos.md new file mode 100644 index 0000000..e058eea --- /dev/null +++ b/docs/contributors/editing-convos.md @@ -0,0 +1,33 @@ +# Convos and Passages + +In these docs we'll explain how to edit "passages" (netnet's speech bubbles) as well as how to create new "convos" (a collection of passages associated with a specific widget). These docs assume you've already done the following steps covered in the prior section of [The Docs](the-docs.md): + +1. You have [created a GitHub account](https://github.com/signup) and you're currently [logged in](https://github.com/login) to your account. +2. You've created a "[fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo)" of the [netnet.studio repo](https://github.com/netizenorg/netnet.studio) + +If you're an experienced open source developer and have already [setup a local development environment](contributor-workflow.md), you can alternatively create and/or edit these files in your code editor, refer instead to the [Convo System](convo-system.md) docs. + +## Finding a passage in the code + +Maybe you noticed a type-o in one of netnet's passage, or maybe you just think there's something that could be worded in a clearer way. In any case, the first step is finding that passage in the code base. All of netnet's passage's are part of of a `convo.js` file associated with one of netnet's widgets, which can all be found in the [`www/widgets`](https://github.com/netizenorg/netnet.studio/tree/main/www/widgets) folder. With a couple of exceptions: + +- any passage where netent explains a piece of code that you double-clicked on, these are part of the netitor sub-module. +- any passage where netnet explains an issue or error that appear when you click on an error marker in the line-number gutters, these are also part of the netitor sub-module + +It might be immediately obvious which widget the passage you want to edit is a part of, but if not you can always **use GitHub's repo search bar** to find the file that contains the line of dialogue you're trying to edit. We recommend placing your search withing quote marks `" "` to limit the search results to match the exact phrase. However, If you type the entire quoted passage into the GitHub search bar you might not be able to find it, this is because the way the passage appears in the code may not exactly match what you see in netnet, consider this example: + +![example netnet passage with markup in it](../images/convo-ex1.png) + +This passage contains a couple of pink code blocks, this is because the passage contains markup, in this case `` tags around the words "run" and "git status". Additionally, because most of the passage's text are stored as JavaScript strings in the code, often when a word has an apostraphe like the first word in this passage, "Let's" it needs to be *escaped* in the code, which means it acctually looks like this: `Let\'s`. Here is how that passage actually appears in netnet's code: + +```js +content: 'Let\'s version our changes by creating a new "commit"! Click the run button in the Terminal of the Version Control widget to run git status. This will list all the files which have changed since your last commit.', +``` + +For this reason it's best to search for small snippets of text from a passage and avoid including any of the markuped text (like code blocks and links) as well as any text with apostraphes in it. + +⚠️ **NOTE**: if you have trouble searching your fork of the repo, because GitHub hasn't yet indexed your code for example, you can always [search our main repo](https://github.com/search?q=repo%3Anetizenorg%2Fnetnet.studio&type=code) instead. Your fork should be more or less an exact copy of ours (until you start to make changes) so the convo file should be in the same place. + +## Editing a passage + +... diff --git a/docs/contributors/index.html b/docs/contributors/index.html index de55ac9..cf2d118 100644 --- a/docs/contributors/index.html +++ b/docs/contributors/index.html @@ -11,20 +11,44 @@

Dear Contributors,

-

If you want to donate some time to helping improve netnet.studio, whether that be something small like editing a type-o in these docs or something "low-level" like modifying netnet's core functionality, then these are the docs for you!

-

Contributing to open source can feel intimidating, even for experienced developers. netnet.studio’s docs break it down into manageable steps, starting with small changes (like correcting a spelling error in one of netnet's conversation passages) and gradually moving into more complex contributions (like creating your own widget). Each stage guides you through our codebase and the wider open source contribution process on GitHub.

-

If this is your first time contributing to an open source project you'll need to start by creating a GitHub account, if you've already got one make sure you're logged in before staring section 1 below. If you're a seasoned open source contributor and want to dive right in check out our contributor workflow doc.

+

If you want to donate some time to helping improve netnet.studio, whether that be something large or small, then these are the docs for you!

+

Contributing to open source can feel intimidating, even for experienced developers. netnet.studio’s docs break it down into manageable steps, starting with small changes (like correcting a type-o) and gradually moving into more complex contributions (like creating your own widget). Each stage guides you through our codebase and the wider open source contribution process on GitHub.

+
    +
  • If this is your first time contributing to an open source project you'll need to start by creating a GitHub account, if you've already got one make sure you're logged in before staring section 1 below.
  • +
  • If you're a seasoned open source contributor and want to dive right in check out our contributor workflow doc and then review our core functionality docs for a general orientation of the project architecture.
  • +

1. The Docs

netnet is constantly changing, which means our docs always need lots of editing to keep up! Making an edit to these docs is something you can do entirely on GitHub and is a great way to get familiar with the basics of contributing to an open source project.

-

2. Convos and Passages

+

2. Convos and Passages

Central to netnet's "hypermedia" navigation system are the conversation passages that appear in netnet's speech bubbles. In these docs we'll explain how this system works as well as how to use netnet's "Convo Widget" to either edit a passage in an existing conversation file or create your own.

-

3. Code Demos

+

3. Code Demos

Anyone can create and share "sketches" (single file web sites) in netnet by writing some code in netnet's editor and then saving it (either as a sharable URL or downloadable html file). These sketches can also become "demos", with annotations explaining how different parts of the code works, and added to netnet's "Code Demos" widget.

4. Interactive Tutorials

One of netnet.studio's most dynamic educational components are the interactive tutorials, like this one made by Nick Briz for example. You can create your own interactive tutorials using our "Tutorial Maker" widget.

@@ -53,6 +77,8 @@

the netnet-standard-library

+ + diff --git a/docs/contributors/manual-setup.html b/docs/contributors/manual-setup.html index 03583ac..8bc95b5 100644 --- a/docs/contributors/manual-setup.html +++ b/docs/contributors/manual-setup.html @@ -11,7 +11,28 @@
@@ -20,60 +41,53 @@

Setup a Local Development Environment MANUALLY

For those looking for a much easier way to set things up locally, see our Contributor Workflow doc. This page documents how to setup a local development environment manually for those interested in doing things the hard way or for those interested in learning about what exactly our setup script npm run setup is doing behind the scenes (the setup-script.js).

1. fork our repo

First, fork the netnet.studio repo and then clone it to your local computer (replacing "YOUR_USER_NAME" in the git URL below with your own)

-
git clone https://github.com/YOUR_USER_NAME/netnet.studio.git
-
+
git clone https://github.com/YOUR_USER_NAME/netnet.studio.git

2. add remote "upstream"

Then you'll need to cd (change directory) and then add a remote "upstream" to our repository so you can pull changes from our repo when need be.

cd netnet.studio
-git remote add upstream https://github.com/netizenorg/netnet.studio.git
-
+git remote add upstream https://github.com/netizenorg/netnet.studio.git

You can confirm this worked by running git remote -v, you should see both your "origin" and the new "upstream". Another way to confirm this is to open up your git config locally in your preferred editor, for example nano .git/config, you should see something like this:

-
[remote "origin"]
+
[remote "origin"]
 	url = https://github.com/YOUR_USER_NAME/netnet.studio.git
 	fetch = +refs/heads/*:refs/remotes/origin/*
-[branch "main"]
+[branch "main"]
 	remote = origin
 	merge = refs/heads/main
-[remote "upstream"]
+[remote "upstream"]
 	url = https://github.com/netizenorg/netnet.studio.git
-	fetch = +refs/heads/*:refs/remotes/upstream/*
-
+ fetch = +refs/heads/*:refs/remotes/upstream/*

NOTE: unless you've already authorized your preferred editor to push code to your GitHub account, you'll need to generate a personal access token and add that to your git config by either removing your "origin" and re-adding it with the token embedded in the URL, or simply manually edit this file so that the [remote "origin"] url includes it like so:

-
[remote "origin"]
+
[remote "origin"]
 	url = https://YOUR_ACCESS_TOKEN@github.com/YOUR_USER_NAME/netnet.studio.git
-	fetch = +refs/heads/*:refs/remotes/origin/*
-
+ fetch = +refs/heads/*:refs/remotes/origin/*

This is something the startup script (optionally) handles for you as well. note the @ symbol between your token and github.com/

3. create the .env file

In the project's root directory, use your preferred editor to create a .env and set your preferred development port:

-
PORT = 8001
-
+
PORT = 8001

netnet allows its netizens to open any of their GitHub repos (assuming they're web projects) in the studio as well as save (commit, push, etc) changes they make in the studio back to their GitHub accounts. If you want to test this functionality locally and/or work on any aspects of the code base that deals with it, you'll have to create your own GitHub OAuth credentials. for Homepage URL enter http://localhost:8001 (ensuring that :8001 matches the port number defined in the previous step) and for Authorization callback URL enter http://localhost:8001/user/signin/callback. Then copy and paste your Client ID and Client Secret into the .env:

PORT = 8001
 GITHUB_CLIENT_ID = YOUR_CLIENT_ID_HERE
 GITHUB_CLIENT_SECRET = YOUR_CLIENT_SECRET_
-TOKEN_PASSWORD = MAKE_UP_SOME_RANDOM_PASSWORD_HERE
-
+TOKEN_PASSWORD = MAKE_UP_SOME_RANDOM_PASSWORD_HERE

NOTE: the TOKEN_PASSWORD should be a long, randomly generated string. Although we store the user's session GitHub auth token in a secure, same-site restricted, http-only cookie, we also use three extra layers on encryption to protect this locally stored cookie because we believe you can never be too carefully when it comes to our user's privacy and security. This random password is used in this extra encryption process.

4. install (and update) the dependencies

Lastly, you'll need to install all the server-side (and a few client-side) dependencies (listed in the package.json), as you would with most nodejs projects, by running:

-
npm install
-
+
npm install

Updating Submodules

In addition to the server-side (back-end) dependencies, this repo also contains git submodules for a couple of the client-side (front-end) dependencies, maintained by us (@netizenorg). Specifically, those are the netnet-standard-library (itself a collection of other sub-modules) as well as the netitor, netnet's core code editor.

To pull and update the submodules run:

-
npm run pull-modules
-
+
npm run pull-modules

NOTE: we've noticed issues running these scripts, where sometimes they don't actually pull updates (plz open an issue if you think you might know why), but alternatively you can also cd into the individual submodule folders found in www/core and pull the code using git pull

5. running the local server

Once everything is setup you can run the server:

-
node server
-
+
node server

Then visit http://localhost:8001 (ensuring that :8001 matches the port number defined in your .env file) in the browser.

+ + diff --git a/docs/contributors/support.html b/docs/contributors/support.html index ed0d632..7a97a1c 100644 --- a/docs/contributors/support.html +++ b/docs/contributors/support.html @@ -11,37 +11,38 @@
( ◕ ◞ ◕ ) - +

Support netnet.studio

-

netnet.studio is a netizen.org project being designed and developed by Nick Briz and Sarah Rooney with help from a handful of other contributors. The current <BETA-3.0> version of netnet was made possible thanks to financial support from the Clinic for Open Source Arts, the Contemporary Practices Department at the School of the Art Institute of Chicago and Media Arts and Design at the University of Chicago.

- - - - - - - - -
cosasaicuchicago
-

netnet.studio is constantly evolving and is currently seeking financial support from individuals and institutions who benefit from open access to this platform and who support our mission to reclaim creative agency on the Internet and to nurture and grow the hand-crafted expressive parts of the World Wide Web.

-

How can institutions support?

-

netnet.studio has been implemented into University curriculum around the world during our beta development phase (see testimonials below). We are aiming to launch for the public summer 2025. As part of this launch, we will begin offering support and integration services for universities and other educational institutions looking to use netnet.studio in their curriculum. Our institutional license fee of $2,500 a year includes a yearly pedagogy workshop and curricular plan customized for your institution's educational needs. Email hi@netizen.org for more info.

+

netnet.studio is a netizen.org project being designed and developed by Nick Briz and Sarah Rooney with help from a handful of other contributors. netnet.studio is constantly evolving and is currently seeking financial support from individuals and institutions who benefit from open access to this platform and who support our mission to reclaim creative agency on the Internet and to nurture and grow the hand-crafted expressive parts of the World Wide Web.

How can individuals support?

-

netnet.studio is a non-profit open-source project and needs all the help it can get! There are different ways you can help support it's development as an individual:

-
    -
  • if you notice any bugs or have any feedback feel free to open a new issue on this repo or send us an email: hi@netizen.org

    -
  • -
  • if you'd like to contribute edits to the project yourself check out our contributors guide

    -
  • -
  • if you're an educator teaching web art/design coding courses for creatively inclined individuals and want to help us improve netnet by providing feedback/thoughts/examples or please reach out so we can chat about what that can look like: hi@netizen.org

    -
  • -
  • netizen.org is a 501(c)3 tax deductible organization, so you might consider making a donation! We're working on setting up multiple avenues for financial contributions alongside our official launch this summer 2025, but for now you can make donations to the org using our donorbox account or get in touch if you'd like to help support netnet.studio directly: hi@netizen.org

    -
  • -
+

TODO: needs updating!!!

+

How can institutions support?

+

TODO: needs updating!!!

Testimonials

For the past 5 years (2020-2025), netnet.studio has been in beta, meaning we’ve been developing it iteratively alongside creative coding educators and students using it in the classroom. It’s been used by hundreds of students across multiple universities including, The School of the Art Institute of Chicago, the University of Chicago and the University of Waterloo among others. Professors like Greg Smith (University of Waterloo) have noted the difference using netnet in their classroom’s have made.

@@ -75,10 +76,23 @@

Testimonials

My favorite aspect of this course (and the one that contributed the most to my learning) was NetNet! I loved the lectures, tutorials, etc. There's limitless information to be found/explored on that website. HTML and CSS were explained in a way that was thorough and easily accessible.

+

Initial Supporters

+

The inital BETA versions of netnet were made possible thanks to financial support from the Clinic for Open Source Arts, the Contemporary Practices Department at the School of the Art Institute of Chicago and Media Arts and Design at the University of Chicago.

+ + + + + + + + +
cosasaicuchicago
+ + diff --git a/docs/contributors/support.md b/docs/contributors/support.md index b7f3baf..4395ed5 100644 --- a/docs/contributors/support.md +++ b/docs/contributors/support.md @@ -1,27 +1,13 @@ # Support netnet.studio -netnet.studio is a netizen.org project being designed and developed by Nick Briz and Sarah Rooney with help from a handful of [other contributors](https://github.com/netizenorg/netnet.studio/graphs/contributors). The current version of netnet was made possible thanks to financial support from the Clinic for Open Source Arts, the Contemporary Practices Department at the School of the Art Institute of Chicago and Media Arts and Design at the University of Chicago. - -| [![cosa](images/cosa.png)](http://clinicopensourcearts.com/) | [![saic](images/saic.png)](https://www.saic.edu/academics/departments/contemporary-practices) | [![uchicago](images/uchicago.png)](https://cms.uchicago.edu/undergraduate/major-minor/minor-media-arts-and-design) | -|:---:|:---:|:---:| - -netnet.studio is constantly evolving and is currently seeking financial support from individuals and institutions who benefit from open access to this platform and who support our mission to reclaim creative agency on the Internet and to nurture and grow the hand-crafted expressive parts of the World Wide Web. - -### How can institutions support? - -netnet.studio has been implemented into University curriculum around the world during our beta development phase (see testimonials below). We are aiming to launch for the public summer 2025. As part of this launch, we will begin offering support and integration services for universities and other educational institutions looking to use netnet.studio in their curriculum. Our institutional license fee of $2,500 a year includes a yearly pedagogy workshop and curricular plan customized for your institution's educational needs. Email hi@netizen.org for more info. +netnet.studio is a netizen.org project being designed and developed by Nick Briz and Sarah Rooney with help from a handful of [other contributors](https://github.com/netizenorg/netnet.studio/graphs/contributors). netnet.studio is constantly evolving and is currently seeking financial support from individuals and institutions who benefit from open access to this platform and who support our mission to reclaim creative agency on the Internet and to nurture and grow the hand-crafted expressive parts of the World Wide Web. ### How can individuals support? +**TODO**: *needs updating!!!* -netnet.studio is a non-profit open-source project and needs all the help it can get! There are different ways you can help support it's development as an individual: - -- if you notice any bugs or have any feedback feel free to open a new [issue](https://github.com/netizenorg/netnet.studio/issues) on this repo or send us an email: hi@netizen.org -- if you'd like to contribute edits to the project yourself check out our [contributors guide](../developers) - -- if you're an educator teaching web art/design coding courses for creatively inclined individuals and want to help us improve netnet by providing feedback/thoughts/examples or please reach out so we can chat about what that can look like: hi@netizen.org - -- netizen.org is a 501(c)3 tax deductible organization, so you might consider making a donation! We're working on setting up multiple avenues for financial contributions alongside our official launch this summer 2025, but for now you can make donations to the org using our [donorbox](https://donorbox.org/netizen) account or get in touch if you'd like to help support netnet.studio directly: hi@netizen.org +### How can institutions support? +**TODO**: *needs updating!!!* ### Testimonials @@ -48,3 +34,10 @@ Students have also responded overwhelmingly positive in anonymous evaluations, s > I found that the interactive nature of the NetNet.Studio tutorials really helped reinforce my understanding of the material. Being able to experiment with code in real–time and immediately see the results made the learning process more engaging and hands–on. Instead of just passively watching a video or reading through instructions, I was actively writing and adjusting code, which helped solidify key concepts. > My favorite aspect of this course (and the one that contributed the most to my learning) was NetNet! I loved the lectures, tutorials, etc. There's limitless information to be found/explored on that website. HTML and CSS were explained in a way that was thorough and easily accessible. + +### Initial Supporters + +The inital BETA versions of netnet were made possible thanks to financial support from the Clinic for Open Source Arts, the Contemporary Practices Department at the School of the Art Institute of Chicago and Media Arts and Design at the University of Chicago. + +| [![cosa](../images/cosa.png)](http://clinicopensourcearts.com/) | [![saic](../images/saic.png)](https://www.saic.edu/academics/departments/contemporary-practices) | [![uchicago](../images/uchicago.png)](https://cms.uchicago.edu/undergraduate/major-minor/minor-media-arts-and-design) | +|:---:|:---:|:---:| diff --git a/docs/educators/index.html b/docs/educators/index.html index 41d28b4..4bdc5b8 100644 --- a/docs/educators/index.html +++ b/docs/educators/index.html @@ -11,7 +11,28 @@
@@ -34,6 +55,8 @@

Dear Educators,

+ + diff --git a/docs/images/convo-ex1.png b/docs/images/convo-ex1.png new file mode 100644 index 0000000000000000000000000000000000000000..58e4f843a97d4c1ddfeb8a6a789b81daa8b122a6 GIT binary patch literal 44235 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⪻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%0D64yR)@B-EPvYhK4{m(b!u>43dtT3$g~@ED+PfuL zk|QdvjvkR7-`RNw)zI=}Q>NJ1efvm_6WqBV&ONS%Q1&flo+Zlw2Kc(R0fxR+dTQD< zo<)YCK7_;9Y9$-8J2uRwhO0$43f&h%yvT&3dN7=O@W<2$bEr)uSm$MEa;{Zt$ynDd z!GE;yz-7*2KhmHuXXuvTphMgger%2Wu`3;D*4d|qLj)$^g2t<%Iy~M|%4uREx5Y`} z-}S?05}karLVG1@d|DJs|*_h^tFxt+iS*6)n6Rky+qpJT!VFhj@%Iu5;`7#3%(` zj#C#|RA3)Q?p-Q;GUaLlkE(`C(5IEkaaJ&@ORu?`MiVTZ_e7{M7@bKz z`h4=m;^)Zpb56qqZmawR3w@UaaH@jxbm#}*yrspc-Y)_`;uX_Hl+vm-Lmnpi0_W-B zPbvh8CgNTW@hF?Fu9zrRB4slBSYGE3D{ILYi>S-qTsuvz9QM);@!H1GnI6LO zJ_1%OFS#~CBCb{1V=zPK_IWc$zY591fr$8v-2Q?$na!B*p5fRRXu_IGXcnPYZ^-Ha zgTxZc5V*@?5>aBVyaBi$lqi#Hadx9BlUoKxShytcP%Ho2!a5kNLZR%JrXF8T3ueLe zSD!1i?vkG&`z3($u`tak=^cFPa8o`Nwr~&zj%Tj5%l-gbl!_EuBtRW_)A(GK2Opa~P8a5p+M0rA28H`n1k;cPC0(2^9I zCo#FQ@N>Cj3(&RRZH;YxfnmaF9CFv8DaP^$}P!;T?cO zt(%AuBgmR@Pk$T*amW9%(IO(GF2?>XK}3-n1W>U!#=fTnVH}l3RPCR$f?^cuBA{cv zpN~mNKw zC4BvDj!Qx%+B;3l&(>o;L=!Bt-D6m>DTt?6A-dcVC*+Gq;?+OpLljf0m~mFN+gj?h zgB~@jyDm}m{~QRUBLE?fB}0eqVI1+f(DAfC)D4}Og+Bis2NKrO-KoS_1Im{x1HCP; z>tt{XasE3>mmmf}B=`kUmvST}s9(T=!q;>JN(x1>u%UlC*53-w#|EMT&5k|}{(;hi mZ24jOi2we#YD9`#Pbdu

netnet.studio is an open-source hypermedia cyberspace for fully realizing the Web’s creative potential.

-

Our goal is to help artists, designers and other DIY makers reclaim the Internet as a hand-crafted space for self-expression and connection. Through interactive learning and experimental play with the medium itself, netnet aims to guide you in your journey from absolute beginner to creative code virtuoso!

- -

Help Support Us!

-
+ + diff --git a/docs/students/index.html b/docs/students/index.html index 9c06661..e0dabba 100644 --- a/docs/students/index.html +++ b/docs/students/index.html @@ -11,7 +11,28 @@
@@ -36,6 +57,8 @@

Dear Students,

+ + From e1a52088ecd0e144f65a6767cec25f9056b90d5d Mon Sep 17 00:00:00 2001 From: nbriz Date: Tue, 5 Aug 2025 16:03:56 -0500 Subject: [PATCH 5/6] reformatted homepage --- docs/README.md | 10 ++++------ docs/index.html | 9 ++++----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/docs/README.md b/docs/README.md index 4f7ee1e..5f6785c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,17 +11,15 @@ netnet's goal is to guide creatives in their journey, from curious beginners to netnet.studio is a free/libre open-source project please consider supporting it to keep it alive!

-# What is netnet.studio? +# Meet netnet ( ◕ ◞ ◕ ) -### Your Guide - -When you visit netnet.studio you'll be greeted by a friendly artificial intelligence teaching assistant (AI-TA) named netnet! ( ◕ ◞ ◕ ) As an AI-TA, netnet supports students of the Web by explaining code fragments, encouraging best practices, and correcting common mistakes. However, in these AI-times it's worth clarifying that netnet is not a "large language model" or any other kind of "machine learning", *it* (preferred pronoun) is a human-authored *classical AI* system, less like a corporate chat bot and more like the AI in a retro video game. Every word has been carefully considered and written by humans (that's us), therefore netnet will never "hallucinate" nor will it write all your code for you (though it will help with a snippet here or there). +When you visit netnet.studio you'll be greeted by a friendly artificial intelligence teaching assistant (AI-TA) named netnet! As an AI-TA, netnet supports students of the Web by explaining code fragments, encouraging best practices, and correcting common mistakes. However, in these AI-times it's worth clarifying that netnet is not a "large language model" or any other kind of "machine learning", *it* (preferred pronoun) is a human-authored *classical AI* system, less like a corporate chat bot and more like the AI in a retro video game. Every word has been carefully considered and written by humans (that's us), therefore netnet will never "hallucinate" nor will it write all your code for you (though it will help with a snippet here or there). We're not entirely opposed to LLMs, we believe there's lots of unexplored possibilities in the ethical and artistic application of "artificial neural networks" (we're currently working on creative AI/LLM literacy tools and lessons). However, we do feel that the way they're currently being integrated into coding tools is designed more for "people who think to make" (folks with ideas they want someone or some*thing* to make for them) and less for those who "make to think", meaning those of us who discover, learn and grow our creative ideas through the process of making and writing code ourselves. **If you're an aspiring student of the creative web, [start here](students/README.md)!** -### The Platform +# The Platform The [first web browser](https://www.youtube.com/watch?v=3c3Rt6QbHDw) was both a tool for exploring the web and creating it. The first browsers were all research projects created in labs and universities, but when enterprising technologists saw its commercial potential they removed the "editor" part and left only the "browser" part. netnet brings the "editor" back into the "browser", where it was always meant to be. @@ -31,7 +29,7 @@ Unlike most web-based products of [surveillance capitalism](https://www.youtube. **If you're an educator interested in leveraging the platform in your classroom, [start here](educators/README.md)!** -### Our Mission +# Our Mission What begun as a research project in computer networking in the late 1960s slowly grew into a globally distributed network of networks called the the *Inter*net. For the first couple of decades, using the Internet meant reading and typing into text-only displays. That is until the early 1990s, when a small group of scientists, taking inspiration from an experimental [media art/tech scene](https://archive.org/details/HyperlandBBSDouglasAdamsAndTomBaker1990), added a "hypertext" and "multi-media" interface called the World Wide Web. Like the physical infrastructure it was built on (the Internet) the Web reflected a set of values which enabled it to grow far beyond its inventors wildest dreams! diff --git a/docs/index.html b/docs/index.html index 2fc0275..6497ed8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -48,17 +48,16 @@

netnet.studio is an open-source hypermedia cyberspace for fully realizing th netnet.studio is a free/libre open-source project please consider supporting it to keep it alive!

-

What is netnet.studio?

-

Your Guide

-

When you visit netnet.studio you'll be greeted by a friendly artificial intelligence teaching assistant (AI-TA) named netnet! ( ◕ ◞ ◕ ) As an AI-TA, netnet supports students of the Web by explaining code fragments, encouraging best practices, and correcting common mistakes. However, in these AI-times it's worth clarifying that netnet is not a "large language model" or any other kind of "machine learning", it (preferred pronoun) is a human-authored classical AI system, less like a corporate chat bot and more like the AI in a retro video game. Every word has been carefully considered and written by humans (that's us), therefore netnet will never "hallucinate" nor will it write all your code for you (though it will help with a snippet here or there).

+

Meet netnet ( ◕ ◞ ◕ )

+

When you visit netnet.studio you'll be greeted by a friendly artificial intelligence teaching assistant (AI-TA) named netnet! As an AI-TA, netnet supports students of the Web by explaining code fragments, encouraging best practices, and correcting common mistakes. However, in these AI-times it's worth clarifying that netnet is not a "large language model" or any other kind of "machine learning", it (preferred pronoun) is a human-authored classical AI system, less like a corporate chat bot and more like the AI in a retro video game. Every word has been carefully considered and written by humans (that's us), therefore netnet will never "hallucinate" nor will it write all your code for you (though it will help with a snippet here or there).

We're not entirely opposed to LLMs, we believe there's lots of unexplored possibilities in the ethical and artistic application of "artificial neural networks" (we're currently working on creative AI/LLM literacy tools and lessons). However, we do feel that the way they're currently being integrated into coding tools is designed more for "people who think to make" (folks with ideas they want someone or something to make for them) and less for those who "make to think", meaning those of us who discover, learn and grow our creative ideas through the process of making and writing code ourselves.

If you're an aspiring student of the creative web, start here!

-

The Platform

+

The Platform

The first web browser was both a tool for exploring the web and creating it. The first browsers were all research projects created in labs and universities, but when enterprising technologists saw its commercial potential they removed the "editor" part and left only the "browser" part. netnet brings the "editor" back into the "browser", where it was always meant to be.

Unlike most web-based products of surveillance capitalism (the dominant business model of big tech today) netnet.studio is not here to collect and profit off your data. The studio is carefully designed to be a privacy-focused safe space for creative experimentation (You can read our privacy policy at the studio). While netnet is modeled on modern code editors and does integrate with other third party tools like GitHub (for the purpose of teaching others the conventions and tooling of the day) we go to great lengths to make this all secure and extremely transparent while remaining accessible.

TODO update privacy-policy dev link to main link before pushing to main

If you're an educator interested in leveraging the platform in your classroom, start here!

-

Our Mission

+

Our Mission

What begun as a research project in computer networking in the late 1960s slowly grew into a globally distributed network of networks called the the Internet. For the first couple of decades, using the Internet meant reading and typing into text-only displays. That is until the early 1990s, when a small group of scientists, taking inspiration from an experimental media art/tech scene, added a "hypertext" and "multi-media" interface called the World Wide Web. Like the physical infrastructure it was built on (the Internet) the Web reflected a set of values which enabled it to grow far beyond its inventors wildest dreams!

Today, the Web's core values of openness, transparency, decentralization, accessibility, extensibility and interoperability have been slowly eroded by the profit-motives of greedy tech corporations which have colonized and privatized what was once an entirely a public commons. This industry and its "merchants of complexity" will have you think that creating web sites and apps requires advanced skills and expensive infrastructure and that the only way to have a presence online is to either become an expert (the industry has always been guarded by a sort of "priesthood") or succumb to "posting" on their websites.

But this re-writing of history could not be farther from the truth. The Web was designed to be hand-crafted by anyone interested enough to take the time to learn a few basics and indeed, in the early days it was. While we're inspired by the hand made web of the 1990s, this project is not about nostalgia, netnet.studio encourages others to explore (and is itself created with) modern and cutting-edge web technologies. The Web has never had more creative potential and netnet.studio is a platform to help you decide what the web of tomorrow should be!

From 7a6c75d1fdb2316cd5c56ca7b9b711508e7c05b3 Mon Sep 17 00:00:00 2001 From: nbriz Date: Tue, 5 Aug 2025 16:10:08 -0500 Subject: [PATCH 6/6] fixed typo and links --- docs/README.md | 4 ++-- docs/index.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 5f6785c..7f061e4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -33,8 +33,8 @@ Unlike most web-based products of [surveillance capitalism](https://www.youtube. What begun as a research project in computer networking in the late 1960s slowly grew into a globally distributed network of networks called the the *Inter*net. For the first couple of decades, using the Internet meant reading and typing into text-only displays. That is until the early 1990s, when a small group of scientists, taking inspiration from an experimental [media art/tech scene](https://archive.org/details/HyperlandBBSDouglasAdamsAndTomBaker1990), added a "hypertext" and "multi-media" interface called the World Wide Web. Like the physical infrastructure it was built on (the Internet) the Web reflected a set of values which enabled it to grow far beyond its inventors wildest dreams! -Today, the Web's core values of openness, transparency, decentralization, accessibility, extensibility and interoperability have been slowly eroded by the profit-motives of greedy tech corporations which have colonized and privatized what was once an entirely a public commons. This industry and its "[merchants of complexity](https://world.hey.com/dhh/merchants-of-complexity-4851301b)" will have you think that creating web sites and apps requires advanced skills and expensive infrastructure and that the only way to have a presence online is to either become an expert (the industry has always been guarded by a sort of "[priesthood](https://www.newmediareader.com/book_samples/nmr-2nelson.pdf)") or succumb to "posting" on *their* websites. +Today, the Web's core values of openness, transparency, decentralization, accessibility, extensibility and interoperability have been slowly eroded by the profit-motives of greedy tech corporations which have colonized and privatized what was once an entirely public commons. This industry and its "[merchants of complexity](https://world.hey.com/dhh/merchants-of-complexity-4851301b)" will have you think that creating web sites and apps requires advanced skills and expensive infrastructure and that the only way to have a presence online is to either become an expert (the industry has always been guarded by a sort of "[priesthood](https://www.newmediareader.com/book_samples/nmr-2nelson.pdf)") or succumb to "posting" on *their* websites. -But this re-writing of history could not be farther from [the truth](https://coolguy.website/introduction/). The Web was designed to be [hand-crafted](https://luckysoap.com/statements/handmadeweb.html) by anyone interested enough to take the time to learn a few basics and indeed, [in the early days it was](https://netart.rocks/files/digital-folklore.pdf). While we're inspired by the hand made web of the 1990s, this project is not about nostalgia, netnet.studio encourages others to explore (and is itself created with) modern and cutting-edge web technologies. The Web has never had more creative potential and netnet.studio is a platform to help you decide [what the web of tomorrow should be](https://laurelschwulst.com/e/my-website-is-a-shifting-house/)! +But this re-writing of history could not be farther from [the truth](https://coolguy.website/introduction/). The Web was designed to be [hand-crafted](https://luckysoap.com/statements/handmadeweb.html) by anyone interested enough to take the time to learn a few basics and indeed, [in the early days it was](https://www.youtube.com/watch?v=2LzyRcLJdlg). While we're inspired by the hand made web of the 1990s, this project is not about nostalgia, netnet.studio encourages others to explore (and is itself created with) modern and cutting-edge web technologies. The Web has never had more creative potential and netnet.studio is a platform to help you decide [what the web of tomorrow should be](https://laurelschwulst.com/e/my-website-is-a-shifting-house/)! **If you believe in our mission and what to help contribute time to the project, [start here](contributors/README.md)!** diff --git a/docs/index.html b/docs/index.html index 6497ed8..bff5b80 100644 --- a/docs/index.html +++ b/docs/index.html @@ -59,8 +59,8 @@

The Platform

If you're an educator interested in leveraging the platform in your classroom, start here!

Our Mission

What begun as a research project in computer networking in the late 1960s slowly grew into a globally distributed network of networks called the the Internet. For the first couple of decades, using the Internet meant reading and typing into text-only displays. That is until the early 1990s, when a small group of scientists, taking inspiration from an experimental media art/tech scene, added a "hypertext" and "multi-media" interface called the World Wide Web. Like the physical infrastructure it was built on (the Internet) the Web reflected a set of values which enabled it to grow far beyond its inventors wildest dreams!

-

Today, the Web's core values of openness, transparency, decentralization, accessibility, extensibility and interoperability have been slowly eroded by the profit-motives of greedy tech corporations which have colonized and privatized what was once an entirely a public commons. This industry and its "merchants of complexity" will have you think that creating web sites and apps requires advanced skills and expensive infrastructure and that the only way to have a presence online is to either become an expert (the industry has always been guarded by a sort of "priesthood") or succumb to "posting" on their websites.

-

But this re-writing of history could not be farther from the truth. The Web was designed to be hand-crafted by anyone interested enough to take the time to learn a few basics and indeed, in the early days it was. While we're inspired by the hand made web of the 1990s, this project is not about nostalgia, netnet.studio encourages others to explore (and is itself created with) modern and cutting-edge web technologies. The Web has never had more creative potential and netnet.studio is a platform to help you decide what the web of tomorrow should be!

+

Today, the Web's core values of openness, transparency, decentralization, accessibility, extensibility and interoperability have been slowly eroded by the profit-motives of greedy tech corporations which have colonized and privatized what was once an entirely public commons. This industry and its "merchants of complexity" will have you think that creating web sites and apps requires advanced skills and expensive infrastructure and that the only way to have a presence online is to either become an expert (the industry has always been guarded by a sort of "priesthood") or succumb to "posting" on their websites.

+

But this re-writing of history could not be farther from the truth. The Web was designed to be hand-crafted by anyone interested enough to take the time to learn a few basics and indeed, in the early days it was. While we're inspired by the hand made web of the 1990s, this project is not about nostalgia, netnet.studio encourages others to explore (and is itself created with) modern and cutting-edge web technologies. The Web has never had more creative potential and netnet.studio is a platform to help you decide what the web of tomorrow should be!

If you believe in our mission and what to help contribute time to the project, start here!